七、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新增的约束:
约束 | 说明 |
---|---|
被标注字段必须是一个合法的邮箱 | |
@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