JSR 303 是Java为Bean数据合法性校验提供的标准框架,其已经包含在JavaEE 6.0中;JSR 303 通过在Bean属性上标注类似于@NotNull、@Max等标准的注解指定校验规则,并通过标准的验证接口对Bean进行验证。
JSR 303 支持的校验注解如下:
注解 | 功能说明 |
---|---|
@Null | 被注释的元素必须为null |
@NotNull | 被注释的元素必须不为null |
@AssertTrue | 被注释的元素必须为true |
@AssertFalse | 被注释的元素必须为false |
@Min(value) | 被注释的元素必须是一个数字,其值必须大于或等于指定的最小值 |
@Max(value) | 被注释的元素必须是一个数字,其值必须小于或等于指定的最大值 |
@DecimalMin(value) | 被注释的元素必须是一个数字,其值必须大于或等于指定的最小值 |
@DecimalMax(value) | 被注释的元素必须是一个数字,其值必须小于或等于指定的最大值 |
@Size(max, min) | 被注释的元素的大小必须在指定的范围内 |
@Digits(integer, fraction) | 被注释的元素必须是一个数字,其值必须在可接受的范围内 |
@Past | 被注释的元素必须是一个过去的日期 |
@Future | 被注释的元素必须是一个将来的日期 |
@Pattern(value) | 被注释的元素必须符合指定的正则表达式 |
Hibernate Validator 是 JSR 303 的一个参考实现,除支持所有标准的校验注解外,还支持一下扩展注解:
注解 | 功能说明 |
---|---|
被注释的元素必须是电子邮箱地址 | |
@Length | 被注释的字符串的大小必须在指定的范围内 |
@NotEmpty | 被注释的字符串必须非空 |
@Range | 被注释的元素必须在合适的范围内 |
① 关于所需要的jar包
Spring4.0拥有独立的数据校验框架,同时支持 JSR 303 标准的校验框架;但其本身并没有提供 JSR 303 的实现,故必须将 JSR 303 的实现者的jar包放到类路径下。
② 关于LocalValidatorFactoryBean工厂类
该工厂类既实现了Spring的Validator接口,也实现了 JSR 303 的Validator接口;故需要在 Spring 容器中定义LocalValidatorFactoryBean,即可将其注入到需要数据校验的Bean中。
③ 关于@Valid注解
会默认装配LocalValidatorFactoryBean,通过在处理方法的入参上标注@Valid注解即可让SpringMVC在进行数据绑定时,同时调用校验框架完成数据校验工作。
④ 关于校验结果
前一个表单/命令对象的校验结果保存到随后处理方法的入参中,该入参必须是BindingResult或Errors类型;且需注意,需校验的Bean对象和其绑定结果对象或错误对象是成对出现的,其之间不允许声明其他的入参。
第一步:添加Hibernate Validator验证框架所依赖的jar包,具体如下图所示:
maven项目添加下面依赖:
org.hibernate
hibernate-validator
5.1.3.Final
第二步:在SpringMVC配置文件中添加mvc:annotation-driven标签;
第三步:在需要校验的JavaBean属性上添加相应的校验注解,以User为例:
public class User {
@NotEmpty(message="用户名不能为空")
private String userName;
@Past
@DateTimeFormat(pattern="yyyy-MM-dd")
private Date birth;
...
}
使用注解的message属性可以设置当发生错误时返回的信息
第四步:在处理器目标方法的Bean类型的入参前添加@Valid注解,并添加保存校验结果的对象:
@RequestMapping("/validate")
public String validate(@Valid User user,BindingResult result){
//发生错误
if(result.getErrorCount() > 0){
System.out.println("出错了,请注意!");
//循环打印所有的错误信息
for(FieldError error:result.getFieldErrors()){
//打印错误,error.getDefaultMessage()可以获取上面message配置的错误信息
System.out.println(error.getField()+":"+error.getDefaultMessage());
}
//指定校验错误时所转向的定制页面
return "error";
}
return "success";
}
SpringMVC还会将所有校验结果保存到隐含模型中,该模型中的所有数据最终将通过HttpServletRequest的属性列表暴露给JSP视图对象,故在JSP页面上可以获取错误信息。
<form:form action="${pageContext.request.contextPath }/validate" method="post">
<form:errors path="*">form:errors><br><br>
Name:<form:input path="name"/>
<form:errors path="name">form:errors>
<br><br>
Email:<form:input path="email"/>
<form:errors path="email">form:errors>
<br><br>
Birthday:<form:input path="birth"/>
<form:errors path="birth">form:errors>
<br><br>
<input type="submit" name="submit">
form:form>