• 简介

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

  服务端校验:

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

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

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

  • springmvc校验

  springmvc使用hibernate的校验框架validation。

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

  • 环境准备

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

  • 配置校验器
  1. <!-- 校验器 -->
  2. <bean id="validator"
  3. class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
  4. <!-- hibernate校验器-->
  5. <property name="providerClass" value="org.hibernate.validator.HibernateValidator" />
  6. <!-- 指定校验使用的资源文件,在文件中配置校验错误信息,如果不指定则默认使用classpath下的ValidationMessages.properties -->
  7. <property name="validationMessageSource" ref="messageSource" />
  8. </bean>
  9. <!-- 校验错误信息配置文件 -->
  10. <bean id="messageSource"
  11. class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
  12. <!-- 资源文件名-->
  13. <property name="basenames">
  14. <list>
  15. <value>classpath:CustomValidationMessages</value>
  16. </list>
  17. </property>
  18. <!-- 资源文件编码格式 -->
  19. <property name="fileEncodings" value="utf-8" />
  20. <!-- 对资源文件内容缓存时间,单位秒 -->
  21. <property name="cacheSeconds" value="120" />
  22. </bean>
  • 校验器注入到处理器适配器中
  1. <mvc:annotation-driven conversion-service="conversionService"
  2. validator="validator"></mvc:annotation-driven>
  • 在POJO中添加校验规则
  1. //字符长度在1-30个字符之间
  2. //message提示校验出错显示的信息
  3. @Size(min=1,max=30,message="{items.length.error.message}")
  4. private String name;
  5. //创建日期非空校验
  6. @NotNull(message="{items.createtime.isNull}")
  7. private Date createtime;
  • 校验信息配置文件

  CustomValidationMessages.properties

  • 捕获校验错误和页面显示校验错误信息 

  

  1. // 商品信息修改提交
  2. @RequestMapping("/editItemsSubmit")
  3. public String editItemsSubmit(HttpServletRequest request, Integer id,
  4. @Validated ItemsCustom itemsCustom,BindingResult bindingResult) throws Exception {
  5. //获取校验错误信息
  6. if(bindingResult.hasErrors()){
  7. //输出错误信息
  8. List<ObjectError> allerrors = bindingResult.getAllErrors();
  9. for (ObjectError objectError : allerrors) {
  10. System.out.println(objectError.getDefaultMessage());
  11. }
  12. //将错误信息回显到页面
  13. request.setAttribute("allerrors", allerrors);
  14. return "items/editItems";
  15. }
  16. // 调用service更新商品信息,页面需要将商品信息传到此方法
  17. itemsService.updateItems(id, itemsCustom);
  18.  
  19. // 重定向到商品查询列表
  20. // return "redirect:queryItems.action";
  21. // 页面转发
  22. return "forward:queryItems.action";
  23. // return "success";
  24. }

  页面显示错误信息:

  1. <!-- 显示错误信息 -->
  2. <c:if test="${allErrors!=null }">
  3. <c:forEach items="${allErrors }" var="error">
  4. ${ error.defaultMessage}<br/>
  5. </c:forEach>
  6. </c:if>
  • 校验分组

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

  解决方法:定义多个校验分组(其实是一个java接口),分组中定义有哪些规则,每个controller方法使用不同的校验分组。

  1、校验分组

  1. public interface ValidGroup1 {
  2. //接口中不需要定义任何方法,仅是对不同的校验规则进行分组
  3. //此分组只校验商品名称长度
  4.  
  5. }

  2、在校验中添加分组信息

  1. @Size(min=1,max=30,message="{items.length.error.message}",groups={ValidGroup1.class})
  2. private String name;

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

  1. public String editItemsSubmit(HttpServletRequest request, Integer id,
  2. @Validated(value={ValidGroup1.class}) ItemsCustom itemsCustom,BindingResult bindingResult) throws Exception

  主要添加如下信息:@Validated(value={ValidGroup1.class})

  注解的主要用法:

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

