大家好,关于国产产乱码一二三区别免费很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于Spring MVC数据格式化与验证以及国际化和中文乱码处理的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!
SpringMVC数据格式化基本介绍说明:在我们提交数据(比如表单时)SpringMVC怎样对提交的数据进行转换和处理的
基本数据类型可以和字符串之间自动完成转换,
比如:SpringMVC上下文中内建了很多转换器,可完成大多数Java类型的转换工作。[相互转换,这里只列出部分]
ConversionServiceconverters=java.lang.Boolean->java.lang.String:org.springframework.core.convert.support.ObjectToStringConverter@f874cajava.lang.Character->java.lang.Number:CharacterToNumberFactory@f004c9java.lang.Character->java.lang.String:ObjectToStringConverter@68a961java.lang.Enum->java.lang.String:EnumToStringConverter@12f060ajava.lang.Number->java.lang.Character:NumberToCharacterConverter@1482ac5java.lang.Number->java.lang.Number:NumberToNumberConverterFactory@126c6fjava.lang.Number->java.lang.String:ObjectToStringConverter@14888e8java.lang.String->java.lang.Boolean:StringToBooleanConverter@1ca6626java.lang.String->java.lang.Character:StringToCharacterConverter@1143800java.lang.String->java.lang.Enum:StringToEnumConverterFactory@1bba86ejava.lang.String->java.lang.Number:StringToNumberConverterFactory@18d2c12java.lang.String->java.util.Locale:StringToLocaleConverter@3598e1java.lang.String->java.util.Properties:StringToPropertiesConverter@c90828java.lang.String->java.util.UUID:StringToUUIDConverter@a42f23java.util.Locale->java.lang.String:ObjectToStringConverter@c7e20ajava.util.Properties->java.lang.String:PropertiesToStringConverter@367a7fjava.util.UUID->java.lang.String:ObjectToStringConverter@112b07f…….
基本数据类型和字符串自动转换代码实例-页面演示方式需求->基本数据类型可以和字符串之间自动完成转换
创建Monster类java复制代码publicclassMonster{nprivateIntegerid;nprivateStringemail;nprivateIntegerage;nprivateStringname;nnnpublicMonster(Integerid,Stringemail,Integerage,Stringname,){nthis.id=id;nthis.email=email;nthis.age=age;nthis.name=name;nn}nnpublicMonster(){n}nnnnpublicIntegergetId(){nreturnid;n}nnpublicvoidsetId(Integerid){nthis.id=id;n}nnpublicStringgetEmail(){nreturnemail;n}nnpublicvoidsetEmail(Stringemail){nthis.email=email;n}nnpublicIntegergetAge(){nreturnage;n}nnpublicvoidsetAge(Integerage){nthis.age=age;n}nnpublicStringgetName(){nreturnname;n}nnpublicvoidsetName(Stringname){nthis.name=name;n}nn@OverridenpublicStringtoString(){nreturn"Monster{"+n"id="+id+n",email='"+email+'\''+n",age="+age+n",name='"+name+'\''+n'}';n}n}n创建data_valid.jsp
html复制代码<%@pagecontentType="text/html;charset=UTF-8"language="java"%>n<html>n<head>n<title>SpringMVC[数据格式/验证等]</title>n</head>n<body>n<h1>SpringMVC[数据格式/验证等]</h1>n<hr>n<ahref="<%=request.getContextPath()%>/addMonsterUI">添加妖怪</a>n</body>n</body>n</html>n创建MonsterHandler类
java复制代码@RequestMapping(value="/addMonsterUI")npublicStringaddMonsterUI(Map<String,Object>map){nnmap.put("monster",newMonster());nreturn"datavalid/monster_addUI";n}n创建monster_addUI.jsp
html复制代码<html>n<head>n<title>添加妖怪</title>n</head>n<body>n<h3>添加妖怪</h3>nn<form:formaction="save"method="post"modelAttribute="monster">n妖怪名字:<form:inputpath="name"/><br><br>n妖怪年龄~:<form:inputpath="age"/><br><br>n电子邮件:<form:inputpath="email"/><br><br>n<inputtype="submit"value="添加妖怪"/>n</form:form>n</body>n</html>n解读:
1.这里的表单,我们使用springMVC的标签来完成
2.SpringMVC表单标签在显示之前必须在request中有一个bean,
该bean的属性和表单标签的字段要对应!request中的key为:form标签的modelAttrite属性值,比如这里的monster
3.SpringMVC的form:form标签的action属性值中的/不代表WEB应用的根目录.
4.<form:formaction="?"method="POST"modelAttribute="monster">
这里需要给request增加一个monster,因为jsp页面的modelAttribute="monster"需要这时是springMVC的内部的检测机制即使是一个空的也需要,否则报错.
说明如果你跳转的页面使用springmvc标签就需要准备一个对象,放入request域中,这个对象的属性名monster,对应springmvc表单标签的modelAttribute="monster"
阶段测试一下继续完成功能创建success.jsphtml复制代码<%@pagecontentType="text/html;charset=UTF-8"language="java"%>n<html>n<head>n<title>添加成功</title>n</head>n<body>n<h1>恭喜,添加成功~</h1>n</body>n</html>n修改MonsterHandler.java,增加处理添加请求
编写方法,处理添加妖怪
1.springmvc可以将提交的数据,按照参数名和对象的属性名匹配
2.直接封装到对象中->前面讲解模型数据时,讲过String=>Integer
java复制代码n@RequestMapping(value="/save")npublicStringsave(Monstermonster){nSystem.out.println("----monster---"+monster);nnreturn"datavalid/success";n}n测试
浏览器:http://localhost:8080/springmvc/data_valid.jsp
1)如果age输入的是数字,则通过,说明SpringMVC可以将提交的字符串数字,比如"28",转成Integer/int
2)如果不是数字,则给出400的页面
3)如何给出对应的提示,我们后面马上讲解
-Postman完成1)如果age输入的是数字,则通过,说明SpringMVC可以将提交的字符串数字,比如"28",转成Integer/int
2)如果不是数字,则给出400的页面与上面测试一模一样
特殊数据类型和字符串间的转换应用实例-页面演示方式1.特殊数据类型和字符串之间的转换使用注解(比如日期,规定格式的小数比如货币形式
等)
2.对于日期和货币可以使用@DateTimeFormat和@NumberFormat注解.把这两个注
解标记在字段上即可
修改Monster.java,增加birthday和salary字段java复制代码publicclassMonster{nprivateIntegerid;nnnprivateStringemail;nnprivateIntegerage;nnprivateStringname;nn@DateTimeFormat(pattern="yyyy-MM-dd")nprivateDatebirthday;nn@NumberFormat(pattern="###,###.##")nprivateFloatsalary;nnpublicMonster(Integerid,Stringemail,Integerage,Stringname,Datebirthday,Floatsalary){nthis.id=id;nthis.email=email;nthis.age=age;nthis.name=name;nthis.birthday=birthday;nthis.salary=salary;n}nnpublicDategetBirthday(){nreturnbirthday;n}nnpublicvoidsetBirthday(Datebirthday){nthis.birthday=birthday;n}nnpublicFloatgetSalary(){nreturnsalary;n}nnpublicvoidsetSalary(Floatsalary){nthis.salary=salary;n}nnpublicMonster(){n}nnnnpublicIntegergetId(){nreturnid;n}nnpublicvoidsetId(Integerid){nthis.id=id;n}nnpublicStringgetEmail(){nreturnemail;n}nnpublicvoidsetEmail(Stringemail){nthis.email=email;n}nnpublicIntegergetAge(){nreturnage;n}nnpublicvoidsetAge(Integerage){nthis.age=age;n}nnpublicStringgetName(){nreturnname;n}nnpublicvoidsetName(Stringname){nthis.name=name;n}nn@OverridenpublicStringtoString(){nreturn"Monster{"+n"id="+id+n",email='"+email+'\''+n",age="+age+n",name='"+name+'\''+n",birthday="+birthday+n",salary="+salary+n'}';n}n}n修改monster_addUI,增加birthday和salary字段
html复制代码妖怪年龄~:<form:inputpath="age"/><br><br>n妖怪生日:<form:inputpath="birthday"/>要求以"9999-11-11"的形式<br><br>n妖怪工资:<form:inputpath="salary"/>要求以"123,890.12"的形式<br><br>n测试
1)如果birthday和salary是按照指定格式输入,则通过,说明SpringMVC可以按注解指定
格式转换
2)如果没有按照注解指定格式,则给出400的页面
3)如何给出对应的提示,我们后面马上讲解
验证以及国际化●概述1.对输入的数据(比如表单数据),进行必要的验证,并给出相应的提示信息。
2.对于验证表单数据,springMVC提供了很多实用的注解,这些注解由JSR303验证框架提供.
●JSR303验证框架1.JSR303是Java为Bean数据合法性校验提供的标准框架,它已经包含在JavaEE中
2.JSR303通过在Bean属性上标注类似于@NotNull、@Max等标准的注解指定校验规则,并通过标准的验证接口对Bean进行验证
3.JSR303提供的基本验证注解有:
●HibernateValidator扩展注解1.HibernateValidator和Hibernate没有关系,只是JSR303实现的一个扩展.
2.HibernateValidator是JSR303的一个参考实现,除支持所有标准的校验注解外,它还支持以下的扩展注解:
3.扩展注解有如下
使用实例-代码实现上面的需求引入验证和国际化相关的jar包修改Monster.javajava复制代码n@Range(min=1,max=100)nprivateIntegerage;n//@NotEmpty表示name不能为空n//Assertsthattheannotatedstring,collection,maporarrayisnot{@codenull}orempty.n@NotEmptynprivateStringname;n修改MonsterHandler.java@ValidMonstermonster:表示对monster接收的数据进行校验Errorserrors表示如果校验出现错误,将校验的错误信息保存errorsMap<String,Object>map表示如果校验出现错误,将校验的错误信息保存map同时保存monster对象校验发生的时机:在springmvc底层,反射调用目标方法时,会接收到http请求的数据,然后根据注解来进行验证在验证过程中,如果出现了错误,就把错误信息填充errors和map
java复制代码n@RequestMapping(value="/save")npublicStringsave(@ValidMonstermonster,Errorserrors,Map<String,Object>map){nSystem.out.println("----monster---"+monster);n//我们为了看到验证的情况,我们输出map和errorsnSystem.out.println("=====map======");nfor(Map.Entry<String,Object>entry:map.entrySet()){nSystem.out.println("key="+entry.getKey()+"value="+entry.getValue());n}nnSystem.out.println("=====errors======");nif(errors.hasErrors()){//判断是否有错误nList<ObjectError>allErrors=errors.getAllErrors();nfor(ObjectErrorerror:allErrors){nSystem.out.println("error="+error);n}nreturn"datavalid/monster_addUI";n}nreturn"datavalid/success";n}n---这里可以测试一下,看看效果----配置国际化文件springDispatcherServlet-servlet.xml
XML复制代码<!--配置国际化错误信息的资源处理bean-->n<beanid="messageSource"class=n"org.springframework.context.support.ResourceBundleMessageSource">n<!--配置国际化文件名字n如果你这样配的话,表示messageSource回到src/i18nXXX.properties去读取错误信息n-->n<propertyname="basename"value="i18n"></property>n</bean>n创建国际化文件i18n.properties
这是Unicode码不知道也没有关系可以百度搜索转换工具就好了因为直接输入中文可能会导致乱码或者解析所以这里使用Unicode
XML复制代码NotEmpty.monster.name=\u7528\u6237\u540d\u4e0d\u80fd\u4e3a\u7a7antypeMismatch.monster.age=\u5e74\u9f84\u8981\u6c42\u5728\u0031\u002d\u0031\u0035\nu0030\u4e4b\u95f4ntypeMismatch.monster.birthday=\u751f\u65e5\u683c\u5f0f\u4e0d\u6b63\u786entypeMismatch.monster.salary=\u85aa\u6c34\u683c\u5f0f\u4e0d\u6b63\u786en修改monster_addUI.jsp,回显错误信息
html复制代码<form:formaction="save"method="post"modelAttribute="monster">n妖怪名字:<form:inputpath="name"/><form:errorspath="name"/><br><br>n妖怪年龄~:<form:inputpath="age"/><form:errorspath="age"/><br><br>n电子邮件:<form:inputpath="email"/><form:errorspath="email"/><br><br>n妖怪生日:<form:inputpath="birthday"/><form:errorspath="birthday"/>要求以"9999-11-11"的形式<br><br>n妖怪薪水:<form:inputpath="salary"/><form:errorspath="salary"/>要求以"123,890.12"的形式<br><br>n<inputtype="submit"value="添加妖怪"/>n</form:form>n</body>n</html>n完成测试细节说明和注意事项
1.在需要验证的Javabean/POJO的字段上加上相应的验证注解.
2.目标方法上,在JavaBean/POJO类型的参数前,添加@Valid注解.告知SpringMVC该bean是需要验证的
3.在@Valid注解之后,添加一个Errors或BindingResult类型的参数,可以获取到验证的错误信息
4.需要使用<form:errorspath="email"></form:errors>标签来显示错误消息,这个标签,需要写在<form:form>标签内生效.
5.错误消息的国际化文件i18n.properties,中文需要是Unicode编码,使用工具转码.
√格式:验证规则.表单modelAttribute值.属性名=消息信息
√NotEmpty.monster.name=\u540D\u5B57\u4E0D\u80FD\u4E3A\u7A7A
√typeMismatch.monster.age=\u7C7B\u578B\u4E0D\u5339\u914D
5.注解@NotNull和@NotEmpty的区别说明
1)查看源码可以知道:@NotEmptyAssertsthattheannotatedstring,collection,maporarrayisnot{@codenull}orempty.
2)查看源码可以知道:@NotNull*Theannotatedelementmustnotbe{@codenull}.*Acceptsanytype.
3)解读:如果是字符串验证空,建议使用@NotEmpty
6.SpingMVC验证时,会根据不同的验证错误,返回对应的信息
注解的结合使用●问题提出,age没有,是空的,提交确是成功了
●解决方案注解组合使用使用@NotNull+@Range组合使用解决java复制代码publicclassMonster{nprivateIntegerid;nn//email是string,使用@NotEmptyn@NotEmptynprivateStringemail;nn//@Range(min=1,max=100)n//表示接收的age值,在1-100之间nn@NotNull(message="age不能为空")n@Range(min=1,max=100)nprivateIntegerage;n//@NotEmpty表示name不能为空n//Assertsthattheannotatedstring,collection,maporarrayisnot{@codenull}orempty.n@NotEmptynprivateStringname;nn@NotNull(message="生日不能为空")n@DateTimeFormat(pattern="yyyy-MM-dd")nprivateDatebirthday;nn@NotNull(message="薪水不能为空")n@NumberFormat(pattern="###,###.##")nprivateFloatsalary;nnpublicMonster(Integerid,Stringemail,Integerage,Stringname,Datebirthday,Floatsalary){nthis.id=id;nthis.email=email;nthis.age=age;nthis.name=name;nthis.birthday=birthday;nthis.salary=salary;n}nnpublicDategetBirthday(){nreturnbirthday;n}nnpublicvoidsetBirthday(Datebirthday){nthis.birthday=birthday;n}nnpublicFloatgetSalary(){nreturnsalary;n}nnpublicvoidsetSalary(Floatsalary){nthis.salary=salary;n}nnpublicMonster(){n}nnnnpublicIntegergetId(){nreturnid;n}nnpublicvoidsetId(Integerid){nthis.id=id;n}nnpublicStringgetEmail(){nreturnemail;n}nnpublicvoidsetEmail(Stringemail){nthis.email=email;n}nnpublicIntegergetAge(){nreturnage;n}nnpublicvoidsetAge(Integerage){nthis.age=age;n}nnpublicStringgetName(){nreturnname;n}nnpublicvoidsetName(Stringname){nthis.name=name;n}nn@OverridenpublicStringtoString(){nreturn"Monster{"+n"id="+id+n",email='"+email+'\''+n",age="+age+n",name='"+name+'\''+n",birthday="+birthday+n",salary="+salary+n'}';n}n}n测试
这时age不能为空,同时必须是1-100,(也不能输入haha,hello等不能转成数字的内容)
数据类型转换校验核心类-DataBinder●DataBinder工作机制-了解图例SpringMVC通过反射机制对目标方法进行解析,将请求消息绑定到处理方法的入参中。
数据绑定的核心部件是DataBinder,运行机制如下
-Debug一下validate得到验证errors
流程先进行数据类型的转换如果发送错误直接放到BindingResult
在进行数据校验如果出错了就继续放入
最后放到error和map中显示输出
取消某个属性的绑定说明在默认情况下,表单提交的数据都会和pojo类型的javabean属性绑定,如果程序员在开发中,希望取消某个属性的绑定,也就是说,不希望接收到某个表单对应的属性的值,则可以通过@InitBinder注解取消绑定.
1.编写一个方法,使用@InitBinder标识的该方法,可以对WebDataBinder对象进行初始化。WebDataBinder是DataBinder的子类,用于完成由表单字段到JavaBean属性的绑定
2.@InitBinder方法不能有返回值,它必须声明为void。
3.@InitBinder方法的参数通常是是WebDataBinder
●案例-不希望接收怪物的名字属性修改MonsterHandler.java
java复制代码@InitBindernpublicvoidinitBinder(WebDataBinderwebDataBinder){n//测试完,记得注销了.nwebDataBinder.setDisallowedFields("name");n}n
解读
1.方法上需要标注@InitBinderspringmvc底层会初始化WebDataBinder
2.调用webDataBinder.setDisallowedFields("name")表示取消指定属性的绑定即:当表单提交字段为name时,就不在把接收到的name值,填充到model数据的monster的name属性
3.机制:springmvc在底层通过反射调用目标方法时,接收到http请求的参数和值,使用反射+注解技术取消对指定属性的填充
4.setDisallowedFields支持可变参数,可以填写多个字段
5.如果我们取消某个属性绑定,验证就没有意义了,应当把验证的注解去掉,name属性会使用默认值null
一般来说,如果不接收表单字段提交数据,则该对象字段的验证也就没有意义了可以注销掉,比如注销//@NotEmpt
修改Monster.java中文乱码处理自定义中文乱码过滤器●说明当表单提交数据为中文时,会出现乱码,我们来解决一下(提示:先恢复name属性的绑定)
创建过滤器MyCharacterFilterjava复制代码publicclassMyCharacterFilterimplementsFilter{n@Overridenpublicvoidinit(FilterConfigfilterConfig)throwsServletException{nn}nn@OverridenpublicvoiddoFilter(ServletRequestservletRequest,nServletResponseservletResponse,nFilterChainfilterChain)throwsIOException,ServletException{n//这里加入对编码的处理nservletRequest.setCharacterEncoding("utf-8");n//放行请求,这个规则和前面讲过的javaweb的过滤器一样nfilterChain.doFilter(servletRequest,servletResponse);nn}nn@Overridenpublicvoiddestroy(){nn}n}n配置web.xml,将该过滤器配置在最前
XML复制代码<!--配置处理中文乱码的过滤器n拦截所有请求,处理编码,提醒,把过滤器配置到web.xml前面n-->n<filter>n<filter-name>MyCharacterFilter</filter-name>n<filter-class>com.wyxdu.web.filter.MyCharacterFilter</filter-class>n</filter>n<filter-mapping>n<filter-name>MyCharacterFilter</filter-name>n<url-pattern>/*</url-pattern>n</filter-mapping>n完成测试Spring提供的过滤器处理中文
XML复制代码<!--配置处理中文乱码的过滤器n拦截所有请求,处理编码,提醒,把过滤器配置到web.xml前面n-->n<!--<filter>-->n<!--<filter-name>MyCharacterFilter</filter-name>-->n<!--<filter-class>com.wyxdu.web.filter.MyCharacterFilter</filter-class>-->n<!--</filter>-->n<!--<filter-mapping>-->n<!--<filter-name>MyCharacterFilter</filter-name>-->n<!--<url-pattern>/*</url-pattern>-->n<!--</filter-mapping>-->nnn<!--配置Spring提供的过滤器,解决中文乱码问题-->nn<filter>n<filter-name>CharacterEncodingFilter</filter-name>n<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>n<init-param>n<param-name>encoding</param-name>n<param-value>utf-8</param-value>n</init-param>n</filter>n<filter-mapping>n<filter-name>CharacterEncodingFilter</filter-name>n<url-pattern>/*</url-pattern>n</filter-mapping>n完成测试
SpringMVC数据格式化与验证以及国际化和中文乱码处理
OK,关于国产产乱码一二三区别免费和Spring MVC数据格式化与验证以及国际化和中文乱码处理的内容到此结束了,希望对大家有所帮助。
本文由欣欣吧手游攻略栏目发布,感谢您对欣欣吧的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人站长或者朋友圈,但转载请说明文章出处“国产产乱码一二三区别免费”