Day63
数据转化
数据绑定期间的数据格式转化问题? 比如提交的日期转换
数据校验:
前端校验:JS+正则表达式
后端校验:重要的数据也是必须后端校验。
ConversionService组件进行数据类型转化、数据格式化
Vaildator组件进行数据合法性检验,并最终生成数据绑定结果BindingData对象
BindingResult对产生的结果进行保存。
实现功能1:自定义类型转换
步骤:
1、ConversionService:接口
它里面有Convertor(转换器)进行工作。
1)、实现Converter接口,写一个自定义的类型转换器。
2)、写好的Converter放进ConversionService中。
将WebDataBinder中的ConversionService设置成外面加了自定义类型转换器的ConverService
3)、配置出ConversionService
<!--告诉SpringMVC别用默认的ConversionService,用我们自定义的-->
<bean id ="conversion" class="org.springframework.context.support.ConversionServiceFactoryBean">
<!--converts转换器中添加我们的自定义的类型转换器-->
<property name="converters" >
<set>
<bean class="com.sorrymaker.component.MyStringToEmployeeConverter"/>
</set>
</property>
</bean>
4)、让SpringMVC用我们的ConversionService
<!--conversionService,使用我们自己配置的类型转换组件,别用Springmvc里面的 -->
<mvc:annotation-driven conversion-service="conversion"></mvc:annotation-driven>
总结:
1、实现Converter接口,做一个自定义类型转换器。
2、将这个Converter配置在ConversionService中。
3、告诉SpringMVC使用我们的ConversionService。
mvc:anntation-driven
解析这个大小要添加很多东西。(开挂了)
只要请求不好使就召唤mvc:annotation-driven
<mvc:default-servlet-handler/>,和 <mvc:annotation-driven/>。
1)都没配置。动态资源(@RequestMapping映射的资源能访问,静态资源(html,js,img)不能访问
动态资源:DefaultAnnotationHandleMapping中的HandleMapping中保存了每一个资源的映射信息
静态资源:handlerMap中没有保存静态资源映射的请求
handlerAdapter:方法执行适配器
AnnotationMethodHandlerAdapter:帮我们执行目标方法;(过时了,现在好像不用了)
2)加上<mvc:default-servlet-handler/>,不加 <mvc:annotation-driven/>。静态资源ok,动态资源拉闸
这里没有保存defaultAnnotationHandleMapping,把所有请求通过SimpleUrlHandleMapping给tomcat处理。
静态能访问的原因:SimpleUrlHandleMapping把所有请求映射给tomcat处理。
没有了AnnotationMethodHandlerAdapter,执行不了目标方法了。
3)加上<mvc:default-servlet-handler/>, <mvc:annotation-driven/>两个都加。静态动态资源都可以访问
RequestMappingHandleMapping 有这个和SimpleUrlHandleMapping。所以静态动态资源都可以访问了。
原来的AnnotationMethodHandlerAdapter被换成RequestMappingHandleAdapter。
用解析器来解析,不用一个个匹配。组件化思想。
4)只加<mvc:annotation-driven/>,静态资源不能
数据格式化
@NumberFormat()数字格式化。
页面提交的数据格式如果不正确,就是400
就@DateTimeFormat(pattern = "yyyy-MM-dd")就可以了。
ConversionServiceFactoryBean:创建的自定义的类型转换器里面没有时间格式化。所以要改这个👇👇👇👇👇👇。
<bean id ="conversion" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
这样子就可以直接加个@DateTimeFormat(pattern ="yyyy-MM-dd")就ok了。
数据检验:
只做前端校验是不安全的
在重要数据一定要加上后端验证
1、可以写程序将我们每一个数据取出进行校验,如果失败直接来到添加页面,提示其重新填写。
2、SpringMVC:可以JSR303来做数据检验
JDBC:规范----实现(各个厂商的驱动包)
JSR303:规范 ------ Hibernate Validator(第三方校验框架)
3、如何快速的进行后端校验:
1)、导入校验框架的jar包(核心包和依赖包)(带EL的jar包,tomcat有,导入后,会爆炸。)
2)、只需要给JavaBean的属性加注解。
3)、在SpringMVC封装对象的时候,告诉SpringMVC这个JavaBean需要校验。
加个@Valid,就可以了。
public String addEmp(@Valid Employee employee){
4)、如何知道校验结果
给需要校验的javaBean后面紧跟一个BindingResult。这个BindingResult就是封装前一个Bean的校验结果
5)、根据不同的校验结果决定怎么样。
国际化定制自己的错误消息显示。
当出现bug-->>>ResourceBundle [errors] not found for MessageSource: Can't find bundle for base name errors, locale zh_CN
就把ResourceBundleMessageSource---->>>>>ReloadResourceBundleMessageSource
1.编写国际化的文件
errors_zh_CN.properties
errors_en_US.properties
2.让SpringMVC管理国际化资源文件。
<!--管理国际化资源文件 -->
<bean id = "messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="errors"></property>
</bean>
3.来到页面取值。
小知识

浙公网安备 33010602011771号