zoukankan      html  css  js  c++  java
  • SpringMVC由浅入深day02_4springmvc校验

    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=)  被注释的元素必须在合适的范围内

  • 相关阅读:
    什么是枚举?有什么作用?有什么好处?
    java获取某个范围内的一个随机数
    java中普通代码块,构造代码块,静态代码块的区别及代码示例
    Oracle数据库迁移
    linux下修改文件权限
    <%@ include file="">和<jsp:include file="">区别
    JAVA常见异常解析
    jdk环境变量配置
    jstl中fmt标签详解
    jsp脚本元素
  • 原文地址:https://www.cnblogs.com/justdoitba/p/8343297.html
Copyright © 2011-2022 走看看