SpringMVC——数据格式化与数据校验

数据格式化

  • 对属性对象的输入/输出进行格式化(告诉后端前端页面是以什么格式书写属性的),如果请求的数据格式不是后端标识的格式则后端不能识别,将会报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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
   //COntroller层
@RequestMapping(value="/emp", method=RequestMethod.POST)
//要检验的bean必须和BindingResult(Errors)绑定到一起,中间不能有其他入参
public String save(@Valid Employee employee, Errors result,
Map<String, Object> map){
System.out.println("save: " + employee);

if(result.getErrorCount() > 0){
System.out.println("出错了!");

for(FieldError error:result.getFieldErrors()){
System.out.println(error.getField() + ":" + error.getDefaultMessage());
}

//若验证出错, 则转向定制的页面
map.put("departments", departmentDao.getDepartments());
return "input";
}

employeeDao.save(employee);
return "redirect:/emps";
}

//bean里面的属性

@NotEmpty
private String lastName;

@Email
private String email;
//1 male, 0 female
private Integer gender;

private Department department;

@Past
@DateTimeFormat(pattern="yyyy-MM-dd")
private Date birth;

@NumberFormat(pattern="#,###,###.#")
private Float salary;

public Integer getId() {
return id;
}
-------------本文结束感谢阅读-------------