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校验数据
(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>
输入有误时:
输入正确时: