springmvc之数据验证

一、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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值