SpringMVC - 类型转换 - 数据格式化 -数据校验
类型转换
ConversionService 是 Spring 类型转换体系的核心接口。
• 可以利用 ConversionServiceFactoryBean 在 Spring 的 IOC 容器中定义一个 ConversionService. Spring 将自动识别出IOC 容器中的 ConversionService,并在 Bean 属性配置及Spring MVC 处理方法入参绑定等场合使用它进行数据的转换
• 可通过 ConversionServiceFactoryBean 的 converters 属性注册自定义的类型转换器
spring自带一些常见的类型转换器
1.编写自定义类型转换器(实现Converter接口)
import org.springframework.core.convert.converter.Converter;
public class MyConverter implements Converter<String,Person>{
@Override
public Person convert(String source) {
//接收前端传来的String 并转为 自定义类型
return new person(source);
}
2.将MyConverter加入到springmvc中
<!-- 1.将自定义转换器纳入SpringIOC中 -->
<bean id = "myConverter" class = "converter.MyConverter"></bean>
<!-- 2.将myConverter在纳入springMVC 提供的转换器bean中-->
<bean id = "conversionService" class = "org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<ref bean = "myConverter"/>
</set>
</property>
</bean>
<!--3.将conversionService注册到annotation-driver -->
<mvc:annotation-driven conversion-service = "conversionService"></mvc:annotation-driven>
3.使用转换器
@RequestMapping("xxx")
public String converter(@RequestParam("upersoninfoString") person person)//前端传入的使String,接收的使person类型的参数,类型自动转换
......
}
@RequestParam 是触发转换器的桥梁,接收的数据是前端传来的String 但是需要将数据 赋给 目标的对象的类型为Person
关于 mvc:annotation-driven
• <mvc:annotation-driven /> 会自动注 册RequestMappingHandlerMapping、RequestMappingHandlerAdapter 与ExceptionHandlerExceptionResolver 三个bean。
• 还将提供以下支持:
– 支持使用 ConversionService 实例对表单参数进行类型转换
– 支持使用 @NumberFormat annotation、@DateTimeFormat注解完成数据类型的格式化
– 支持使用 @Valid 注解对 JavaBean 实例进行 JSR 303 验证
– 支持使用 @RequestBody 和 @ResponseBody 注解
数据格式化
• 对属性对象的输入/输出进行格式化,从其本质上讲依然属于 “类型转换” 的范畴。
• Spring 在格式化模块中定义了一个实现ConversionService 接口的FormattingConversionService 实现类,该实现类扩展 了 GenericConversionService,因此它既具有类型转换的功能,又具有格式化的功能
• FormattingConversionService 拥有一个FormattingConversionServiceFactroyBean 工厂类,后者用于在 Spring 上下文中构造前者数据格式化
• FormattingConversionServiceFactroyBean 内部已经注册了 :
– NumberFormatAnnotationFormatterFactroy:支持对数字类型的属性使用 @NumberFormat 注解
– JodaDateTimeFormatAnnotationFormatterFactroy:支持对日期类型的属性使用 @DateTimeFormat 注解
• 装配了 FormattingConversionServiceFactroyBean 后,就可以在 Spring MVC 入参绑定及模型数据输出时使用注解驱动了。
<mvc:annotation-driven/> 默认创建的ConversionService 实例即为
FormattingConversionServiceFactroyBean
SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd hh:mm:ss”)
SpringMVC提供了很多注解,方便我们数据格式化
实现步骤:
1.配置
<!-- 配置数据格式化 注解所依赖的bean -->
<bean id = "conversionServiceFactory" class ="org.springframework.format.support.FormattingConversionServiceFactoryBean"></bean>
2.通过注解使用
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date brithday;//2019.10.20
tip:
ConversionServiceFactoryBean
FormattingConversionServiceFactoryBean
FormattingConversionServiceFactoryBean中包含ConversionServiceFactoryBean如果要配置类型转换器和数据格式化,只要配FormattingConversionServiceFactoryBean即可,将需要的参数放入其中
<bean id = "conversionService" class ="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<set>
<ref bean = "myConverter"/>
</set>
</property>
</bean>
@DateTimeFormat 注解可对java.util.Date、java.util.Calendar、java.long.Long 时间
类型进行标注
@NumberFormat 可对类似数字类型的属性进行标 注,它拥有两个互斥的属性:
– style:类型为 NumberFormat.Style。用于指定样式类型,包括三种:Style.NUMBER(正常数字类型)、
Style.CURRENCY(货币类型)、 Style.PERCENT(百分数类型)
– pattern:类型为 String,自定义样式,如patter="#,###";
错误消息
public String testDataFormat(Person person, BindingResult result, Map<String,Object> map)需要验证的数据是person中的Date,SpringMVC要求 如果校验失败,则将错误信息自动放入该对象之后紧接着的BindingResult中 即person 与 BindingResult之间不能有其他参数
如果需要在jsp中显示错误信息,则可以把错误信息放入request域中
数据校验
• JSR 303 是 Java 为 Bean 数据合法性校验提供的标准框架,它已经包含在 JavaEE 6.0 中 .
• JSR 303 通过在 Bean 属性上标注类似于 @NotNull、@Max 等标准的注解指定校验规则,并通过标准的验证接口对 Bean 进行验证
Hibernate validator 提供额外注解
Hibernate Validator 是 JSR 303 的一个参考实现,除支持所有标准的校验注解外,它还支持以下的扩展注解
• <mvc:annotation-driven/ >会默认装配好一个LocalValidatorFactoryBean,通过在处理方法的入参上标 注@valid 注解即可让 Spring MVC 在完成数据绑定后执行数据校验的工作
• 在已经标注了 JSR303 注解的表单/命令对象前标注一个@Valid,Spring MVC 框架在将请求参数绑定到该入参对象后,就会调用校验框架根据注解声明的校验规则实施校验
• Spring MVC 是通过对处理方法签名的规约来保存校验结果的:
前一个表单/命令对象的校验结果保存到随后的入参中,这个保存校验结果的入参必须是 BindingResult 或Errors 类型,这两个类都位于org.springframework.validation 包中
需校验的 Bean 对象和其绑定结果对象或错误对象时成对出现的,它们 之间不允许声明其他的入参
• Errors 接口提供了获取错误信息的方法,如 getErrorCount() 或getFieldErrors(String field)
• BindingResult 扩展了 Errors 接口
在表单/命令对象类的属性中标注校验注解,在处理方法对 应的入参前添加 @Valid,Spring MVC 就会实施校验并将校验结果保存在被校验入参对象之后的 BindingResult 或Errors 入参中。
使用
1.jar
hibernate-validator.jar
classmate.jar
jboss-logging.jar
validation-api.jar
hibernate-validator-annotation-processor.jar
2.配置
<mvc:annotation-driven></mvc:annotation-driven>
3.使用注解
1.需要校验的属性加@注解(实体类)
2.在需要检验的方法参数对象前加@valid
上一篇: Maven配置教程