SpringMVC教程--Validation校验

来源:互联网 发布:儿童安全座椅 知乎 编辑:程序博客网 时间:2024/05/16 08:52

Validation校验

 

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

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

1.1 需求

对商品信息进行校验,是否必须,输入数据合法性。

 

1.2 加入jar

 

 

1.3 配置validator

 

<!-- 校验错误信息配置文件 --><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><bean id="validator"class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"><property name="providerClass" value="org.hibernate.validator.HibernateValidator" /><!-- 如果不指定则默认使用classpath下的ValidationMessages.properties --><property name="validationMessageSource" ref="messageSource" /></bean>


 

 

1.4 validator加到处理器适配器

配置方式1

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


 

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


 

配置方式2

<mvc:annotation-driven validator="validator"> </mvc:annotation-driven>


 

 

1.5 添加验证规则

 

public class Items {    private Integer id;    @Size(min=1,max=30,message="{item.name.length.illigel}")    private String name;        @NotEmpty(message="{pic.is.null}")    private String pic; 


1.6 错误消息文件CustomValidationMessages

 

item.name.length.illigel=商品在名称在13个字符之间

pic.is.null=请上传图片

 

如果在eclipse中编辑properties文件无法看到中文则参考“Eclipse开发环境配置-indigo.docx”添加propedit插件。

 

1.7 捕获错误

 

修改Controller方法:

// 商品修改提交@RequestMapping("/editItemSubmit")public String editItemSubmit(@Validated @ModelAttribute("item") Items items,BindingResult result,@RequestParam("pictureFile") MultipartFile[] pictureFile,Model model)throws Exception {//如果存在校验错误则转到商品修改页面if (result.hasErrors()) {List<ObjectError> errors = result.getAllErrors();for(ObjectError objectError:errors){System.out.println(objectError.getCode());System.out.println(objectError.getDefaultMessage());}return "item/editItem";}  


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

 

商品修改页面:

页头:

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %><%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"  <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>


 

在需要显示错误信息地方:

<spring:hasBindErrors name="item"><c:forEach items="${errors.allErrors}" var="error">${error.defaultMessage }<br/></c:forEach></spring:hasBindErrors> 


说明:

<spring:hasBindErrors name="item">表示如果item参数绑定校验错误下边显示错误信息。

 

1.8 分组校验

如果两处校验使用同一个Items类则可以设定校验分组。

 

定义分组:

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

public interface ValidGroup1 { }public interface ValidGroup2 { }


 

指定分组校验:

public class Items {    private Integer id;//这里指定分组ValidGroup1,此@Size校验只适用ValidGroup1校验    @Size(min=1,max=30,message="{item.name.length.illigel}",groups={ValidGroup1.class})    private String name; // 商品修改提交@RequestMapping("/editItemSubmit")public String editItemSubmit(@Validated(value={ValidGroup1.class}) @ModelAttribute("item") Items items,BindingResult result,@RequestParam("pictureFile") MultipartFile[] pictureFile,Model model)throws Exception {


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

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

0 0
原创粉丝点击