Spring MVC的数据校验

数据校验分为:客户端校验与服务端校验。这边主要讲的是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页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>


    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
@Email 验证是否是合法的邮件地址
@CreditCardNumber 验证是否是合法的信用卡号
@Length(min,max) 验证字符串的长度是否在指定的范围
@NotEmpty 检查元素是否为NULL,或者Empty。用于Array、Collection、Map、String
@Range(min,max,message) 验证属性值必须在合适的范围内。eg:Range(min=18,max=60,message="学生年龄必须在18岁与60岁之间。")

你可能感兴趣的:(Spring MVC的数据校验)