日期:2014-05-16  浏览次数:20344 次

Spring MVC 学习笔记 十 使用jsr 303进行校验
Spring MVC在使用了<mvc:annotation-driven> 后,如果路径中有jsr 303的实现,将自动提供对jsr 303验证方式的支持。
一:使用hibernate validator进行数据验证
   选择的是hibernate validator,因此需要修改pom.xml增加对hibernate validator的支持。
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-validator</artifactId>
			<version>4.1.0.Final</version>
		</dependency>
   
新增一个测试的pojo bean ,增加jsr 303格式的验证annotation
	@NotEmpty
	private String userName;
	@Email
	private String email;

在controller 类中的handler method中,对需要验证的对象前增加@Valid 标志

	@RequestMapping("/valid")
	public String valid(@ModelAttribute("vm") [color=red]@Valid[/color] ValidModel vm, BindingResult result) {
		if (result.hasErrors()) {
			return "validResult";
		}

		return "helloworld";
	}

增加显示验证结果的jsp如下
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>

<html>
<head>
<title>Reservation Form</title>
<style>
.error {
	color: #ff0000;
	font-weight: bold;
}
</style>
</head>

<body>
	<form:form method="post" modelAttribute="vm">
		<form:errors path="*" cssClass="error" />
		<table>
			<tr>
				<td>Name</td>
				<td><form:input path="userName" />
				</td>
				<td><form:errors path="userName" cssClass="error" />
				</td>
			</tr>
			<tr>
				<td>email</td>
				<td><form:input path="email" />
				</td>
				<td><form:errors path="email" cssClass="error" />
				</td>
			</tr>
	
			<tr>
				<td colspan="3"><input type="submit" />
				</td>
			</tr>
		</table>
	</form:form>
</body>
</html>

访问 http://localhost:8080/springmvc/valid?userName=winzip&email=winzip
查看验证结果。
二:自定义jsr 303格式的annotation
参考hibernate validator 4 reference 手册中3.1节,增加一个自定义要求输入内容为定长的annotation验证类
新增annotation类定义
@Target( { METHOD, FIELD, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = FixLengthImpl.class)
public @interface FixLength {

	int length();
	String message() default "{net.zhepu.web.valid.fixlength.message}";

	Class<?>[] groups() default {};

	Class<? extends Payload>[] payload() default {};
}

及具体的验证实现类如下

public class FixLengthImpl implements ConstraintValidator<FixLength, String> {
	private int length;
	@Override
	public boolean isValid(String validStr,
			ConstraintValidatorContext constraintContext) {
		if (validStr.length() != length) {
			return false;
		} else {
			return true;
		}
	}

	@Override
	public void initialize(FixLength fixLen) {
		this.length = fixLen.length();
	}
}

为使自定义验证标注的message正常显示,需要修改servlet context配置文件,新增messageSource bean,如下
	<bean id="messageSource"
		class="org.springframework.context.support.ReloadableResourceBundleMessageSource"
		p:fallbackToSystemLocale="true" p:useCodeAsDefaultMessage="false"
		p:defaultEncoding="UTF-8">
		<description>Base message source to handle internationalization
		</description>
		<property name="basenames">
			<list>
				<!-- main resources -->
				<value>classpath:valid/validation</value>
			</list>
		</property>
	</bean>

表示spring 将从路径valid/validation.properties中查找对于的message。
新增valid bean 引用新增的messageSource bean,表示valid message将从messageSource bean 注入。
	<bean id="validator"
		class="org.springfra