SpringMVC学习--校验的更多相关文章

  1. 【SpringMVC学习06】SpringMVC中的数据校验

    这一篇博文主要总结一下springmvc中对数据的校验.在实际中,通常使用较多是前端的校验,比如页面中js校验,对于安全要求较高的建议在服务端也要进行校验.服务端校验可以是在控制层conroller, ...

  2. SpringMVC学习笔记之二(SpringMVC高级参数绑定)

    一.高级参数绑定 1.1 绑定数组 需求:在商品列表页面选中多个商品,然后删除. 需求分析:功能要求商品列表页面中的每个商品前有一个checkbok,选中多个商品后点击删除按钮把商品id传递给Cont ...

  3. (转)SpringMVC学习(十二)——SpringMVC中的拦截器

    http://blog.csdn.net/yerenyuan_pku/article/details/72567761 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter, ...

  4. springmvc学习笔记(10)-springmvc注解开发之商品改动功能

    springmvc学习笔记(10)-springmvc注解开发之商品改动功能 标签: springmvc springmvc学习笔记10-springmvc注解开发之商品改动功能 需求 开发mappe ...

  5. 【springmvc学习】常用注解总结

    @Controller 在springmvc中,我们用它来告诉前端控制器,他这个类是controller,也就是springmvc的一个对象了,我们在spring.xml配置文件中用<conte ...

  6. SpringMVC学习系列-后记 解决GET请求时中文乱码的问题

    SpringMVC学习系列-后记 解决GET请求时中文乱码的问题 之前项目中的web.xml中的编码设置: <filter> <filter-name>CharacterEnc ...

  7. 史上最全的SpringMVC学习笔记

    SpringMVC学习笔记---- 一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于Spring ...

  8. SpringMVC学习系列-后记 开启项目的OpenSessionInView

    在系列的 SpringMVC学习系列(12) 完结篇 的示例项目中,由于当时考虑到OpenSessionInView会对性能有一定的影响,所以就没有配置项目的OpenSessionInView.在ma ...

  9. SpringMVC学习系列-后记 结合SpringMVC和Hibernate-validator,根据后台验证规则自动生成前台的js验证代码

    在SpringMVC学习系列(6) 之 数据验证中我们已经学习了如何结合Hibernate-validator进行后台的数据合法性验证,但是通常来说后台验证只是第二道保险,为了更好的用户体验会现在前端 ...

随机推荐

  1. AI(Adobe Illustrator)简单入门——骷髅

    成果: 步骤如下: 一.椭圆工具画正圆 按住shift+alt画一个正圆. 二.圆角矩形工具画矩形 用圆角矩形工具画一个矩形,然后全选水平垂直对齐. 三.画眼睛 利用椭圆工具画一只眼睛,然后按住alt ...

  2. 再不写,我怕就再也不写了-LAMP基础

    hi 经历了4天大餐的洗礼,整个人都思密达了...昨天的懒,是没有原因的懒,总之就是该提笔了亲 1.Ubuntu下的LAMP配置 -----Ubuntu基础知识----- ----管理员权限 出于安全 ...

  3. 跟我一起写 Makefile

    转自 陈皓 的博客:http://blog.csdn.net/haoel/article/details/2886 1. 概述 2. 关于程序的编译和链接 3. Makefile 介绍 4. Make ...

  4. 详细说说 Google Test Certified 的各级——Level 1

    转载请联系作者,谢谢! 当你作为初创企业或项目的唯一测试人员,一个人一杠枪,你如何开始测试的工作?你是作为一条孤狼,面对10个甚至更多的开发,努力的做一条龙服务(加班加到死):还是想从1到11的转变? ...

  5. 【转】最长回文子串的O(n)的Manacher算法

    Manacher算法 首先:大家都知道什么叫回文串吧,这个算法要解决的就是一个字符串中最长的回文子串有多长.这个算法可以在O(n)的时间复杂度内既线性时间复杂度的情况下,求出以每个字符为中心的最长回文 ...

  6. NYOJ-取石子(二)

    取石子(二) 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描述 小王喜欢与同事玩一些小游戏,今天他们选择了玩取石子. 游戏规则如下:共有N堆石子,已知每堆中石子的数量,并且 ...

  7. POJ3083Catch That Cow[BFS]

    Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 77420   Accepted: 24457 ...

  8. 输出国际象棋&&输出余弦曲线

    输出国际象棋棋盘 #include <stdio.h> #include <stdlib.h> #include <windows.h> int main(){ i ...

  9. css的小问题总结

    1.居中问题 比如让宽度为60%的<div class="box">居中,可以再.box里面设置margin:auto 2.高度固定的div里面有两个子类div且高度和 ...

  10. 实现PD控制

    尝试为场加入PD控制 在之前的模拟中,需要最小化一个能量函数H. 这样做的原因是,由理想约束的特性(约束反力垂直于虚位移),对于不含体积蒙皮的情况,可以推出 对于表面点,有 J^T * Σfs = 0 ...