zoukankan      html  css  js  c++  java
  • springMVC学习(五)校验器Validation

    校验器Validation

    输入验证是Spring处理的最重要Web开发任务之一,SpringMVC使用JSR-303(javaEE6规范的一部分)校验规范, JSR 303 用于对 Java Bean 中的字段的值进行验证,JSR只是一个规范文档,本身用处不大,除非编写了它的实现。用于实现JSR Bean Validation,Hibernate Validator就是它的一个实现,springmvc使用的是Hibernate Validator(和Hibernate的ORM无关),常用JSR 303注解约束:

    • @AssertFalse,验证 Boolean 对象是否为 false(@AssertTrue)

    • @DecimalMax,被标注的值必须不大于约束中指定的最大值. 这个约束的参数是一个通过BigDecimal定义的最大值的字符串表示.小数存在精度(@DecimalMin)

    • @Digits(integer=,fraction=),验证字符串是否是符合指定格式的数字,interger指定整数精度,fraction指定小数精度

    • @Future,验证 Date 和 Calendar 对象是否在当前时间之后 (@Past)

    • @Max,验证 Number 和 String 对象是否小等于指定的值(@Min)

    • @NotNull,验证对象是否不为null, 无法查检长度为0的字符串(@Null)

    • @Pattern,验证 String 对象是否符合正则表达式的规则

    • @Size,验证对象(Array,Collection,Map,String)长度是否在给定的范围之内

    开发步骤:

    • 导入jar包

      • hibernate-validator-6.0.16.Final.jar

      • validation-api-2.1.0.Final.jar

      • jboss-logging-3.4.0.Final

    • ValidationMessages.properties配置文件,配置提示信息

    items.name.length.error=商品名称的长度为1到30个字符
    items.createTime.is.notNull=商品生产日期不能为空
    • springMVC配置文件添加配置

        <!--校验器配置-->
       <!-- 错误信息的校验文件配置 -->
       <bean id="messageSource"
    class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
           <!-- 资源文件名 -->
           <property name="basenames">
               <list>
                   <value>classpath:ValidationMessages</value>
               </list>
           </property>
           <!-- 资源文件编码格式 -->
           <property name="fileEncodings" value="utf-8" />
           <!-- 对资源文件内容缓存时间,单位秒 -->
           <property name="cacheSeconds" value="120" />
       </bean>

       <!-- 配置校验器 -->
       <bean id="validator"
    class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
           <!-- 校验器 -->
           <property name="providerClass" value="org.hibernate.validator.HibernateValidator" />
           <!-- 指定校验使用的资源文件,如果不指定则默认使用classpath下的ValidationMessages.properties -->
           <property name="validationMessageSource" ref="messageSource" />
       </bean>

       <!-- 添加到自定义参数绑定的WebBindingInitializer中 -->
       <bean id="customBinder"
    class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
           <!-- 配置validator -->
           <property name="validator" ref="validator" />
       </bean>

       <!-- WebBindingInitializer添加到适配器中 -->
       <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
           <!-- 在webBindingInitializer中注入自定义属性编辑器、自定义转换器 -->
           <property name="webBindingInitializer" ref="customBinder"/>
       </bean>
    • 在POJO中定义规则

    public class Items {
       private Integer id;
       @Size(min = 1,max = 30,message = "{items.name.length.error}")
       private String name;
       @NotNull(message = "{items.createTime.is.notNull}")
       private Date createTime;
    //Getter and Setter
    }
    • 验证时,在controller里面用@Validated表示该实体(参数)需要验证,然后用BindingResult对象接受验证结果,当验证不通过时BindingResult就会接受对应的错误提示信息

        @RequestMapping("/valid.action")
       public void valid(@RequestBody @Validated Items items, BindingResult result){
           List<ObjectError> errors=result.getAllErrors();
           for(ObjectError error:errors){
               System.out.println(error.getDefaultMessage());
          }
      }

    分组校验

    分组校验其实就是为了我们的校验更加灵活,针对不同的 Controller方法达到个性化验证;比如:修改商品信息,只校验日期不为空。那么此时,我们就可以用到分组校验了,开发步骤:

    • 定义分组的接口(接口不定义方法,只作为一个标识)

    public interface ValidateGroup1 {
    }
    • 定于校验规则属于哪一各组( @Size、@NotNull 中添加 groups属性)

        @NotNull(message = "items.id.is.notNull",groups = {ValidateGroup1.class})
       private Integer id;
    • 在Controller方法中定义使用校验分组(@Validated 注解属性value 指明哪个分组,@Validated(value={ValidateGroup1.class})

        @PostMapping("/valid1.action")
       public void valid1(@RequestBody @Validated(value = {ValidateGroup1.class}) Items items, BindingResult result){
           List<ObjectError> errors=result.getAllErrors();
           for(ObjectError error:errors){
               System.out.println(error.getDefaultMessage());
          }
      }

     

  • 相关阅读:
    【转载】Altium Designer多图纸功能
    【原创】使用Ultra Librarian为Altium Designer 09生成元器件库
    【笔记】niosII与win7兼容性解决方法
    【转载】关于FSM
    【原创】在仿真中如何使用好parameter?
    【转载】 $dispaly()、$strobe()、$monitor() 、$fwrite()與blocking / nonblocking的關係
    【转载】使用Debussy+ModelSim快速查看前仿真波形
    将博客搬至CSDN
    perl 替换一例
    linux shell常用快捷键(转载)
  • 原文地址:https://www.cnblogs.com/yjh1995/p/14164376.html
Copyright © 2011-2022 走看看