Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1964197
  • 博文数量: 606
  • 博客积分: 9991
  • 博客等级: 中将
  • 技术积分: 5725
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-17 19:07
文章分类

全部博文(606)

文章存档

2011年(10)

2010年(67)

2009年(155)

2008年(386)

分类:

2008-10-14 20:48:58

   大多数Web应用都会遇到需要填写表单的页面,当表单提交成功后,表单的数据被传送给Web服务器中处理。处理成功后导向到一个成功页面,如果操作失败则导向到一个错误报告页面。此外,在表单数据处理之前还会进行表单数据的验证,保证客户端提交的表单数据是合法有效的,如果数据不合法,请求返回到原表单页面中,以便用户根据错误信息进行修改。

    假设你想成为论坛的用户时,必须填写一张用户注册表单,这可能包括用户名、密码、Email等注册信息。用户提交表单后,服务器验证注册数据合法性,如果你填写的信息是合法的,系统将在数据库中创建一个新用户,用户注册就完成了。
用户注册表单控制器

    通过扩展SimpleFormController可以按照标准的表单处理流程处理用户注册的请求,UserRegisterController用于负责处理用户注册的请求:

代码清单 1 UserRegisterController

package com.baobaotao.web.user; import org.springframework.web.servlet.mvc.SimpleFormController; import com.baobaotao.domain.User; import com.baobaotao.service.BbtForum; public class UserRegisterController extends SimpleFormController { private BbtForum bbtForum; public UserRegisterController(){ setCommandClass(User.class); ①指定命令对象(这时也称表单对象)的类型 } public void setBbtForum(BbtForum bbtForum) { this.bbtForum = bbtForum; } ②通过该方法处理表单提交请求 protected void doSubmitAction(Object command) throws Exception { User user = (User) command; bbtForum.registerUser(user); } }

    在①处指定表单对象的类型,以便控制器自动将表单数据绑定到表单对象中,你也可以直接在配置文件中通过commandClass属性进行设置:



    在②处复写了doSubmitAction()方法,在该方法内部通过调用业务层的bbtForum保存表单对象,创建新用户。当你不需要返回模型对象给成功页面时,复写doSubmitAction()方法是最佳的选择,因为该方法没有返回值。如果需要返回模型对象给成功页面,那么就必须复写表单控制器的onSubmit ()方法。用户注册成功后,我们一般需要在成功页面中根据用户信息提供个性化的内容,这就要求控制器返回相应的User模型对象,此时需要在UserRegisterController中复写onSubmit ()方法:

… protected ModelAndView onSubmit (Object command, BindException errors) throws Exception { User user = (User) command; bbtForum.registerUser(user); return new ModelAndView(getSuccessView(), "user", user);①user中包含注册用户的信息 } …

当你复写onSubmit ()方法后,doSubmitAction()方法就不会得到执行了, onSubmit ()方法比doSubmitAction()方法具有更高的调用优先级,所以你只要根据要求复写两者中的一个方法就可以了。在onSubmit ()中返回的ModelAndView的逻辑视图名应该是通过表单控制器的successView属性指定而不应该硬编码,所以在①处我们通过getSuccessView()获取这个配置值。
表单控制器的工作流程从表单页面提交开始,处理成功后转向成功页面,这个流程涉及到两个视图:表单页面和成功页面,这需要在表单控制器中通过属性进行定义: 



①表单录入页面(逻辑视图名,下同)
②成功页面
 

    通过formView属性指定表单录入页面对应的逻辑视图名,而successView属性表示成功页面的视图逻辑名。通过代码清单 2前后缀视图解析器的处理,它们将分别对应WEB-INF/jsp/register.jsp和WEB-INF/jsp/registerSuccess.jsp的JSP页面。

代码清单 2 前后缀视图解析器



①前缀
/WEB-INF/jsp/

②后缀
.jsp



    一般情况下表单录入页面需要通过Spring表单标签绑定表单对象,以便根据表单对象初始值生成表单页面,在校验失败后能够重现提交前的表单数据。让我们看看这个register.jsp用户注册页面的内容:
代码清单 3 register.jsp:用户注册页面

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="form" uri="" %>


宝宝淘论坛用户注册


①Spring MVC表单标签,可以直接和/registerUser.html控制器
绑定(fromView),无需通过action指定提交的目标地址。

用户名:


密 码:


Email:








    在①处,应用Spring的表单标签定义了一个能够和表单对象绑定的页面表单。和Struts不同的是作为表单标签的元素无需设定提交地址(在Struts中必须指定表单标签的action属性),Spring MVC能够自动根据控制器的formView属性获知该表单页面的提交地址。使用过Struts Action开发表单提交功能的读者也许会知道开发Struts处理表单功能是比较麻烦,因为可能会为了开发一个表单设计多个Action:一个用户初始化表单,另一个用于提交表单。而Spring的SimpleFormController的高明之处在于,它已经将表单处理工作流程编制到控制器中,我们仅需要在子类中复写开放出方法就可以充分享受预定义工作流程的好处。我们应该如何有选择地覆盖父类方法,以便正确地影响表单工作流程呢?这回答这个问题需要对SimpleFormController的工作流程有一个详细的了解。

阅读(427) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~