未来_我来
因为渴望改变,所以必须努力

springmvc校验

  4.1 校验Validation理解

  b/s系统中对http请求数据的校验多数在客户端进行,这也是出于简单及用户体验性上考虑,但是在一些安全性要求高的系统中服务端校验是不可缺少的,本节主要学习springmvc实现控制层添加校验。

  Spring3支持JSR-303验证框架,JSR-303 是JAVA EE 6 中的一项子规范,叫做Bean Validation,官方参考实现是Hibernate Validator(与Hibernate ORM 没有关系),JSR 303 用于对Java Bean 中的字段的值进行验证。

 

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

 

服务端校验:

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

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

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

 

  4.2 springmvc校验需求

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

 

校验思路:

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

具体需求:

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

 

  4.3 环境准备

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

 

 

  4.4 配置校验器

springmvc.xml中添加:

 

<!-- 校验器 -->
    <bean id="validator"
        class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
        <!-- hibernate校验器 -->
        <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="fileEncodings" value="utf-8" />
        <!-- 对资源文件内容缓存时间,单位秒 -->
        <property name="cacheSeconds" value="120" />
    </bean>

 

  4.5 校验器validator注入到处理器适配器中

    4.5.1 配置方式1

springmvc.xml中配置:

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


    4.5.2 
配置方式2(自学)

   <!-- 自定义webBinder -->
    <bean id="customBinder"
        class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
        <property name="validator" ref="validator" />
    </bean>

    <!-- 注解适配器 -->
    <bean
    class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
        <property name="webBindingInitializer" ref="customBinder"></property>
    </bean>

 

  4.6 在pojo中添加校验规则

在ItemsCustom.java中添加校验规则:

 

 

  4.7 CustomValidationMessages.properties

 

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

 

  4.8 捕获校验错误信息

修改Controller方法:

 

注意:添加@Validated表示在对items参数绑定时进行校验,校验信息写入BindingResult中,在要校验的pojo后边添加BingdingResult, 一个BindingResult对应一个pojo,且BingdingResult放在pojo的后边。

 

  4.9 在页面显示校验错误信息

在controller中将错误信息传到页面即可。

 

 

页面显示错误信息:

 

访问:http://localhost:8080/springmvc_mybatis1217/items/editItemsSubmit.action

 

  4.10 分组校验

    4.10.1 需求

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

 

如果两处校验使用同一个Items类则可以设定校验分组,通过分组校验可以对每处的校验个性化。

 

解决方法:

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

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

 

 

    4.10.2 校验分组

定义分组:

分组就是一个标识,这里定义一个接口:

 

public interface ValidGroup1 {
}
public interface ValidGroup2 {
}

 

 

    4.10.3 在校验规则中添加分组

 

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

 

 

在@Validated中添加value={ValidGroup1.class}表示商品修改使用了ValidGroup1分组校验规则,也可以指定多个分组中间用逗号分隔,

@Validated(value={ValidGroup1.classValidGroup2.class })

 

再次访问测试:http://localhost:8080/springmvc_mybatis1217/items/editItemsSubmit.action

  4.11 校验注解

@Null   被注释的元素必须为 null   

@NotNull    被注释的元素必须不为 null   

@AssertTrue     被注释的元素必须为 true   

@AssertFalse    被注释的元素必须为 false   

@Min(value)     被注释的元素必须是一个数字,其值必须大于等于指定的最小值   

@Max(value)     被注释的元素必须是一个数字,其值必须小于等于指定的最大值   

@DecimalMin(value)  被注释的元素必须是一个数字,其值必须大于等于指定的最小值   

@DecimalMax(value)  被注释的元素必须是一个数字,其值必须小于等于指定的最大值   

@Size(max=, min=)   被注释的元素的大小必须在指定的范围内   

@Digits (integer, fraction)     被注释的元素必须是一个数字,其值必须在可接受的范围内   

@Past   被注释的元素必须是一个过去的日期   

@Future     被注释的元素必须是一个将来的日期   

@Pattern(regex=,flag=)  被注释的元素必须符合指定的正则表达式   

Hibernate Validator 附加的 constraint   

@NotBlank(message =)   验证字符串非null,且长度必须大于0   

@Email  被注释的元素必须是电子邮箱地址   

@Length(min=,max=)  被注释的字符串的大小必须在指定的范围内   

@NotEmpty   被注释的字符串的必须非空   

@Range(min=,max=,message=)  被注释的元素必须在合适的范围内

posted on 2018-01-24 20:44  未来_我来  阅读(204)  评论(0编辑  收藏  举报

2 3
4