logo头像

不破不立

SpringMVC数据校验

SpringMVC使用验证框架 Bean Validation提供了对于数据的校验功能,添加 validation-api 和hibernate-validator依赖,即可对于前台传递的数据进行校验。

一、添加依赖

1
2
3
4
5
6
7
8
9
10
11
<!--数据校验-->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.4.1.Final</version>
</dependency>

二、对实体进行注解标志验证类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import org.springframework.format.annotation.DateTimeFormat;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
import java.util.Date;

/**
* 身份证
*/
public class Card {

@Size(min = 2,max = 10,message = "长度介于2-10个字符之间")
private String name;

@Pattern(regexp = "^[1-9][0-9]{5}(19|20)[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|31)|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}([0-9]|x|X)$",message = "该身份证号无效")
private String number;

@NotNull(message ="{expiringDate.notnull}")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date expiringDate;

省略构造方法和 get set 方法 ...
}

这里的@DateTimeFormat注解用于处理日期类型数据传递,与本文的数据校验没有关系,请查看此文:SpringMVC数据绑定(Date类型)

对面上面@Size注解中的message属性,还可以通过类似于@NotNull注解中的配置方法来统一配置,采用{expiringDate.notnull}方法获取,需要在classpath路径下添加一个 ValidationMessages.properties(或者ValidationMessages_zh_CN.properties) 文件,在里面以键值对的格式配置,如下:

1
expiringDate.notnull=失效日期不能为空

三、Controller层处理

代码如下:

1
2
3
4
5
6
7
8
9
@RequestMapping(value = "/addCard", method = RequestMethod.POST)
public String addCard(@Valid Card card, Errors errors, Model model) {
log.info("{}", card);
if (errors.hasErrors()) {
return "addCard";
}
model.addAttribute("card", card);
return "addCardSuccess";
}

注意@Valid Card card, Errors errors,对需要校验的实体需要增加@Valid注解,同时Errors类需要紧跟需要验证的实体后面。可以自行获取errors对象内部的相关信息,有兴趣的可以自行看看它的源码以及调用它的方法打印一下数据看看。

四、编写测试页面

这里采用了spring的标签,建议去了解一下,很实用。

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
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form" %>
<html>
<head>
<title>添加身份证信息</title>
<link rel="stylesheet" href="<c:url value="/"/>/css/bootstrap.min.css">
<style>
.has-error{
color:red;
}
</style>
</head>
<body>
<sf:form commandName="card" cssClass="form-horizontal" cssStyle="width: 600px;margin: 0 auto" method="post">
<h1 class="col-sm-offset-2">添加身份证信息</h1>
<div class="form-group">
<label class="col-sm-2 control-label" >姓  名:</label>
<div class="col-sm-6" ><sf:input path="name" cssClass="form-control" /></div>
<div class="col-sm-4 has-error"><sf:errors path="name"/></div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label" >身份证号:</label>
<div class="col-sm-6"><sf:input path="number" class="form-control"/></div>
<div class="col-sm-4 has-error"><sf:errors path="number"/></div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label" >失效日期:</label>
<div class="col-sm-6"><sf:input path="expiringDate" class="form-control" type="date"/></div>
<div class="col-sm-4 has-error"><sf:errors path="expiringDate"/></div>
</div>

<div class="form-group">
<div class="col-sm-offset-2 col-sm-5">
<input type="submit" class="btn btn-success btn-block" value="点击添加">
</div>
</div>
</sf:form>
</body>
</html>

五、测试效果

六、源码提供

前往 GitHub:github.com/panhainan/spring-family

下面提供内置的验证约束注解如下表所示(摘自hibernate validator reference):

验证注解 验证的数据类型 说明
@AssertFalse Boolean,boolean 验证注解的元素值是false
@AssertTrue Boolean,boolean 验证注解的元素值是true
@NotNull 任意类型 验证注解的元素值不是null
@Null 任意类型 验证注解的元素值是null
@MIN(value=值) BigDecimal,BigInteger, byte,short, int, long,等任何Number或CharSequence(存储的是数字)子类型 验证注解的元素值大于等于@Min指定的value值
@MAX(value=值) 和@Min要求一样 验证注解的元素值小于等于@Max指定的value值
@DecimalMin(value=值) 和@Min要求一样 验证注解的元素值大于等于@ DecimalMin指定的value值
@DecimalMax(value=值) 和@Min要求一样 验证注解的元素值小于等于@ DecimalMax指定的value值
@Digits(integer=整数位数, fraction=小数位数) 和@Min要求一样 验证注解的元素值的整数位数和小数位数上限
@Size(min=下限, max=上限) 字符串、Collection、Map、数组等 验证注解的元素值的在min和max(包含)指定区间之内,如字符长度、集合大小
@Past java.util.Date,java.util.Calendar;Joda Time类库的日期类型 验证注解的元素值(日期类型)比当前时间早
@Future 与@Past要求一样 验证注解的元素值(日期类型)比当前时间晚
@NotBlank CharSequence子类型 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的首位空格
@Length(min=下限, max=上限) CharSequence子类型 验证注解的元素值长度在min和max区间内
@NotEmpty CharSequence子类型、Collection、Map、数组 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)
@Range(min=最小值, max=最大值) BigDecimal,BigInteger,CharSequence, byte, short, int, long等原子类型和包装类型 验证注解的元素值在最小值和最大值之间
@Email(regexp=正则表达式,flag=标志的模式) CharSequence子类型(如String) 验证注解的元素值是Email,也可以通过regexp和flag指定自定义的email格式
@Pattern(regexp=正则表达式,flag=标志的模式) String,任何CharSequence的子类型 验证注解的元素值与指定的正则表达式匹配
@Valid 任何非原子类型 指定递归验证关联的对象;如用户对象中有个地址对象属性,如果想在验证用户对象时一起验证地址对象的话,在地址对象上加@Valid注解即可级联验证
上一篇

评论系统未开启,无法评论!

如果有好的建议或疑问等可以发送邮件至:panhainan@yeah.net,或者添加QQ:1016593477,将你的建议或者疑问告诉作者,作者会对你的建议进行处理并补充到文章的尾部,谢谢大家的谅解!