使 用 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 物 件来执行。