ITEEDU

实作 Validator

使 用 SimpleFormController 时,您可以搭配一个 org.springframework.validation.Validator 介面 的实作物件,帮助您作基本的伺服端资料验证工作,您可以设计一个通用的 Validator, 将之当作一个 Bean 注入给需要进行表单验证的其它 Bean 物 件。

Validator 介面有两个必须实作的方法,其定义如下所示:

package org.springframework.validation;
public interface Validator {
	boolean supports(Class clazz);
	void validate(Object obj,Errors errors);
}

supports()方法回传一个 boolean 值,表示是否支援对所传入的物件进行验证,只有在传回 true 的情况下,才会使用 validate()方 法进行验证工作,在 validate()方法的参数中,obj 表示传 入的表单物件,您可以对它进行一些验证,如果有错误的话,可以使用 Errors 的 reject()或 rejectValue()等方法加入错误讯息,在后续的处理中,若 errors 物件中包括错误讯息,会回到 getViewPage ()所设定的页面。

来看一个简单的实作:

package onlyfun.caterpillar;
import org.springframework.validation.Validator;
import org.springframework.validation.Errors;
public class LoginValidator implements Validator {
	public boolean supports(Class clazz) {
		return clazz.equals(LoginForm.class);
	}
	public void validate(Object obj, Errors errors) { 
		LoginForm form = (LoginForm) obj;
		if(form.getPassword().length() < 4 ) {
			errors.rejectValue("password",
			"less-than-four", null, "密码不得小于四个字元");
		}
	}
}

这个 Validator 类别可以搭配 7.2.7 介绍的 SimpleFormDemo 专案来使用,验证通常是在检查资 料的完备性、安全性等条件,像是检查密码的格式就是一例,至于使用者名称与密码是否正确, 这该算是后继的 Controller 的处理工作。

搭配 SimpleFormController 来使用 Validator,您只要在 Bean 定义档中加入 Validator 的 Bean 定义,以及让 SimpleFormController 参考到它即可,例如:

...
<bean id="loginValidator" class="onlyfun.caterpillar.LoginValidator"/>
<bean id="loginAction" class="onlyfun.caterpillar.LoginAction">
	<property name="commandClass">
		<value>onlyfun.caterpillar.LoginForm</value>
	</property>
	<property name="validator">
		<ref bean="loginValidator"/>
	</property>
	<property name="successView">
		<value>success</value>
	</property>
	<property name="formView">
		<value>form</value>
	</property>
</bean>
...

"validator"属性参考至 loginValidator 实例,只要有设定"validator",SimpleFormController 就会使用它。 在进行验证时,您可以使用 org.springframework.validation.ValidationUtils,上面有一些 方便的静态方法, 像是 rejectIfEmpty()、rejectIfEmptyOrWhitespace()等,可以查查线上 API 文件看如何使用。

另一方面,对于 AbstractWizardFormController,您可以重新定义它的 validatePage()方法来 进行验证,例如:

...
protected void validatePage(Object command,Errors errors, int page) {
	(YourCommand) your = (YourCommand) command;
	switch(page) {
		case 1:
		validator.validateSome(your, errors);
		break;
		case 2:
		validator.validateOther(your, errors);
		break;
		....
	}
}
.. 

每进行一页 Wizard 表单,都会呼叫该方法一次,让您针对该次送出的数据进行验证,"page"参 数 表示该 次送出表 单的页数 ,与 SimpleFormController 的 Validator 不同 的是, AbstractWizardFormController 不会自动调用 Validator 的 validate()方法,您要根据当次页 面的资料自行进行对应的方法验证,通常采取如上的委托物件,将验证交由一个 Validator 物 件来执行。