Spring MVC DataBinding/Validation (验证)
JSR-303
JSR-303 是 java 官方推出的一套 Validation 接口。
pom.xml
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.3.6.Final</version> </dependency>
不同的版本使用的方法也不一样。
Bean Validation 中内置的 constraint:
@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=)
被注释的元素必须符合指定的正则表达式
引入 jar 包后,添加验证逻辑,只需要在实体类上加上注解:
package com.xiaobai.entity; import org.hibernate.validator.constraints.NotEmpty; import org.hibernate.validator.constraints.Range; import javax.validation.constraints.*; public class Book { private int id; @NotEmpty(message = "zhe pa shi jia de ba") private String name; @DecimalMax(value = "100",message = "你可能买了本假书吧") private float price; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public float getPrice() { return price; } public void setPrice(float price) { this.price = price; } }
最后,只要在 Controller 的相关字段上添加 @Valid
注解即可启用验证:
package com.xiaobai.controller; import com.xiaobai.entity.Book; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.servlet.LocaleResolver; import org.springframework.web.servlet.ThemeResolver; import javax.imageio.ImageIO; import javax.mail.Multipart; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.text.DateFormat; import java.util.Date; import java.util.Locale; @Controller @RequestMapping("/book") public class BookController { @RequestMapping(method = RequestMethod.GET) public String home(Book book) { return "input"; } @RequestMapping(method = RequestMethod.POST) public String add(@Valid Book book, BindingResult result) { if (result.hasErrors()) return "book_input"; System.out.println("正常业务。。。。"); return "book_home"; } }
网页代码:
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> <style> .error { color: red; } </style> <link href="<spring:theme code="main.style"/>"/> </head> <body style="color: <spring:theme code="main.color" />; background: <spring:theme code="main.bgcolor" />;"> <div> <spring:message code="global.greeting" arguments="兄嘚" /> <br> <a href="/book/cl/zh">中文</a> <a href="/book/cl/en">English.</a> <a href="/book/cl/jp">小日本</a> <br><br> </div> <div> <br> <a href="/book/ct/boy">boy</a> <a href="/book/ct/girl">girl</a> <a href="/book/ct/default">默认</a> <br><br> </div> <form:form action="/book" method="post" modelAttribute="book"> <div> <form:input path="name" placeholder="name"/> <form:errors path="name"/> </div> <div> <form:input path="price" placeholder="price"/> <form:errors path="price"/> </div> <input type="submit"> </form:form> </body> </html>
效果截图: