数据格式化
对属性对象的输入/输出进行格式化(告诉后端前端页面是以什么格式书写属性的),如果请求的数据格式不是后端标识的格式则后端不能识别,将会报400请求错误,因为服务器无法解析请求(看不懂请求),从其本质上讲属于”类型转换”范畴。
Spring 在格式化模块中定义了一个实现ConversionService接口的FormattingConversionService实现类,该类扩展了GenericConversionService,因此它既具有类型转换的功能,又具有格式化的功能
FormattingConversionService 拥有一个 FormattingConversionServiceFactroyBean 工厂类,后者用于在 Spring 上下文中构造前者
FormattingConversionServiceFactroyBean 内部已经注册了 :
NumberFormatAnnotationFormatterFactroy:支持对数字类型的属性使用 @NumberFormat 注解
JodaDateTimeFormatAnnotationFormatterFactroy:支持对日期类型的属性使用 @DateTimeFormat 注解
装配了 FormattingConversionServiceFactroyBean 后,就可以在 Spring MVC 入参绑定及模型数据输出时使用注解驱动了。mvc:annotation-driven/ 默认创建的
ConversionService 实例即为
FormattingConversionServiceFactroyBean
日期格式化
@DateTimeFormat注解可对Date,Calendar,java.long.Long时间类型进行标注
pattern 属性:类型为字符串。指定解析/格式化字段数据的模式,如:”yyyy-MM-dd hh:mm:ss”
iso 属性:类型为 DateTimeFormat.ISO。指定解析/格式化字段数据
的ISO模式,包括四种:ISO.NONE(不使用) – 默
认、ISO.DATE(yyyy-MM-dd) 、ISO.TIME(hh:mm:ss.SSSZ)、
ISO.DATE_TIME(yyyy-MM-dd hh:mm:ss.SSSZ)style 属性:字符串类型。通过样式指定日期时间的格式,由两位字
符组成,第一位表示日期的格式,第二位表示时间的格式:S:短日
期/时间格式、M:中日期/时间格式、L:长日期/时间格式、F:完整
日期/时间格式、-:忽略日期或时间格式
数值格式化
@NumberFormat 可对类似数字类型的属性进行标注,它拥有两个互斥的属性:
style:类型为 NumberFormat.Style。用于指定样式类型,包括三种:Style.NUMBER(正常数字类型)、
Style.CURRENCY(货币类型)、 Style.PERCENT(
百分数类型)pattern:类型为 String,自定义样式,如patter=”#,###”;
例子:
1
2
3
4
5
6
7
8
9@DateTimeFormat(pattern="yyyy-MM-dd")
private Date birth;
@NumberFormat(pattern="#,###,###.#")
private Float salary;
public Integer getId() {
return id;
}
数据校验(JSR303)
JSR 303 是 Java 为 Bean 数据合法性校验提供的标准框架,它已经包含在 JavaEE 6.0 中
JSR 303 通过在 Bean 属性上标注类似于@NotNull、@Max 等标准的注解指定校验规则,并通过标准的验证接口对 Bean 进行验证
JSR303注解:

- 使用 直接将注解加到Java bean中的某个要校验的属性上就行,但是也要在目标方法那个bean 类型前面加上@Valid注解,注意:需要校验数据的bean对象总是和其绑定结果对象或错误对象成对出现,他们之间不允许放入其他入参(他们要连在一起)
数据绑定流程
- Spring MVC 通过反射机制对目标处理方法进行解析,将请求消息绑定到处理方法的入参中。数据绑定的核心部件是DataBinder,运行机制如下:

所以说当进行数据格式化和数据校验时,最后如果是错误的,错误结果会存到BindingResult对象里面,它其实是个Errors对象,因为它继承了Errors

代码例子:
1 | //COntroller层 |