概述
假设某一个系统在用户注册模块中需要区别一般用户和高级用户,一般用户只要提供最简单的信息,通过一个小表单就可以搞掂了。但对于需要注册为高级用户的客户来说,论坛希望他们提供详细的注册信息,除了用户名、密码、Email这些最简单的信息外,还需要提供住址、电话以及兴趣爱好之类的调查信息。通过一张大表单让注册者一次性填写所有这些信息并不是一个好主意,大部分潜在的用户当看到这样面目狰狞的“超级表单”后都会毫不犹豫的放弃注册。这时通过一个向导式的表单让用户分步填写注册信息将是明智的方案,虽然需要填写的信息量不变,但心理学的经验告诉我们,用户会在第一感觉简单的心理暗示下慢慢进入我们设下的“麦田圈套”中。
高级用户注册所需填写的信息分解到3个表单中,并以向导方式分步完成:
1) 填写用户名、密码、Email等一般的信息;
2) 填写地址、电话等联系的信息;
3) 填写用户兴趣爱好的调查信息。
在其它MVC框架中开发向导式的表单并非易事,因为你需要考虑表单前进、后退、中途退出,表单分步骤校验,数据维护等诸多的问题。幸运的是,在Spring MVC中,你不必躬身考虑这种底层工作流程的细节,AbstractWizardFormController已经编制好了向导表单的工作流程并将那些需要你确定的步骤开放出来,你只需要通过扩展现成的AbstractWizardFormController通过很少的工作,一个功能强大的向导表单就大功告成了。
我们打算通过以下页面流程完成高级用户注册的操作:
图 1 注册高级用户向导页面流程
创建注册高级用户的向导控制器
我们构建一个向导控制器,它必须继承AbstractWizardFormController类,FullUserRegisterController负责为注册高级用户提供基本的向导控制器,其代码如下所示:
代码清单 1 FullUserRegisterController:向导控制器
package com.baobaotao.web.user;
…
import org.springframework.web.servlet.mvc.AbstractWizardFormController;
public class FullUserRegisterController extends AbstractWizardFormController {
private String cancelView; ① 点击取消后转向的视图(逻辑视图名)
private String successView; ② 向导最终处理成功后转向的成功页面
private BbtForum bbtForum;
public void setBbtForum(BbtForum bbtForum) {
this.bbtForum = bbtForum;
}
③ 负责处理最后表单提交的动作
protected ModelAndView processFinish(HttpServletRequest request,
HttpServletResponse response, Object command, BindException errors)
throws Exception {
FullUser fullUser = (FullUser) command;
bbtForum.registerFullUser(fullUser);
③-1转向welcome.jsp页面
return new ModelAndView(getSuccessView(), "fullUser", fullUser);
}
④负责处理取消的动作
protected ModelAndView processCancel(HttpServletRequest request, HttpServletResponse
response, Object command, BindException errors) throws Exception {
return new ModelAndView(getCancelView());④-1转向main.jsp页面
}
//省略get/setter
}