Email的信息,当用户点击下一步到relation页面时,就必须对这三个属性值进行校验,如果发生错误就应该马上返回到提供这三个属性值的fullRegister页面中,以便用户及时纠正。
在每次页面跳转时,validatePage()方法会被调用,用以校验表单对象的数据合法性。该方法缺省实现是空的,我们可以通过覆盖该方法做出自己的判断。在校验时需要结合page页面索引号进行分步骤校验。
首先我们编写一个校验器,它为每一步骤提供了相应的校验方法:
代码清单 3FullUserValidator
package com.baobaotao.domain;
…
public class FullUserValidator implements Validator {
…
public boolean supports(Class clazz) {
return clazz.equals(FullUser.class);
}
public void validate(Object command, Errors errors) {①完全校验
…
}
public void validateStep1(Object command,Errors errors){ ②第一步的校验
…
}
public void validateStep2(Object command,Errors errors){ ③第二步的校验
…
}
}
FullUserValidator为第一,二步向导分别提供了校验,而validate()用于向导最后提交时的校验。在FullUserRegisterController在validatePage()方法中根据page属性所标识的步骤执行相关的校验:
代码清单 4FullUserRegisterController# validatePage()
protected void validatePage(Object command, Errors errors, int page, boolean finish) {
FullUserValidator validator = (FullUserValidator)getValidator();
if (page == 0) { ①第一步提交的校验
validator.validateStep1(command, errors);
}else if (page == 1) {②第二步提交的校验
validator.validateStep2(command, errors);
}else if (finish) { ③向导最后提交的校验
validator.validate(command, errors);
}
}
当向导页面提交时,page表示提交的页面索引,我们可以据此实施特定步骤的校验。当向导最后提交时finish属性为true,这时我们就进行整体表单对象校验。
最后我们要做的是在配置文件中将FullUserValidator装配到FullUserRegisterController中,如下所示:
<bean name="/fullRegisterUser.html" class="com.baobaotao.web.user.FullUserRegisterController">
<property name="bbtForum" ref="bbtForum" />
<property name="commandClass" value="com.baobaotao.domain.FullUser"/>
<property name="pages" value="fullRegister,relation,favorite"/>
<property name="cancelView" value="main"/>
<property name="successView" value="welcome"/>
<property name="validator"> ①注入校验器
<bean class="com.baobaotao.domain.FullUserValidator" />
</property>
</bean>
在①处注入校验器,这样validatePage()方法就可以通过getValidator()获取校验器并实施分步校验了。
小结
在Struts、WebWork等MVC框架中开发具有向导功能的模块往往是比较复杂的,因为向导的各项处理动作和前后的衔接都必须由开发者负责,从框架中得不到任何的帮助。而在Spring MVC中开发具有向导功能的模块是非常容易的,因为Spring MVC已经通过AbstractWizardFormController“预编制”好了向导的流程,开发者仅需要按照特定的规则实现特定的方法,使用特定的URL请求参数就可以开发出一个功能强大的向导模块了。 |