(十)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 值,就可以访问到;


posted @ 2018-09-19 23:24  Yiaz  阅读(150)  评论(0编辑  收藏  举报