SpringMVC学习笔记(十一)——SpringMVC校验

一、校验理解

项目中,通常使用较多是前端的校验,比如页面中js校验。对于安全要求较高点建议在服务端进行校验。

服务端校验:

控制层conroller:校验页面请求的参数的合法性。在服务端控制层conroller校验,不区分客户端类型(浏览器、手机客户端、远程调用)

业务层service(使用较多):主要校验关键业务参数,仅限于service接口中使用的参数。

持久层dao:一般是不校验的。

二、springmvc校验需求

springmvc使用hibernate的校验框架validation(和hibernate没有任何关系)。

校验思路: 

页面提交请求的参数,请求到controller方法中,使用validation进行校验。如果校验出错,将错误信息展示到页面。 

具体需求: 

商品修改,添加校验(校验商品名称长度,生产日期的非空校验),如果校验出错,在商品修改页面显示错误信息。’

三、环境准备

hibernate的校验框架validation所需要jar包: 

这里写图片描述

四、配置校验器

springmvc.xml配置文件中配置:

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

五、校验器注入到处理器适配器中

springmvc.xml中的

<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>

1

中加入validator属性:

<mvc:annotation-driven conversion-service="conversionService" validator="validator">
    </mvc:annotation-driven>

六、在pojo中添加校验规则

这里写图片描述

七、配置校验错误信息

CustomValidationMessages.properties配置校验错误信息:

#添加校验的错误信息
items.name.length.error="请输入1~30个字符"
items.createtime.isNull.error="请输入商品的生产日期"

在这里可能会遇到中文乱码问题,原因是配置文件的默认编码方式为iso8859-1,控制台的编码默认好像是gbk,只要都配置为utf-8就可以了,此外如果都配置为utf-8后仍有乱码,可以参考springmvc 使用validation校验无法加载properties文件,及验证信息乱码的问题

八、捕获校验错误信息

    //商品信息修改提交
    //在需要校验的pojo前面添加@Validated注解,在后面添加BindingResult参数,来接收校验出错的信息
    //注意@Validated和BindingResult是配对出现的
    @RequestMapping("/editItemsSubmit")
    public String editItemsSubmit(Model model,Integer id,  
            @Validated ItemsCustom itemsCustom, BindingResult bindingResult) throws Exception {
        //获取校验的错误信息
        if(bindingResult.hasErrors()) {
            //输出错误信息
            List<ObjectError> allErrors = bindingResult.getAllErrors();
            for(ObjectError objectError : allErrors) {
                System.out.println(objectError.getDefaultMessage());
            }
            //将错误信息传到页面
            model.addAttribute("allErrors", allErrors);
        }

        itemsService.updateItems(id, itemsCustom);
        //重定向
        return "items/editItems";
    }

九、部署调试

这里写图片描述

十、分组校验

需求: 

pojo中定义校验规则,而pojo是被多个controller所共用,当不同的controller方法对同一个pojo进行校验,但是每个controller方法需要不同的校验。

解决方法: 

定义多个校验分组(其实是一个java接口),分组中定义有哪些规则 

每个controller方法使用不同的校验分组 

1、写校验分组

package com.jiayifan.ssm.controller.validation;
/**
 * 校验分组
 * @author 贾一帆
 *
 */
public interface VaildGropOne {
    //接口中不需要定义任何方法,仅是对不同的校验规则进行分组\
    //此分组只校验商品的名称长度
}

2、在校验规则中添加分组 

这里写图片描述

3、在controller方法使用指定分组的校验

    //商品信息修改提交
    //在需要校验的pojo前面添加@Validated注解,在后面添加BindingResult参数,来接收校验出错的信息
    //注意@Validated和BindingResult是配对出现的
    //value= {VaildGropOne.class}指定使用分组
    @RequestMapping("/editItemsSubmit")
    public String editItemsSubmit(Model model,Integer id,  
            @Validated(value= {VaildGropOne.class}) ItemsCustom itemsCustom, BindingResult bindingResult) throws Exception {
        //获取校验的错误信息
        if(bindingResult.hasErrors()) {
            //输出错误信息
            List<ObjectError> allErrors = bindingResult.getAllErrors();
            for(ObjectError objectError : allErrors) {
                System.out.println(objectError.getDefaultMessage());
            }
            //将错误信息传到页面
            model.addAttribute("allErrors", allErrors);
        }

        itemsService.updateItems(id, itemsCustom);
        //重定向
        return "items/editItems";
    }

3、部署调试 

这里写图片描述

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值