数据校验分为:客户端校验与服务端校验。这边主要讲的是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配置
会默认装配好一个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页面
Sign Up用户名: | ||
密码: | ||
注意上面的校验方式是在请求入口加上@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岁之间。")