13【JSR303校验】

追求适度,才能走向成功;人在顶峰,迈步就是下坡;身在低谷,抬足既是登高;弦,绷得太紧会断;人,思虑过度会疯;水至清无鱼,人至真无友,山至高无树;适度,不是中庸,而是一种明智的生活态度。

导读:本篇文章讲解 13【JSR303校验】,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文


七、JSR303校验

7.1 JSR303 简介

Java Specification Requests:Java 规范提案简称JSR;JSR-303 是 JAVA EE 6 中的一项子规范,叫做 Bean Validation,官方参考实现是Hibernate Validator。JSR 303 用于对 Java Bean 中的字段的值进行验证。 Spring MVC 3.x 之中也大力支持 JSR-303,可以在控制器中对表单提交的数据方便地验证。

7.2 JSR303提供的约束

Tips:JSR303只是一个规范,我们具体的实现使用Hibernate Validator

  • JSR303 中内置的约束:
约束 说明
@Null 被标注字段必须为null
@NotNull 被标注字段必须不为null
@AssertTrue 被标注字段必须为true
@AssertFalse 被标注字段必须为false
@Min(value) 被标注字段必须是一个数字,并且值要大于等于value
@Max(value) 被标注字段必须是一个数字,并且值要小于等于value
@DecimalMin(value) 被标注字段必须是一个数字,并且值要大于等于value
@DecimalMax(value) 被标注字段必须是一个数字,并且值要小于等于value
@Size(max,min) 被标注字段必须是一个字符串,并且长度大于等于min,小于等于max
@Digits(integer,fraction) 被标注字段必须是一个数字,并且值必须在可接受的范围内
@Past 被标注字段必须是一个已经过去的日期
@Future 被标注字段必须是一个将来的日期
@Pattern(value) 被标注字段必须复合value中的正则表达式
  • Hibernate Validator新增的约束:
约束 说明
@Email 被标注字段必须是一个合法的邮箱
@Length 被标注字段必须在指定长度内
@NotEmpty 被标注字段必须必须非空
@Range 被标注的字段必须在指定范围内

7.3 数据校验

引入Hibernate-validator依赖:

<!--hibernate对JSR303的支持-->
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>5.1.0.Final</version>
</dependency>

<dependency>
    <groupId>javax.el</groupId>
    <artifactId>javax.el-api</artifactId>
    <version>3.0.0</version>
</dependency>

<dependency>
    <groupId>org.glassfish.web</groupId>
    <artifactId>javax.el</artifactId>
    <version>2.2.4</version>
</dependency>

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.22</version>
</dependency>

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13.1</version>
    <scope>test</scope>
</dependency>

实体对象:

package com.dfbz.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.Range;

import javax.validation.constraints.*;
import java.util.Date;

/**
 * @author lscl
 * @version 1.0
 * @intro:
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Emp {

    @NotNull                        // id不能为null
    private Integer id;             // 用户id

    @Size(min = 4, max = 8)         // 姓名在4-8位之间
    private String name;            // 员工姓名

    @Range(min = 18, max = 28, message = "年龄错了啊")      // 年龄在18-28岁之间
    private Integer age;            // 年龄

    @Email                          // 必须是合法email
    private String email;           // 邮箱

    @AssertTrue                     // 必须是true
    private Boolean sex;            // 性别  true:男 false:女

    @Digits(integer = 3, fraction = 2)           // 整数位必须在3位小数内(包含3位),小数位必须在2位之内(包含2位)
    private Double salary;          // 薪资

    @Past                           // 必须是一个已经过去的日期
    private Date birthday;          // 出生日期
}
  • 测试代码:
package com.dfbz.test;

import com.dfbz.entity.Emp;
import org.junit.Test;

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import java.util.Date;
import java.util.Set;

/**
 * @author lscl
 * @version 1.0
 * @intro:
 */
public class Demo01 {

    @Test
    public void test1() {
        Emp emp = new Emp(null,
                "administrator",
                38, "admin.com",
                false, 30.223D,
                new Date(System.currentTimeMillis()+1000)
        );

        // 创建校验器工厂
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();

        // 通过工厂创建一个校验器
        Validator validator = factory.getValidator();

        // 通过校验器对指定的对象进行校验,获取校验清单
        Set<ConstraintViolation<Emp>> violations = validator.validate(emp);

        if (violations != null && violations.size() > 0) {
            for (ConstraintViolation<Emp> violation : violations) {
                // 获取到每一个校验清单,打印清单值
                System.out.println("Validation problem : " + violation.getMessage());
            }
        }
    }
}

7.4 SpringMVC 数据校验

  • 准备表单:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="/demo01/demo01" method="post">
    员工ID:<input type="text" name="id">
    员工姓名:<input type="text" name="name">
    员工年龄:<input type="text" name="age">
    员工邮箱:<input type="text" name="email">
    员工性别:<input type="text" name="sex">
    员工薪资:<input type="text" name="salary">
    出生日期:<input type="text" name="birthday">
    <input type="submit">
</form>

</body>
</html>
  • Controller:
package com.dfbz.controller;

import com.dfbz.entity.Emp;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import javax.validation.Valid;
import java.util.List;

/**
 * @author lscl
 * @version 1.0
 * @intro:
 */
@Controller
@RequestMapping("/demo01")
public class Demo01Controller {

    /**
     * @param emp
     * @param result: 接收校验失败的信息,如果都校验成功则为空,如果没有BindingResult,则校验失败出现400错误
     * @Valid: 启用JSR303校验
     */
    @RequestMapping("/demo01")
    public ModelAndView demo01(@Valid Emp emp, BindingResult result) {

        ModelAndView mv=new ModelAndView("/success.jsp");
        if (result != null && result.getErrorCount() > 0) {
            // 说明有校验失败的字段

            // 获取所有验证不通过的field
            List<FieldError> fieldErrors = result.getFieldErrors();

            for (FieldError fieldError : fieldErrors) {
                System.out.println(fieldError.getField() + ": " + fieldError.getDefaultMessage());

                mv.addObject(fieldError.getField(),fieldError.getDefaultMessage());
            }
            mv.setViewName("/error.jsp");
        }

        System.out.println(emp);
        return mv;
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/131661.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!