一、JSR-303简介:官网
JSR-303 是 JAVA EE 6 中的一项子规范,叫做 Bean Validation,官方参考实现是Hibernate Validator。
此实现与 Hibernate ORM 没有任何关系。 JSR 303 用于对 Java Bean 中的字段的值进行验证。
Spring MVC 3.x 之中也大力支持 JSR-303,可以在控制器中对表单提交的数据方便地验证。
JSR-303可以使用注解的方式进行验证,它内部已经定义好了一系列的限制注解,我们只需要把这些注解标记在需要验证的实体类的属性上或是其对应的get方法上。
JSR-303 是一个数据验证的规范,但是 spring 并没有对其进行实现,Hibernate Validator 是实现了这一规范的,通过此这个实现来讲 SpringMVC对JSR-303 的支持。
二、JSR 303 基本的校验规则
空检查
@Null 验证对象是否为null
@NotNull 验证对象是否不为null, 无法查检长度为0的字符串
@NotBlank 检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格.
@NotEmpty 检查约束元素是否为NULL或者是EMPTY.
Booelan检查
@AssertTrue 验证 Boolean 对象是否为 true
@AssertFalse 验证 Boolean 对象是否为 false
长度检查
@Size(min=, max=) 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内
@Length(min=, max=) 验证约束字符串是否包含在最小和最大之间。
日期检查
@Past 验证 Date 和 Calendar 对象是否在当前时间之前,验证成立的话被注释的元素一定是一个过去的日期
@Future 验证 Date 和 Calendar 对象是否在当前时间之后,验证成立的话被注释的元素一定是一个将来的日期
@Pattern 验证 String 对象是否符合正则表达式的规则,被注释的元素符合制定的正则表达式,regexp:正则表达式 flags: 指定 Pattern.Flag 的数组,表示正则表达式的相关选项。
数值检查
建议使用在Stirng,Integer类型,不建议使用在 int 类型上,因为表单值为 空 时无法转换为 int,
@Min 验证 Number 和 String 对象是否大等于指定的值
@Max 验证 Number 和 String 对象是否小等于指定的值
@DecimalMax 被标注的值必须不大于约束中指定的最大值. 这个约束的参数是一个通过BigDecimal定义的最大值的字符串表示. 小数存在精度( Double, float, BigDecimal )
@DecimalMin 被标注的值必须不小于约束中指定的最小值. 这个约束的参数是一个通过BigDecimal定义的最小值的字符串表示. 小数存在精度
@Digits 验证 Number 和 String 的构成是否合法
@Digits(integer=,fraction=) 验证字符串是否是符合指定格式的数字,interger指定整数精度,fraction指定小数精度。
@Range(min=, max=) 被指定的元素必须在合适的范围内
@Range(min=10000,max=50000,message=”range.bean.wage”)
@Valid 递归的对关联对象进行校验, 如果关联对象是个集合或者数组,那么对其中的元素进行递归校验,如果是一个map,则对其 中的值部分进行校验.(是否进行递归验证)
@CreditCardNumber 信用卡验证
@Email 验证是否是邮件地址,如果为null,不进行验证,算通过验证。
@ScriptAssert(lang= ,script=, alias=)
@URL(protocol=,host=, port=,regexp=, flags=)
三、demo操作步骤
1) pom.xml中引入依赖
<!-- JSR-303后台校验, 官方参考实现是Hibernate Validator -->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.10.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator-annotation-processor</artifactId>
<version>6.0.10.Final</version>
</dependency>
2) SpringMVC配置文件中需要 <mvc:annotation-driven "/> 这个标签,自动加载需要的支持类。
3)在JavaBean的属性上加验证注解。
public class User {
private int id;
@NotEmpty(message="用户名不能为空")
@Pattern(regexp="^\\w{6,18}$",message="用户名必须由6到18位的数字字母或者下划线组成")
private String username;
@NotNull
@Length(min=6,max=32,message="密码必须为6到32位的字符串")
private String password;
@Past
private Date birthday;
@NotNull(message="年龄不能为空")
@Max(value=1)
@Min(value=1)
private Integer age;
@DecimalMax(value="2.5")
@DecimalMin(value="1.0")
private Double height;
@Email
private String email;
@NotNull
private Department department;
4)在Controller的处理方法的参数前,加@Valid注解,出错后,错误信息会放置在 Errors或BindingResult 的对象参数中。
@ModelAttribute
public void getJspUser(@RequestParam(value="id",required=false) Integer id,
@RequestParam(value="department.id",required=false) Integer department_id, Model model) {
if(id !=null && department_id != null) {
User user = userService.get(id);
Department department = departmentService.get(department_id);
user.setDepartment(department);
model.addAttribute("user", user);
}
}
@RequestMapping(value="/add", method = RequestMethod.POST)
public String add(@Valid User user, BindingResult errors, Model model) {
//判断数据绑定结果 errors.getErrorCount()>0 也可以
if(errors.hasFieldErrors()) {
System.out.println("参数值不合法!");
//获得所有的属性错误
List<FieldError> fieldErrors = errors.getFieldErrors();
for (FieldError fieldError : fieldErrors) {
//把错误信息存放在model对象中
//model.addAttribute(fieldError.getField(), fieldError.getDefaultMessage());
System.out.println(fieldError.getField()+"==="+fieldError.getDefaultMessage());
model.addAttribute("departments", departmentService.getAllList());
return "user-add";
}
}
userService.add(user);
return "redirect: /sshweb/users";
}
5) jsp 页面
<h3>新增用户</h3>
<form:form action="${pageContext.request.contextPath }/add" method="post" modelAttribute="user">
用户名:<form:input path="username"/> <form:errors path="username"/> <br/>
用户密码:<form:input path="password"/> <form:errors path="password"/> <br/>
email:<form:input path="email"/> <form:errors path="email"/><br/>
用户所属部门:<form:select path="department.id" itemValue="id" itemLabel="departmentname" items="${departments }"/> <br/>
生日:<form:input path="birthday"/> <form:errors path="birthday"/><br/>
年龄:<form:input path="age"/> <form:errors path="age"/><br/>
身高:<form:input path="height"/> <form:errors path="height"/><br/>
<input type="submit" value="保存"> <br/>
</form:form>