一、Spring集成JSR-303验证框架:
1、在pom.xm中添加JSR-303验证框架的hibernate实现:hibernate-validator
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.2.2.Final</version> </dependency>
2、在springmvc-servlet.xml配置中添加对JSR-303验证框架的支持
<!--配置HibernateValidator--> <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> <property name="providerClass" value="org.hibernate.validator.HibernateValidator"/> <property name="validationMessageSource" ref="messageSource"/> </bean> <!--使用Spring的MessageSource Bean进行消息键值的查找--> <bean id= "messageSource" class= "org.springframework.context.support.ReloadableResourceBundleMessageSource"> <property name= "basename" value= "classpath:messages"/> <property name= "fileEncodings" value= "utf-8"/> <property name= "cacheSeconds" value= "120"/> </bean> <!-- 默认的注解映射支持,配置注册validator --> <mvc:annotation-driven validator="validator"/>
3、在classpath下添加错误消息属性文件messages.properties:
NotNull.user.username=用户姓名不能为空 Length.user.username=用户名长度必须在5-10之间 Pattern.user.username=用户名必须以字母下划线开头,可由字母数字下划线组
4、使用JSR-303验证框架注解为模型对象指定验证信息
public class UserModel { @NotNull(message="{NotNull.user.username}") @Length(min=5, max=20,message="{Length.user.username}") @Pattern(regexp = "^[a-zA-Z_]\\w{4,19}$",message="{Pattern.user.username}") private String username; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } }
5、在Controller需要验证的模型对象前加@Valid注解:
@Controller public class HelloWorldController { @RequestMapping("/validate/hello") public String validate(@Valid @ModelAttribute("user") UserModel user, Errors errors) { if(errors.hasErrors()) { return "validate/error"; } return "redirect:/success"; } }
6、验证失败后需要展示的页面(/WEB-INF/jsp/validate/error.jsp):
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <form:form commandName="user"> <form:errors path="*" cssStyle="color:red"></form:errors><br/> </form:form>
二、扩展讨论:
1、错误消息属性文件的键的命名推荐:
验证错误注解简单类名.验证对象名.字段名
如NotNull.user.username
ps:简单、精准、不费脑,而且spring默认识别该错误消息键,验证注解的message属性可以省了,不过这样在属性文件中就不支持占位符了
2、方法上添加了@ResponseBody注解,验证是否有效:
有效,如果需要返回错误信息,可通过errors.getFieldError("username").getDefaultMessage()获取错误信息
3、一个功能处理方法上需要验证多个模型对象时,需要通过如下形式来获取验证结果:
@RequestMapping("/validate/multi") public String multi( @Valid @ModelAttribute("a") A a, BindingResult aErrors, @Valid @ModelAttribute("b") B b, BindingResult bErrors) { if(aErrors.hasErrors()) { //如果a模型对象验证失败 return "validate/error"; } if(bErrors.hasErrors()) { //如果a模型对象验证失败 return "validate/error"; } return "redirect:/success"; }
每一个模型对象后边都需要跟一个Errors或BindingResult对象来保存验证结果,其方法体内部可以使用这两个验证结果对象来选择出错时跳转的页面。
在错误页面,需要针对不同的模型来显示错误消息:
<form:form commandName="a"> <form:errors path="*" cssStyle="color:red"></form:errors><br/> </form:form> <form:form commandName="b"> <form:errors path="*" cssStyle="color:red"></form:errors><br/> </form:form>
三、引用:
开涛的博客:http://jinnianshilongnian.iteye.com/blog/1733708
私熟在线:http://sishuok.com/forum/blogPost/list/6991.html