zoukankan      html  css  js  c++  java
  • 使用SpringMVC的@Validated注解验证的实现

    1、SpringMVC验证@Validated的使用

    第一步:编写国际化消息资源文件

    编写国际化消息资源ValidatedMessage.properties文件主要是用来显示错误的消息定制

    1
    2
    3
    edit.username.null=用户名不能为空
    edit.password.size=密码最少{min}位,最长{max}位
    ......

    可以将edit.username.null与edit.password.size看为参数,在message中传递,具体请看第二步。

    第二步:Bean实体类中加注解

    首先介绍关于验证注解的类型种类

    @Null 限制只能为null
    @NotNull 限制必须不为null
    @AssertFalse 限制必须为false
    @AssertTrue 限制必须为true
    @DecimalMax(value) 限制必须为一个不大于指定值的数字
    @DecimalMin(value) 限制必须为一个不小于指定值的数字
    @Digits(integer,fraction) 限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction
    @Future 限制必须是一个将来的日期
    @Max(value) 限制必须为一个不大于指定值的数字
    @Min(value) 限制必须为一个不小于指定值的数字
    @Past 验证注解的元素值(日期类型)比当前时间早
    @Pattern(value) 限制必须符合指定的正则表达式
    @Size(max,min) 限制字符长度必须在min到max之间
    @NotEmpty 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)
    @NotBlank 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格
    @Email 验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式

    使用 这些注解很简单,只需要在实体类中的变量属性前面加上该注解即可。

    1
    2
    3
    4
    5
    6
    7
    8
    public class User {
      private String id;
      @NotEmpty(message = "{edit.username.null}")
      private String username;
      @Size(min=6 ,max= 20 ,message = "{edit.password.size}")
      private String password;
      ......
    }

    其中{}相当于占位符,将min、max参数传图,同时也将消息文件中定制的错误信息传入,当然也可以直接不使用国际化文件,但是推荐使用,方便统一与修改。

    1
    2
    3
    4
    5
    6
    7
    8
    public class User {
      private String id;
      @NotEmpty(message = "用户名不能为空")
      private String username;
      @Size(min=6 ,max= 20 ,message = "密码最少6位,最高20位")
      private String password;
      ......
    }

    第三步:Controller层的编写

    Controller层的使用,很简单。需要在相应的方法传入的Bean参数前面增加注解@Validated,还有增加BindingResult参数即可,具体请看代码示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @Controller
    public class UserController {
      
      @RequestMapping("/save")
      public String save(@Validated User user, BindingResult result) {
        if(result.hasErrors()) {
          return "error";
        }
        return "success";
      }
    }

    第四步:在View层显示错误信息

    这里就不做介绍了,实际项目中会封装好相应的javcscript等方法,只需要调用就可以返回页面提示给用户错误信息。

    2、@Validated的分组特性

    先在记录之前,介绍一下这样的场景:在对用户的帐号密码进行编辑保存以及新增是两种不一样的情况。

    编辑修改->保存:只需要验证username与password是否符合条件即可,不需要验证id(因为在数据库中id已经存在)。

    新增->保存:新增需要验证username与password是否符合条件,还要验证id。

    这时候就用到groups分组分情况对Bean属性变量进行验证,也可以满足多验证。具体的需要一下两个步骤

    第一步:创建分组接口类

    分组接口类只是普通的接口类并没有多大意义,只是用来标识这个属性哪种情况下被验证,这类似于java.io.Serializable  

    1
    2
    3
    4
    public interface addUser{
    }
    public interface editUser{
    }

    第二步:Controller方法参数中增加xxx.class接口

    在对新增的用户进行ID验证,增加@Validated({addUser.class})接口类用来表示新增的User.getId()需要验证。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @Controller
    public class UserController {
      
      @RequestMapping("/saveAdd")
      public String saveAddUser(@Validated({addUser.class}) User user, BindingResult result) {
        if(result.hasErrors()) {
          return "error";
        }
        return "success";
      }

    第三步:Bean中添加groups分组

    在User实体类中添加groups分组@NotEmpty(groups={addUser.class})与UserController中@Validated({addUser.class})对应,说明在执行saveAddUser新增用户的情况下,才对新增的用户id进行验证。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class User { 
      //在分组addUser时,验证id不能为空,其他情况下不做验证
      @NotEmpty(groups={addUser.class})
      private String id;
      @NotEmpty(message = "用户名不能为空")
      private String username;
      @Size(min=6 ,max= 20 ,message = "密码最少6位,最高20位")
      private String password;
      ......
    }

    以上三步就可以简单地完成分组验证,但是对分组验证补充一下三点:

    第一是:不分配groups分组时,默认每次都需要验证。

    第二是:通过groups分组可以对同一个变量进行多个验证,如下代码

    1
    2
    3
    4
    //对用户名进行两次不同情况的验证。
    @NotEmpty(groups={First.class})
    @Size(min=1,max=10,groups={Second.class})
    public String username;

    第三是:默认的情况下,不同的分组约束验证是无序的,但是在有些情况下验证的相互约束很重要(比如前一个组验证失败,后面的将不再验证等情况),所以groups分组的验证也有前后验证顺序。使用@GroupSequence注解进行排序。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    /*
     * 分组顺序接口类
     */
    import javax.validation.GroupSequence;
    //分组序列先Frist再Second
    @GroupSequence({First.class,Second.class})
    public interface Group{
    }
      
    @Controller
    public class UserController {
      
      @RequestMapping("/saveAdd")
      public String saveAddUser(@Validated({Group.class}) User user, BindingResult result) {
        if(result.hasErrors()) {
          return "error";
        }
        return "success";
      }

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

  • 相关阅读:
    第四次课堂作业
    12周课后作业
    12周上机(5.21)
    11周周五课后作业
    11周上机作业(5.14)
    第十周(5.7)上机
    第九周4.30上机作业
    第八周周五课后作业
    4.23 第八周上机作业
    4.17课后作业
  • 原文地址:https://www.cnblogs.com/zhoading/p/12626577.html
Copyright © 2011-2022 走看看