概述 假设某一个系统在用户注册模块中需要区别一般用户和高级用户,一般用户只要提供最简单的信息,通过一个小表单就可以搞掂了。但对于需要注册为高级用户的客户来说,论坛希望他们提供详细的注册信息,除了用户名、密码、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
}
AbstractWizardFormController唯一必须实现的方法是processFinish()方法,在用户完成整个向导的提交后,这个方法被调用执行。在FullUserRegisterController中,processFinish()方法将FullUser对象传递给BbtForum业务对象,保存高级用户的注册信息,然后转向到注册成功后的欢迎页面。你可以有选择地实现processCancel()方法,该访问负责处理取消的动作。向导链中的页面都提供一个可以让用户中途退出的“取消”功能,它可以增强了向导的灵活性。在④处,我们指定当用户点击“取消”从向导中途退出时,转向到main.jsp页面中。
AbstractWizardFormController并没有提供“取消视图”和“成功视图”的配置属性,这不能不说是一个遗憾。所以我们在FullUserRegisterController中①和②处分别定义了用于取消页面和成功页面的逻辑视图名。
读者可能会发出这样的疑问:表单对象和向导链上的页面视图究竟在哪里定义呢?你也许已经猜测到,它们应该出现在配置文件中。我们马上看一下FullUserRegisterController的具体配置:
① 业务对象
②表单对象类
③向导链页面逻辑名,用逗号隔开
④取消后转向的视图
⑤向导处理成功后转向的视图
在前面的实例中,我们都是通过在控制器构造函数中通过调用setCommandClass()方法指定表单对象(命令对象),这里我们通过配置进行指定,如②所示。
③处通过pages属性定义了构成向导链的页面视图,pages属性是一个String[],你不但可以通过
的方式进行配置,也可以通过逗号分隔的字符串的方式进行配置,后者显然要更简洁一些。“fullRegister,relation,favorite”传达了两个信息:
1)向导链由三个视图组成,分别是fullRegister、relation和favorite;
2)向导链的视图顺序是fullRegister->relation->favorite。
在④和⑤处分别定义了取消和提交表单转向的视图,这样向导控制器就知道哪些页面构成了表单,当进行取消和提交表单操作时需要转向到哪些页面。至此,形如图 1所描述的整体向导流程就搭建完成了。
虽然我们已经知道了整个向导的页面组成,但是组成向导链的页面需要做哪些配合工作,以便让向导正确串接起来呢?
阅读(501) | 评论(0) | 转发(0) |