引言

在 Web 应用三层架构体系中,表述层负责接收浏览器提交的数据,业务逻辑层负责数据的处理。为了能够让业务逻辑层基于正确的数据进行处理,我们需要在表述层对数据进行检查,将错误的数据隔绝在业务逻辑层之外。

校验概述

JSR 303 是 Java 为 Bean 数据合法性校验提供的标准框架,它已经包含在 JavaEE 6.0 标准中。JSR 303 通过在 Bean 属性上标注类似于@NotNull、@Max 等标准的注解指定校验规则,并通过标准的验证接口对 Bean 进行验证。

注解作用
@Null必须为 null
@NotNull必须不为 null
@AssertTrue必须为 true
@AssertFalse必须为 false
@Min(value)必须大于或等于 value
@Max(value)必须小于或等于 value
@DecimalMin(value)必须大于或等于 value
@DecimalMax(value)必须小于或等于 value
@Size(max,min)大小必须在 max 和 min 限定的范围内
@Digits(integer,fratction)值必须是一个数字,且必须在可接受的范围内
@Past只能用于日期型,且必须是过去的日期
@Future只能用于日期型,且必须是将来的日期
@Pattern(value)必须符合指定的正则表达式

JSR 303 只是一套标准,需要提供其实现才可以使用。Hibernate Validator 是 JSR 303 的一个参考实现,除支持所有标准的校验注解外,它还支持以下的扩展注解:

注解作用
@Email必须是格式正确的 Email 地址
@Length被注释的字符串大小必须在指定的范围内
@NotEmpty被注释的字符串不能是空字符串
@Range被注释的元素必须在指定的范围内

Spring4.0 拥有自己独立的数据校验框架,同时支持 JSR 303 标准的校验框架。Spring 在进行数据绑定时,可同时调用校验框架完成数据校验工作。在 Spring MVC 中,可直接通过注解驱动mvc:annotation-driven的方式进行数据校验。Spring 的LocalValidatorFactroyBean既实现了 Spring 的 Validator 接口,也实现了 JSR 303 的 Validator 接口。

只要在 Spring 容器中定义了一个LocalValidatorFactoryBean,即可将其注入到需要数据校验的 Bean 中。Spring 本身并没有提供 JSR 303 的实现,所以必须将 JSR 303 的实现者的 jar 包放到类路径下。

配置mvc:annotation-driven后,SpringMVC 会默认装配好一个LocalValidatorFactoryBean,通过在处理方法的入参上标注@Validated注解即可让 Spring MVC 在完成数据绑定后执行数据校验的工作。

操作步骤

1、导入验证环境

[1]在当前工程类路径下加入以下 jar 包

classmate-0.8.0.jar
hibernate-validator-5.0.0.CR2.jar
hibernate-validator-annotation-processor-5.0.0.CR2.jar
jboss-logging-3.1.1.GA.jar
validation-api-1.1.0.CR1.jar

[2]在 Tomcat 的 lib 目录下加入以下 jar 包

javax.el-2.2.4.jar
javax.el-api-2.2.4.jar
el-api-2.2.jar

2、添加注解

在需要验证的字段上添加验证注解

1
2
@NotEmpty
private String empName;

在目标方法的 bean 前添加@Validated注解

注意:在@Validated注解修饰的 bean 之后, 紧跟 Errors(或 BindingResult)类型的参数在@Validated 注解修饰的 bean 和 Errors 参数之间不能再有其他的参数

正确: public String saveUser(@Validated User user, BindingResult bindingResult) {
错误: public String saveUser(@Validated User user, String xxx, BindingResult bindingResult) {

3、验证

调用 hasErrors()方法在目标方法中检验是否没有通过验证

1
2
3
if(bindingResult.hasErrors()) {
return "addUI";
}

4、显示错误消息

使用 form:errors 标签

form:errors 标签必须在 SpringMVC 的 form:form 标签中使用