一、JSR303介绍
JSR303数据校验:
JSR是Java Specification Requests的缩写,意思是Java 规范提案。是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求。任何人都可以提交JSR,以向Java平台增添新的API和服务。JSR已成为Java界的一个重要标准。
关于 JSR-303
JSR-303 是JAVA EE 6 中的一项子规范,叫做Bean Validation,Hibernate Validator 是 Bean Validation 的参考实现 . Hibernate Validator 提供了 JSR 303 规范中所有内置 constraint 的实现,除此之外还有一些附加的 constraint。
Hibernate 对其实现
Hibernate Validator 是 Bean Validation 的参考实现 . Hibernate Validator 提供了 JSR 303 规范中所有内置 constraint 的实现,除此之外还有一些附加的 constraint。
二、JSR303中含有的注解
@Null | 被注释的元素必须为 null |
@NotNull | 被注释的元素必须不为 null |
@AssertTrue | 被注释的元素必须为 true |
@AssertFalse | 被注释的元素必须为 false |
@Min(value) | 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 |
@Max(value) | 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 |
@DecimalMin(value) | 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 |
@DecimalMax(value) | 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 |
@Size(max=, min=) | 被注释的元素的大小必须在指定的范围内 |
@Digits (integer, fraction) | 被注释的元素必须是一个数字,其值必须在可接受的范围内 |
@Past | 被注释的元素必须是一个过去的日期 |
@Future | 被注释的元素必须是一个将来的日期 |
@Pattern(regex=,flag=) | 被注释的元素必须符合指定的正则表达式 |
补充
Hibernate 中填充一部分
@NotBlank(message =) | 验证字符串非null,且长度必须大于0 |
被注释的元素必须是电子邮箱地址 | |
@Length(min=,max=) | 被注释的字符串的大小必须在指定的范围内 |
@NotEmpty | 被注释的字符串的必须非空 |
@Range(min=,max=,message=) | 被注释的元素必须在合适的范围内 |
注:Hibernate Validator是JSR303的一个参考实现,除了支持所有标准的校验注解外,另外Hibernate Validator还有JSR-380的实现
三、简单使用
1.导入依赖
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.7.Final</version>
</dependency>
2.给校验对象的指定属性添加校验规则
package com.zking.ssm.book.model;
import lombok.Builder;
import lombok.ToString;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.Range;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
@ToString
@Builder
public class Book {
@NotNull(message = "编号不能为空")
private Integer bid;
@NotBlank(message = "名字不能为空")
private String bname;
private String bpinyin;
@NotNull(message = "价格不能为空")
@Range(min=10,max=200,message="价格必须在10-200之间")
private Float bprice;
private String btype;
private String bimages;
public Book(Integer bid, String bname, String bpinyin, Float bprice, String btype,String bimages) {
this.bid = bid;
this.bname = bname;
this.bpinyin = bpinyin;
this.bprice = bprice;
this.btype = btype;
this.bimages=bimages;
}
public Book() {
super();
}
public Integer getBid() {
return bid;
}
public void setBid(Integer bid) {
this.bid = bid;
}
public String getBname() {
return bname;
}
public void setBname(String bname) {
this.bname = bname;
}
public String getBpinyin() {
return bpinyin;
}
public void setBpinyin(String bpinyin) {
this.bpinyin = bpinyin;
}
public Float getBprice() {
return bprice;
}
public void setBprice(Float bprice) {
this.bprice = bprice;
}
public String getBtype() {
return btype;
}
public void setBtype(String btype) {
this.btype = btype;
}
public String getBimages() {
return bimages;
}
public void setBimages(String bimages) {
this.bimages = bimages;
}
}
3.告诉spring这个数据需要校验@Valid或@Validated
/**
* 书本新增
* 请求路径 SSM/book/editBook
* @param book
* @return
*/
@RequestMapping("/addBook")
public String addBook(@Validated Book book, BindingResult bindingResult){
System.out.println("进入新增方法");
//判断是否验证成功
if(bindingResult.hasErrors()){
System.out.println("验证失败");
//验证失败
return "book/addBook";
}else {
//验证成功
bookService.insert(book);
return "redirect:queryBookPage";
}
}
注1:
@Valid和Validated的区别,随便使用哪个都行
@Valid是使用hibernate validation的时候使用
@Validated 是只用spring Validator校验机制使用
5.jsp页面
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2022/4/1
Time: 0:03
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@include file="../../../common/path.jsp"%>
<%@taglib prefix="a" uri="http://www.springframework.org/tags/form" %>
<html>
<style>
.cl{
color:red;
}
</style>
<head>
<title>Title</title>
</head>
<body>
<h1>书本新增</h1>
<a:form action="${path}/book/addBook" method="post" modelAttribute="book">
<label>书本名称:</label><input type="text" name="bname"/><a:errors cssClass="cl" path="bname" /><br/>
<label>书本价格:</label><input type="text" name="bprice"/><a:errors cssClass="cl" path="bprice" /><br/>
<label>书本类型:</label><input type="text" name="btype"/><a:errors cssClass="cl" path="*" /><br/>
<input type="submit" value="新增"/>
</a:form>
</body>
</html>
6.测试
四、分组验证
1.给校验对象的指定属性添加校验规则,并指定校验组
package com.zking.ssm.book.model;
import lombok.Builder;
import lombok.ToString;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.Range;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
@ToString
@Builder
public class Book {
// 书本验证分组
public static interface ValidateGroups {
// 新增
public static interface Add {
}
// 修改
public static interface Edit {
}
// 更新封面
public static interface Del {
}
}
@NotNull(message = "编号不能为空",groups = {ValidateGroups.Del.class,ValidateGroups.Edit.class})
private Integer bid;
@NotBlank(message = "名字不能为空",groups = {ValidateGroups.Add.class,ValidateGroups.Edit.class})
private String bname;
private String bpinyin;
@NotNull(message = "价格不能为空",groups = {ValidateGroups.Del.class,ValidateGroups.Edit.class})
@Range(min=10,max=200,message="价格必须在10-200之间")
private Float bprice;
private String btype;
private String bimages;
public Book(Integer bid, String bname, String bpinyin, Float bprice, String btype,String bimages) {
this.bid = bid;
this.bname = bname;
this.bpinyin = bpinyin;
this.bprice = bprice;
this.btype = btype;
this.bimages=bimages;
}
public Book() {
super();
}
public Integer getBid() {
return bid;
}
public void setBid(Integer bid) {
this.bid = bid;
}
public String getBname() {
return bname;
}
public void setBname(String bname) {
this.bname = bname;
}
public String getBpinyin() {
return bpinyin;
}
public void setBpinyin(String bpinyin) {
this.bpinyin = bpinyin;
}
public Float getBprice() {
return bprice;
}
public void setBprice(Float bprice) {
this.bprice = bprice;
}
public String getBtype() {
return btype;
}
public void setBtype(String btype) {
this.btype = btype;
}
public String getBimages() {
return bimages;
}
public void setBimages(String bimages) {
this.bimages = bimages;
}
}
2.在请求处理方法中,使用@Validated标记要验证的对象,并指定校验组
/**
* 书本新增
* 请求路径 SSM/book/editBook
* @param book
* @return
*/
@RequestMapping("/addBook")
public String addBook(@Validated(value = {Book.ValidateGroups.Edit.class}) Book book, BindingResult bindingResult){
System.out.println("进入新增方法");
//判断是否验证成功
if(bindingResult.hasErrors()){
System.out.println("验证失败");
//验证失败
return "book/addBook";
}else {
//验证成功
bookService.insert(book);
return "redirect:queryBookPage";
}
}
3.测试
五、组排序
可以通过分组来指定顺序
@GroupSequence({Default.class,IGroup.Update.class, IGroup.Registry.class})
public interface IGroup {
interface Registry extends Default {
}
interface Update extends Default {
}
}