Spring MVC_数据校验
引言
在 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 地址 | |
@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 |
|
在目标方法的 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 | if(bindingResult.hasErrors()) { |
4、显示错误消息
使用 form:errors 标签
form:errors 标签必须在 SpringMVC 的 form:form 标签中使用