数据校验分为:客户端校验与服务端校验。这边主要讲的是Spring MVC提供的服务端校验功能,一种是Spring 自带的Validation校验框架,一种是利用JSR 303(Java验证规范)实现校验功能。
1.Spring Validation框架(org.springframework.validation)
Spring拥有自己独立的数据校验框架。Spring在进行数据绑定时,可同事调用校验框架来完成数据校验工作。
1.1 Validation重要的接口和类
- Validator(最重要的接口)
对clazz 类型的对象进行校验
boolean supports(Class<?> clazz);
对target对象进行校验,并将校验错误记录记录到errors对象中
void validate(Object target, Errors errors);
Errors(Spring存放错误信息接口)
ValidationUtils
校验工具类,提供了多个给Errors对象保存方法
- LocalValidatorFactoryBean
位于org.springframework.validation.beanvalidation包中,该类既实现利了Spring的Validator接口,也实现了JSR 303的Validation接口。只要在Spring容器中定义了一个LocationValidationFactoryBean,即可将其注入到需要数据校验的Bean中。
- xml配置
<bean class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
<mvc:annotation-driven/>会默认装配好一个LocalValidatorFactoryBean,所以在实际开发中,无须手动再配置xml节点。
2.实现Spring的Validation校验
- 后台代码
public class UserValidator implements Validator {
@Override
public boolean supports(Class<?> clazz) {
return User.class.equals(clazz);
}
@Override
public void validate(Object target, Errors errors) {
ValidationUtils.rejectIfEmpty(errors,"name",null,"用户名不能为空");
ValidationUtils.rejectIfEmpty(errors,"password",null,"密码不能为空");
}
}
@InitBinder
public void initBinder(DataBinder binder) {
binder.setValidator(new UserValidator());
}
@RequestMapping(value = "register", method = RequestMethod.POST)
public String register(@Validated User user, Errors errors) {
if (errors.hasErrors())
return "signup";
return "";
}
- 前端jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<html>
<head>
<title>Sign Up</title>
</head>
<body>
<form:form commandName="user" action="register">
<table>
<tr>
<td>用户名:</td>
<td><form:input path="name"/></td>
<td><form:errors path="name" cssStyle="color:red"/></td>
</tr>
<tr>
<td>密码:</td>
<td><form:input path="password" showPassword="true"/></td>
<td><form:errors path="password" cssStyle="color:red"/></td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="提交">
</td>
</tr>
</table>
</form:form>
</body>
</html>
注意上面的校验方式是在请求入口加上@Validated。如果不想这么写,可以使用@Repository注解将自定义的Validator注释为Spring容器的一个bean。这边就不演示了,了解下就可以了。在实际项目中,我们使用更多的是基于注解式校验。
3. JSR 303校验
JSR 30是Java为Bean数据合法性校验所提供的一个标准规范,叫做Bean Validation。官方参考实现Hibernate Validator
- 引入Jar包
compile group: 'org.hibernate.validator', name: 'hibernate-validator', version: '6.0.0.CR3'
- 在需要校验的类上加上特性标记
public class User implements Serializable {
@NotBlank(message = "用户名不能为空")
private String name;
@NotBlank(message = "用户密码不能为空")
private String password;
}
- 前台页面
前台页面跟上面一致,没有任何改变。看到没,这样的实现的方式是否更优雅。
3.1 JSR 303 注解
注解 | 功能 |
---|---|
@Null | 验证对象是否为null |
@NotNull | 验证对象是否不为null,无法检查长度为0的字符串 |
@Max | 验证Number和String对象是否小于等于指定的值 |
@Min | 验证Number和String对象是否大于等于指定的值 |
@Pattern | 验证String对象是否符合正则表达式 |
@Size(min,max) | 验证对象长度是否在给定的范围内 |
@Digits(interger,fraction) | 验证字符串是否符合格式化的数字 |
@Past | 验证时间对象是否在给定时间之前 |
@Future | 验证时间对象是否在给定时间之后 |
3.2 Hibernate Validator扩展的注解
注解 | 功能 |
---|---|
@NotBlank | 检查约束字符串是不是Null,被Trim的长度是否大于0,只对字符串,且会去掉前后空格 |
@URL | 验证是否是合法的URL |
验证是否是合法的邮件地址 | |
@CreditCardNumber | 验证是否是合法的信用卡号 |
@Length(min,max) | 验证字符串的长度是否在指定的范围 |
@NotEmpty | 检查元素是否为NULL,或者Empty。用于Array、Collection、Map、String |
@Range(min,max,message) | 验证属性值必须在合适的范围内。eg:Range(min=18,max=60,message="学生年龄必须在18岁与60岁之间。") |