小工具知识网

当前位置: 首页 > 行业知识 > SpringMVC 学习(十一)之数据校验

行业知识

SpringMVC 学习(十一)之数据校验

2026-11-03 14:25:52 来源:互联网转载

���录

1 数据校验介绍

2 普通校验

3 分组校验

4 参考文档


1 数据校验介绍

在实际的项目中,一般会有两种校验数据的方式:客户端校验和服务端校验

  • 客户端校验:这种校验一般是在前端页面使用 JS 代码进行校验,主要是验证输入数据的合法性,不合法的数据则没有必要再发送至服务端了。前端校验可以有效的提高用户体验,但是无法确保数据完整性,因为前端用户可以方便的拿到请求地址,然后直接发送请求,传递非法参数
  • 服务端校验:可以有效的保证数据安全与完整性,但是用户体验要差一点,所以客户端校验和服务端校验通常两者结合使用

            SpringMVC 提供了两种方法来对用户的输入数据进行校验:一种是 SpringMVC 自带的 Validation 校验框架,它提供了简洁的注解和验证规则,易于使用,并且与 SpringMVC 框架集成良好;另一种是利用 JRS-303 验证框架进行验证,JRS-303 验证框架的优势在于它的灵活性和可扩展性,可以与其他框架或技术进行集成。

    注解作用
    @Null标注的属性必须为null
    @NotNull标注的属性必须不为null
    @AssertTrue标注的属性必须为true
    @AssertFalse标注的属性必须为false
    @Min(value)标注的属性必须是一个数字,并且其值必须大于或等于value
    @Max(value)标注的属性必须是一个数字,并且其值必须小于或等于value
    @DecimalMin(value)必须大于或等于value
    @DecimalMax(value)必须小于或等于value
    @Size(max,min)大小必须在max和min限定的范围内
    @Digits(integer,fratction)值必须是一个数字,且必须在可接受的范围内
    @Past只能用于日期型,且必须是过去的日期
    @Future只能用于日期型,且必须是将来的日期
    @Pattern(value)必须符合指定的正则表达式
    @Email必须是格式正确的Email地址
    @Length被注释的字符串大小必须在指定的范围内
    @NotEmpty被注释的字符串不能是空字符串
    @Range被注释的元素必须在指定的范围内

    @NotEmpty、@NotNull 和 @NotBlank 三种的区别:

    • @NotNull:一般用在基本数据类型上(包括包装类),对象不能为 null,但可以为 empty,即为空集(size = 0)。
    • @NotEmpty:可以作用在 String、List、Map 和 Array 等,对象不能为 null,而且长度必须大于0 (size > 0)
    • @NotBlank:只能作用在 String 上,不能为 null,而且调用 trim() 后,长度必须大于 0 ,即必须有实际字符

      2 普通校验

      导入依赖

          org.hibernate.validator    hibernate-validator    6.2.0.Final

      在 SpringMVC 配置文件中配置校验器并注入到处理器适配器中

                                                  classpath:CustomValidationMessages                            

      创建 CustomValidationMessages.properties 配置文件,和上述代码中的校验错误信息配置文件名对应(也可以将错误提示信息放在一个类中)

      #添加校验错误提示信息user.id.isEmpty="用户的ID不能为空!"user.userName.isEmpty="用户名不能为空!"user.userName.length="用户名为1~6个字符!"user.userPwd.isEmpty="密码不能为空!"user.userPwd.length="密码的长度为5~15个字符!"user.userEmail.isEmpty="邮箱不能为空!"user.userEmail.format="输入的邮箱格式不正确!"

      需要校验的类 User

      public class User {    @NotNull(message = "{user.id.isEmpty}")    private Integer id;    @NotEmpty(message = "{user.userName.isEmpty}")    @Length(min = 1, max = 6, message = "{user.userName.length}")    private String userName;    @NotEmpty(message = "{user.userPwd.isEmpty}")    @Length(min = 5, max = 15, message = "{user.userPwd.length}")    private String userPwd;    @NotEmpty(message = "{user.userEmail.isEmpty}")    @Email(message = "{user.userEmail.format}")    private String userEmail;    // 省略了 Getter、Setter 方法

      校验控制器

      @Validated 注解和 BindingResult 是成对出现的,中间不能穿插其它的形参,否则会报 400错误,其他形参只能加在它们后面

      @Controllerpublic class ValidateController {    @ResponseBody    @RequestMapping("/validate")    // 形参前面加上 @Validated 注解表示这个实体类需要进行数据校验    // BindingResult 封装数据绑定的校验结果    public void validate(@Validated User user, BindingResult bindingResult) {        if (bindingResult.hasErrors()) {            //校验未通过,获取所有的异常信息并展示出来            List allErrors = bindingResult.getAllErrors();            for (ObjectError allError : allErrors) {                System.out.println(allError.getObjectName() + ":" + allError.getDefaultMessage());            }        }    }}

      index.jsp

      与 private String userName; 对应

                  添加用户                            ID号: 
      姓名:
      密码:
      邮箱:

      执行结果

       

      3 分组校验

              某个属性设置了多种数据校验,可以将这些校验分组,然后 Controller 方法选择校验分组对数据进行校验

      首先定义校验组,所谓的校验组,它其实就是空接口:

      // 分组校验接口1public interface ValidationGroup1 {}// 分组校验接口2public interface ValidationGroup2 {}

      对校验进行分组

      public class User {    // groups属性表示校验属于哪个组,可以定义多个    @NotNull(message = "{user.id.isEmpty}", groups = {ValidationGroup2.class})    private Integer id;    @NotEmpty(message = "{user.userName.isEmpty}", groups = {ValidationGroup1.class, ValidationGroup2.class})    @Length(min = 1, max = 6, message = "{user.userName.length}", groups = {ValidationGroup1.class, ValidationGroup2.class})    private String userName;    @NotEmpty(message = "{user.userPwd.isEmpty}", groups = {ValidationGroup1.class})    @Length(min = 5, max = 15, message = "{user.userPwd.length}", groups = {ValidationGroup1.class})    private String userPwd;    @NotEmpty(message = "{user.userEmail.isEmpty}", groups = {ValidationGroup2.class})    @Email(message = "{user.userEmail.format}", groups = {ValidationGroup2.class})    private String userEmail;    // getter setter 构造器 toString 省略...}

      执行结果

      4 参考文档

      SpringMVC入门学习(十五)----数据校验 - 唐浩荣 - 博客园 (cnblogs.com)

      springMVC如何对输入数据校验实现代码_java_脚本之家 (jb51.net)

上一篇:宝塔面板升级与否,后果揭秘,风险解析!

下一篇:已解决org.springframework.beans.factory.BeanDefinitionStoreException异常的正确解决方法,亲测有效!!!