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

最新文章

  1. 一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
  2. Wordpress上传到阿里云服务器
  3. 【Swift学习】Swift编程之旅---Subscripts下标(十六)
  4. Java基础 静态块、非静态块、构造函数的执行顺序
  5. maven仓库介绍《本地仓库、远程仓库》
  6. jsp+oracle实现数据库内容以表格形式在前台显示(包含分页)
  7. Android videoview循环播放视频
  8. Gradle构建Java Web应用:Servlet依赖与Tomcat插件(转)
  9. Day19 Django
  10. java游戏开发杂谈 - java编程怎么学
  11. Relativelayout和LinearLayout对比分析
  12. jQuery.cookie应用操作
  13. Android自定义控件进阶-打造Android自定义的下拉列表框控件
  14. replication-manager 搭建
  15. linux配置java环境
  16. 【Python】Python处理csv文件
  17. [转]VMware-Transport(VMDB) error -44:Message.The VMware Authorization Service is not running解决方案
  18. Java-Minor GC、Major GC、Full GC
  19. Spring注解@Resource和@Autowired的区别
  20. Linux下为Eclipse安装hadoop插件

热门文章

  1. javascript 完美解决对联广告
  2. Spring Cloud Sleuth 服务跟踪
  3. Ubuntu free以及Linux内存占用大的解释
  4. underscore-1.8.3-analysis.js
  5. IntelliJ IDEA 13.1.3 SVN无法正常使用问题
  6. 【转】VSCode Web开发插件
  7. Linux定时任务工具crontab详解及系统时间同步
  8. Java处理JSON的工具类(List、Map和JSON之间的转换)——依赖jsonlib支持Map嵌套
  9. Java虚拟机性能管理神器 - VisualVM(4) - JDK版本与VisualVM版本对应关系
  10. Bioperl 解析blast的输出结果