Java基础:JSR 303校验

  JSR 303JavaBean数据合法性校验提供的一个标准规范,叫做Bean Validation,随JavaEE 6发布。官方参考实现是Hibernate Validator

  Bean ValidationJava Bean定义了相应的数据类型和API,在应用中通过在Bean属性上标注类似于@NotNull, @Max等标准的注解指定校验规则,并通过验证接口对 Bean 进行验证。

  该校验框架是一个运行时框架,在验证之后验证的错误信息被马上返回;核心接口是javax.validation.Validator,该接口根据目标对象类中所标注的校验注解进和地数据校验,并得到校验结果。

  该标准目标有两个实现:Hibernate ValidatorApache 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) 验证NumberString对象是否小于等于指定的值
@Min(value) 验证NumberString对象是否大于等于指定的值
@DecimalMax(value) 被标注的值必须不大于约束中指中的最大值,标准的值的类型是BigDecimal
@DecimalMin(value) 被标注的值必须不小于约整中指中的最小值,标准的值的类型是BigDecimal
@Digits(integer, fraction) 验证字符串是否符合指定的数字,integer指定整数精度,fraction指定小数精度
@Size(min,max) 验证对象(Array,Collection,Map,String)长度是否在指定的范围内
@Past 验证DateCalendar对象是否在当前时间之前
@Future 验证DateCalendar对象是否在当前时间之后
@Pattern 验证String对象是否符合正则表达式的规则

扩展注解

注解 功能
@NotBlank 检查约束字符串是不是Null,被Trim的长度是否大于0。只对字符串,且会去掉去后空格
@URL 验证是否合法的URL
@Email 验证是否合法的邮件地址
@CreditCardNumber 验证是否合法的信用卡号码
@Length(min,max) 验证字符串的长度必须在指定的范围内
@NotEmpty 检查元素是否为Null,或者Empty。用于Array,Collection,Map,String
@Range(min,max,message) 验证属性值必须在合适的范围内

示例代码

  1. 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>
  2. 实体类
    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;

    //-------set/get方法------------

  3. 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";
    }
    }

  4. 表单代码
    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>
作者

光星

发布于

2018-03-31

更新于

2022-06-17

许可协议

评论