Java基础:JSR 303校验
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 |
验证是否合法的邮件地址 | |
@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<!-- JSR 303数据校验实现:hibernate-validator -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.7.Final</version>
</dependency>
<!-- javax.el -->
<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
33import 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;
private String loginName;
private String password;
private String userName;
private double age;
private String email;
private Date birthDay;
private String phone;
//-------set/get方法------------
} - 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
34import 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;
public class LoginController {
public String registerForm() {
return "registerForm";
}
public String login( 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"%>
<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>
Java基础:JSR 303校验
http://blog.gxitsky.com/2018/03/31/Java-jdk-8-validation-jsr303/