SpringMVC学习--校验

  • 简介

  项目中,通常使用较多是前端的校验,比如页面中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、校验分组

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

}

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

时间: 2024-12-26 13:01:22

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

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

这一篇博文主要总结一下springmvc中对数据的校验.在实际中,通常使用较多是前端的校验,比如页面中js校验,对于安全要求较高的建议在服务端也要进行校验.服务端校验可以是在控制层conroller,也可以是在业务层service,controller校验页面请求的参数的合法性,在服务端控制层conroller的校验,不区分客户端类型(浏览器.手机客户端.远程调用):service层主要校验关键业务参数,仅限于service接口中使用的参数.这里主要总结一下何如使用springmvc中contr

springmvc学习笔记(14)-springmvc校验

springmvc学习笔记(14)-springmvc校验 springmvc学习笔记14-springmvc校验 校验理解 springmvc校验需求 环境准备 配置校验器 在pojo中添加校验规则 捕获和显示校验错误信息 分组校验 本文主要介绍springmvc校验,包括环境准备,校验器配置,pojo张添加校验规则,捕获和显示检验错误信息以及分组校验简单示例. 校验理解 项目中,通常使用较多是前端的校验,比如页面中js校验.对于安全要求较高点建议在服务端进行校验. 服务端校验: 控制层con

SpringMVC 学习笔记(六) 数据绑定和JSR校验

① Spring MVC 主框架将 ServletRequest 对象及目标方法的入参实例传递给 WebDataBinderFactory 实例,以创建 DataBinder 实例对象 ② DataBinder 调用装配在 Spring MVC 上下文中的ConversionService 组件进行数据类型转换.数据格式化工作.将 Servlet 中的请求信息填充到入参对象中 ③ 调用 Validator 组件对已经绑定了请求消息的入参对象进行数据合法性校验,并最终生成数据绑定结果Binding

springmvc学习笔记(20)-拦截器

springmvc学习笔记(20)-拦截器 springmvc学习笔记20-拦截器 拦截定义 拦截器配置 针对HandlerMapping配置 类似全局的拦截器 拦截测试 拦截器应用实现登陆认证 需求 登陆controller方法 登陆认证拦截实现 本文主要介绍springmvc中的拦截器,包括拦截器定义和的配置,然后演示了一个链式拦截的测试示例,最后通过一个登录认证的例子展示了拦截器的应用 拦截定义 定义拦截器,实现HandlerInterceptor接口.接口中提供三个方法. public

SpringMVC学习笔记(二)

复习: springmvc框架: DispatcherServlet 前端控制器:接收request,进行response HandlerMapping 处理器映射器:根据url查找Handler(通过xml配置方式或注解方式) HandlerAdapter 处理器适配器:决定了用何种特定规则去编写和之后执行Handler. Handler处理器(后端控制器):需要程序员编写,常用注解开放方式. Handler处理器执行后结果是ModelAndView,具体开发是Handler返回方法值类型包括

springMVC学习笔记汇总(持续更新)

SpringMVC 学习笔记(一) Hello World SpringMVC 学习笔记(二) @RequestMapping.@PathVariable等注解 SpringMVC 学习笔记(三) 使用ServletAPI 和 实体 做为参数 SpringMVC 学习笔记(四) 处理模型数据 SpringMVC 学习笔记(五) 基于RESTful的CRUD SpringMVC 学习笔记(六) 数据绑定和JSR校验 SpringMVC 学习笔记(七) JSON返回:HttpMessageConve

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

SpringMVC学习(十二)--SpringMVC中的拦截器 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理.本文主要总结一下SpringMVC中拦截器是如何定义的,以及测试拦截器的执行情况和使用方法. SpringMVC中拦截器的定义和配置 SpringMVC中拦截器的定义 在SpringMVC中,定义拦截器要实现HandlerInterceptor接口,并实现该接口中提供的三个方法,如下: public class Inter

《Java从入门到放弃》入门篇:springMVC数据校验

昨天我们扯完了数据传递,今天我们来聊聊数据校验的问题.来,跟着我一起读:计一噢叫,一按艳. 在springMVC中校验数据也非常简单,spring3.0拥有自己独立的数据校验框架,同时支持JSR303标准的校验框架. Spring的DataBinder在进行数据绑定时,会同时调用校验框架完成数据校验工作. 具体使用步骤如下: 1)导入数据校验的JAR包 2)在springmvc的配置文件中添加校验Bean 3)修改实体类,在属性上加上校验的注解 4)修改昨天的login4方法,加上校验的相关代码

SpringMVC学习笔记(二): 日常使用功能

前提: 1.web.xml 和spring-mvc核心配置如:SpringMVC学习笔记(一): 基础知识中注解实现. 2.类的@RequestMapping(value="/annotationController") 3.spring-mvc 推荐使用注解实现. 一.数据的接收 (一)URL参数数据的接收 1.使用 HttpServletRequest 获取参数 <span style="font-size:18px;"><span style