SpringMVC:JSR303校验

JSR303是Java为Bean数据合法性校验说提供的一个标准规范,叫做 Bean Validation.2009年12月JavaEE6 发布,Bean Validation作为一个重要特性被包含其中,用于对JavaBean中的字段值进行验证;官方参考实现是Hibernate Validator.
Bean Validation为JavaBean验证定义了相应的元数据类型和API.在应用程序中,通过在Bean属性上标注类似于@NotNull,@Max等标准的注释指定校验规则,并通过标注的验证接口对Bean进行验证.Bean Validation是一个运行时的数据验证框架,在验证之后验证的错误信息会被马上返回.
读者可以通过http://jcp.org/en/jsr/detail?id=303了解JSR303的详细内容.
JSR303是一个规范,他的核心接口是javax.validation.Validator,该接口根据目标对象类中所标注的校验注释进行数据校验,并得到校验结果.JSR303有两个实现,第一个实现是Hibernate Validator,可以从以下网站下载:
第二个实现是Apache bval.可以从以下网站下载
JSR303中定义了一套可标注在成员变量,属性方法上的校验注释,如下表所示:
注释
功能
范例
@Null
验证对象是否为null
@Null String desc;
@NotNull
验证对象是否不为null,无法检查长度为0的字符串,用于验证基本数据类型
@NotNull String name;
@AssertTrue
验证Boolean对象是否为true
@AssertTrue boolean isEmpty;
@AssertFalse
验证Boolean对象是否为false
@AssertFalse boolean isEmpty;
@Max(value)
验证Number和String对象是否小于等于指定的值
@Max(18) Int age;
@Min(value)
验证Number和String对象是否大于等于指定的值
@Min(60) Int age;
@DecimalMax(value)
被标注的值必须不大于约束中指定的最大值。这个约束的参数是一个通过BigDecimal定义的最大值的字符串的表示,小数存在精度
@DecimalMax(1.1) BigDecimal price;
@DecimalMin(value)
被标注的值必须小于约束中指定的最小值。这个约束的参数是一个通过BigDecimal定义的最小值的字符串表示,小数存在精度
@DecimalMin(0.5) BigDecimal price;
@Digits(integer,fraction)
验证字符串是否符合指定格式的数字,integer指定整数精度,fraction指定小数精度
@Digits(integer=5,fraction=2) BigDecimal price;
@Size(min,max)
验证对象(Array,Collection,Map,String)长度是否存在给定的范围内
@Size(min=15,max=60) int age;
@Email
验证是否是合法的邮箱地址
@Email String email;
@Past
验证Date和Calendar对象是否在当前时间之前
@Past Date birthDate;
@Future
验证Date和Calendar对象是否在当前时间之后
@Future Date ShippingDate
@Pattern
验证String对象是否符合正则表达式规则
@Pattern(regexp=“[1][3,8][3,6,9][0-9]{8}”) String phone;
Hibernate Validator是JSR303的一个参考实现,除了支持所有标准的校验注释之外,他还扩展了如表所示的注释:
注释 功能 范例
@URL
验证是否是合法的URL
@URL String url;
@CreditCardNumber
验证是否是合法的信用卡号码
@CreditCardNumber String creditCard;
@Length(min,max)
验证字符串的长度必须在指定的范围内
@Length(min=6,max=8) String password;
@NotEmpty
检查元素是否为Null或者Empty。用于Array、Collection、Map、String。
@NotEmpty String name;
@Range(min,max,message)
验证属性值必须在适合的范围内
@Range(min=18,max=60,message=“学生年龄必须在18岁至60岁之间”) Int age;
示例:使用JSR303校验数据
1.部署
(1)下载hibernate-validator
(2)将jar包进入项目
分别是dist中的:
和lib/required/中的
2.表单视图
<h2>测试JSR303</h2>
<form:form modelAttribute="user" method="post" action="register">
登录名<form:input path="loginname" />
<form:errors path="loginname" cssStyle="color:red" />
<br>
密码<form:input path="password" />
<form:errors path="password" cssStyle="color:red" />
<br>
用户名<form:input path="username" />
<form:errors path="username" cssStyle="color:red" />
<br>
年龄<form:input path="age" />
<form:errors path="age" cssStyle="color:red" />
<br>
邮箱<form:input path="email" />
<form:errors path="email" cssStyle="color:red" />
<br>
生日<form:input path="birthday" />
<form:errors path="birthday" cssStyle="color:red" />
<br>
电话<form:input path="phone" />
<form:errors path="phone" cssStyle="color:red" />
<br>
<input type="submit" />
</form:form>
3.模型
public class User implements Serializable
{
@NotBlank(message="登录名不能为空")
private String loginname;
@NotBlank(message="密码不能为空")
@Length(min=6,max=8,message="密码长度必须在6至8位之间")
private String password;
@NotBlank(message="用户名不能为空")
private String username;
@Range(min=15,max=60,message="年龄必须在15至60岁之间")
private int age;
@Email(message="必须是合法的邮箱地址")
private String email;
@DateTimeFormat(pattern="yyyy-MM-dd")
@Past(message="生日必须是一个过去的日期")
private Date birthday;
@Pattern(regexp="[1][3,8][3,6,9][0-9]{8}",message="无效的电话号码")
private String phone;
4.控制器
@Controller
public class UserController
{
@RequestMapping("/registerForm")
public String registerForm(
Model model
)
{
User user = new User();
model.addAttribute("user", user);
return "registerForm";
}
@PostMapping(value="/register")
public String register(
@Valid @ModelAttribute User user,
Errors errors,
Model model
)
{
if(errors.hasErrors())
{
return "registerForm";
}
model.addAttribute("user", user);
return "success";
}
}
5.输出视图
<h2>测试JSR303</h2>
<h3>登录名:${requestScope.user.loginname}</h3>
<h3>密码:${requestScope.user.password}</h3>
<h3>用户名:${requestScope.user.username}</h3>
<h3>年龄:${requestScope.user.age}</h3>
<h3>邮箱:${requestScope.user.email}</h3>
<h3>生日:<fmt:formatDate value="${requestScope.user.birthday}" pattern="yyyy年MM月dd日" /></h3>
<h3>电话:${requestScope.user.phone}</h3>
输入有误时:
输入正确时: