zoukankan      html  css  js  c++  java
  • (十)springMvc 校验

    目录

    springMvc 校验 准备

    sprngMvc 使用 hinernate 的校验框架 validation

    导入 validation 框架需要的包 ;

    hibernate-validation 、jboss-logging、validation-api ;


    踩坑

    还是有 版本 的问题,hibernate-validation 的版本不要太高,使用几年前的版本,不要使用新的版本,否则会提示 unsupported major.minor version 52.0 的错误,这错误是告诉我们要使用 JDK1.8,我的是 JDK1.7;

    但是当你把 hibernate-validation 的版本降低以后,你会发现可能还会报错,报错 java.lang.ClassNotFoundException: com.fasterxml.classmate.Fileter ,反正是缺少 classmate 这个包,再去把这个包,加进来,至此,我的工程没有再报错 ;

    搞了一下午,时间全花在这种鸡毛蒜皮的事上了 !!还是回去考南大软院吧,摆脱这种无聊的工作 ;----------- 2018年9月19日17:09:07


    配置校验器

    springMvcxml 中进行配置校验器 ;

        <!--配置校验器-->
        <bean class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
            <!--配置检验器 使用 hibernate 的校验器  -->
            <property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
            <!--指定校验使用的配置文件,如果不指定,则默认读取 classPath : validationMessage.properties-->
            <property name="validationMessageSource" ref="messageSource"/>
        </bean>
    
        <!--配置校验错误信息-->
        <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
            <!--配置资源文件名-->
            <property name="basenames">
                <list>
                    <!--配上错误信息文件地址-->
                   <value>validation.CustomerValidationMessage</value>
                </list>
            </property>
            <!--资源文件编码格式-->
            <property name="fileEncodings" value="UTF-8"/>
            <!--对资源文件的缓存时间,单位为 秒-->
            <property name="cacheMillis" value="120"/>
        </bean>
    

    如果上面的错误校验器,不能读取错误配置信息的内容,就换成下面的:

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

    将校验器注入到适配器中

    发现许多和 handler 有关的东西,都是注入到适配器中的,比如之前的 自定义参数绑定 ;在标签 <mvc:annotation-driven 中定义 ;

    <!--使用注解的映射器、适配器-->
        <mvc:annotation-driven  validator="validatorFactoryBean"/>
    

    在 pojo 中配置校验规则

    使用注解,注意看清注解的包,都是 validation 包下面的注解,不要导错包!

    不要在 message 里面进行错误提示信息的硬编码,将错误提示信息写到之前配置的检验错误文件中 ,进行引用;

      /**
         * 校验字段的长度,message里面写上错误提示信息,这里引用错误提示文件的内容,而非直接硬编码
         */
        @Size(min = 1,max = 7,message = "{Item.name }")
        private String name;
    
        /**
         * 检验时间,不可为空
         */
        @NotNull(message = "{Item.ctrateTime}}" )
        private Date ctrateTime;
    

    在 controller 层进行检验

    handler 的需要检验的形参前面加注解 @Validated ;在需要校验的形参后面添加一个参数 BindingResult 用于接受校验错误信息 ;

    BindingResult@Validated成对使用的,也就是有对个形参需要检验的时候,就写读个 BindingResult@Validated ;并且 BindingResult@Validated 的顺序也是固定的 ;


    获取错误信息

    
    	//        判断是否有错误信息
    	        if (bindingResult.hasErrors()) {
    	//            获取所有错误信息
    	            List<ObjectError> list = bindingResult.getAllErrors();
    	//           打印错误信息
    	            for (ObjectError objectError : list) {
    	                System.out.println(objectError.getDefaultMessage());
    	            }
    	        }
    

    将错误信息传到视图中

    在形参中添加一个 model ,将错误信息封装到其中 ;

      @RequestMapping(value = "/updateItem", method = {RequestMethod.POST})
        public String updateItem(Model model , @Valid Item item, BindingResult bindingResult) throws Exception {
    
    //        判断是否有错误信息
            if (bindingResult.hasErrors()) {
    //            获取所有错误信息
                List<ObjectError> list = bindingResult.getAllErrors();
                model.addAttribute("errorList",list) ;
    //            跳准到 编辑 页面
                return "Item/ItemUpdate";
            }
    
            //      调用 services 层方法
            itemsServices.updateItem(item);
            return "success";
        }
    

    分组检验

    我们将检验规则,以注解的形式写在了 pojo 上,但是当我们多个方法需要对参数进行检验的时候,并且这些方法并不是每个方法都需要对所有的规则进行校验,这时候我们需要进行分组校验 ;

    分组也就是定义一个接口,但是接口中不需要我们做任何事,只是一个空接口,起到分门别类的作用 ;

    我们在 pojo 的检验规则上,添加分组,然后在handler 方法的形参的注解 @Validated 上添加分组value=xxxx.class' 来使用具体的分组校验 ;

      @Size(min = 1,max = 7,message = "{Item.name}",groups = {ItemName.class})
        private String name;
    
     @RequestMapping(value = "/updateItem", method = {RequestMethod.POST})
        public String updateItem(Model model , @Validated(value = {ItemName.class}) Item item, BindingResult bindingResult) throws Exception { 
    	
    	'''''''
    }
    
    

    信息回显

    1. springMvc 默认对 pojo 对象数据进行回显

      pojo 对象传进 controller 方法中时候,springMvc 会自动的将其添加到 request 域中,key 就是 pojo对象类型(首字母小写) ;

    2. @ModelAttribute(“xxx”)

      使用注解,相当于可以随意的更改 key 的值 ;

      在需要回显的 controller 形参前面,加上这个注解 ,它在 request 域中的 key 就是注解中的内容 ;

      @ModelAttribute("xxx") 也可以将方法的返回值,传到页面 ,只需要将该注解,注解到方法上,不需要为其配置 requestMapping ,也就是说该方法不能通过 url 访问到,但是只要到页面上写上 key 值,就可以访问到;


  • 相关阅读:
    Idea快捷键大全
    Minio创建访问策略
    如何把Minio设置成开机启动
    windows10怎么添加开机启动项
    Intellij IDEA中如何配置Maven环境
    MySQL 8.0.19安装和配置超详细教程
    图文详解一台电脑怎么设置两个显示器
    无法加载文件 E:PROGRAM FILESNODEJSNODE_GLOBALyarn.ps1,因为在此系统中禁止执行脚本
    通过MacOS的ssh远程打开linux的firefox(通过X11协议实现图形化显示)
    Java8 stream分组按某字段取最大值
  • 原文地址:https://www.cnblogs.com/young-youth/p/11665654.html
Copyright © 2011-2022 走看看