JSR 303是 Java 为Bean数据合法性校验提供的一个标准规范,叫做Bean Validation,随JavaEE 6发布。官方参考实现是Hibernate Validator。
Bean Validation为Java Bean定义了相应的数据类型和API,在应用中通过在Bean属性上标注类似于@NotNull, @Max等标准的注解指定校验规则,并通过验证接口对 Bean 进行验证。
该校验框架是一个运行时框架,在验证之后验证的错误信息被马上返回;核心接口是javax.validation.Validator,该接口根据目标对象类中所标注的校验注解进和地数据校验,并得到校验结果。
该标准目标有两个实现:Hibernate Validator和Apache bval,使用较多的是前者。
JSR 303官方标准:https://jcp.org/en/jsr/detail?id=303
Hibernate Validator
Hibernate Validator 提供了 JSR 303 规范中所有内置 constraint 的实现,除此之外还有一些附加的 constraint。如果想了解更多有关 Hibernate Validator 的信息:http://hibernate.org/validator/
JSR 303注解
| 注解 |
功能 |
| @Null |
验证对象是否为null |
| @NotNull |
验证对象是否不为null,无法检查长度为0的字符串,用于验证基本数据类型 |
| @AssertTrue |
验证Boolean对象是否为true |
| @AssertFalse |
验证Boolean对象是否为false |
| @Max(value) |
验证Number和String对象是否小于等于指定的值 |
| @Min(value) |
验证Number和String对象是否大于等于指定的值 |
| @DecimalMax(value) |
被标注的值必须不大于约束中指中的最大值,标准的值的类型是BigDecimal |
| @DecimalMin(value) |
被标注的值必须不小于约整中指中的最小值,标准的值的类型是BigDecimal |
| @Digits(integer, fraction) |
验证字符串是否符合指定的数字,integer指定整数精度,fraction指定小数精度 |
| @Size(min,max) |
验证对象(Array,Collection,Map,String)长度是否在指定的范围内 |
| @Past |
验证Date和Calendar对象是否在当前时间之前 |
| @Future |
验证Date和Calendar对象是否在当前时间之后 |
| @Pattern |
验证String对象是否符合正则表达式的规则 |
扩展注解
| 注解 |
功能 |
| @NotBlank |
检查约束字符串是不是Null,被Trim的长度是否大于0。只对字符串,且会去掉去后空格 |
| @URL |
验证是否合法的URL |
| @Email |
验证是否合法的邮件地址 |
| @CreditCardNumber |
验证是否合法的信用卡号码 |
| @Length(min,max) |
验证字符串的长度必须在指定的范围内 |
| @NotEmpty |
检查元素是否为Null,或者Empty。用于Array,Collection,Map,String |
| @Range(min,max,message) |
验证属性值必须在合适的范围内 |
示例代码
pom.xml文件引入Hibernate Validator jar包和依赖包。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>6.0.7.Final</version> </dependency>
<dependency> <groupId>javax.el</groupId> <artifactId>javax.el-api</artifactId> <version>2.2.5</version> </dependency> <dependency> <groupId>org.glassfish.web</groupId> <artifactId>javax.el</artifactId> <version>2.2.5</version> </dependency>
|
- 实体类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| import java.util.Date;
import javax.validation.constraints.Email; import javax.validation.constraints.NotBlank; import javax.validation.constraints.Past; import javax.validation.constraints.Pattern;
import org.hibernate.validator.constraints.Length; import org.hibernate.validator.constraints.Range; import org.springframework.format.annotation.DateTimeFormat;
public class People { private String name; @NotBlank(message="登录名不能为空") private String loginName; @Length(min=6,max=12,message="密码长度必须在6位到8位之前") private String password; @NotBlank(message="用户名不能为空") private String userName; @Range(min=15,max=60,message="年龄必须在15到60岁之间") private double age; @Email(message="请输入合法邮箱地址") @NotBlank(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;
}
|
- Controller代码
方法中接收参数的对象添加@Valid注解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| import javax.servlet.http.HttpServletRequest; import javax.validation.Valid;
import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.Errors; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod;
import com.ssm.entity.People;
@Controller @RequestMapping("/user") public class LoginController {
@RequestMapping(value = "/registerForm") public String registerForm() { return "registerForm"; } @RequestMapping(value="/login", method=RequestMethod.POST) public String login(@Valid People people, Errors errors, Model model) { System.err.println(people); System.err.println(errors); if(errors.hasErrors()) { String defaultMessage = errors.getFieldError("age").getDefaultMessage(); System.out.println(defaultMessage); return "registerForm"; } model.addAttribute("people", people); return "success"; } }
|
- 表单代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="${pageContext.request.contextPath}/static/js/jquery-1.11.0.js"></script>
<title>JSR 303 Validation</title> </head> <body> <h3>注册页面</h3> <form action="${pageContext.request.contextPath}/user/login" method="post"> <table> <tr> <td>登录名:</td> <td><input name="loginName"></td> </tr> <tr> <td>密码:</td> <td><input name="password"></td> </tr> <tr> <td>用户名:</td> <td><input name="userName"></td> </tr> <tr> <td>年龄:</td> <td><input name="age"></td> </tr> <tr> <td>邮箱:</td> <td><input name="email"></td> </tr> <tr> <td>生日:</td> <td><input name="birthDay"></td> </tr> <tr> <td>电话:</td> <td><input name="phone"></td> </tr> <tr> <td><input type="submit" value="提交"></td> </tr> </table>
</form> </body> </html>
|