Spring MVC支持与JSR 349 Bean Validation API的集成。借助于Bean验证,可以非常容易地将验证元数据应用到模型类,并且通过合适的视图向用户反映可能的结果。该元数据可以使用注解进行定义,因此验证将更容易定义。
Step1:添加注解
public class User {
@Size(min = 3,max = 20)
private String name;
private String lastname;
@Email
private String email;
//匹配 以字母开头,长度在6~18之间,只能包含字符、数字和下划线
@Pattern(regexp = "^[a-zA-Z]\\w{3,14}$")
private String password;
private String detail;
@CreditCardNumber
private String ccNumber;
.....
}
@Size注解将用户名的长度设置为3~20之间
@Email注解根据e-mail的正则表达式来验证输入
@CreditCardNumber注解根据Luhn算法验证输入的数字
注:Luhn算法是一个简单的模数-10(modulus-10)校验公式,可用来验证各种识别码
@Pattern注解根据一个正则表达式验证密码
Step2:为了启用验证,需要向项目中添加Bean验证的实现,本例选择Hibernate Validator框架来提供验证,添加相应的依赖
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.1.0.Final</version>
</dependency>
Step3:表单中添加包含errors的标签,以便显示在每个输入字段可能发生的错误
<mvc:form modelAttribute="user" action="result.mvc" method="post">
<table>
<tr>
<td><mvc:label path="name">Name:</mvc:label></td>
<td><mvc:input path="name" cssErrorClass="formFieldError"/></td>
<td><mvc:errors path="name"/></td>
</tr>
<tr>
<td><mvc:label path="email">E-Mail:</mvc:label></td>
<td><mvc:input path="email" cssErrorClass="formFieldError"/></td>
<td><mvc:errors path="email"/></td>
</tr><tr>
<td><mvc:label path="ccNumber">Credit Card Number:</mvc:label></td>
<td><mvc:input path="ccNumber" cssErrorClass="formFieldError"/></td>
<td><mvc:errors path="ccNumber"/></td>
</tr>
........
</mvc:form>
对于errors标签,其path特性设置为模型类的属性名称。但对于errors标签来说,path特性则不是必须设置的。但如果没有设置,则无法看到相关联输入字段的错误消息。如果想在一个地方显示所有错误,可将path值设置为*,并将errors标签放置在表单之上
Step3:控制器方法
@RequestMapping("/result")
public ModelAndView processUser(@Valid User user, BindingResult result){
System.out.println(user.toString());
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("u",user);
if(result.hasErrors()){
modelAndView.setViewName("userForm");
}else{
modelAndView.setViewName("userResult");
}
return modelAndView;
}
对用户输入的验证由在user方法参数上设置的@Valid注解触发。该注解被递归地应用到类的属性。如果没有设置该注解,就不会触发Bean验证。processUser()方法接收一个额外的参数result,该参数是一个BindingResult实例。通过使用该参数来检查在将请求参数映射到域类属性的过程中是否发生任何验证错误(使用result.hasErrors()方法)。然后根据条件设置视图,以便在输入页面显示相关错误。
注意:当在模型特性上使用@Valid注解时,如果忽略了BingResult类型的方法参数,则可能是在提交表单时遇到下面所示的问题:HTTP-400 The result sent by client was syntactically incorrect。所有需确保不要缺少BingResult类型的方法参数。
出错的输入,表单显示如图:
图示错误消息是由框架默认设置的。如果要修改这些消息,可以通过注解设置新的消息,比如对于密码字段,可以设置如下
@Pattern(regexp = "^[a-zA-Z]\\w{3,14}$",message = "first character must be a letter and it must contain... ")