大多数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属性进行设置:
<property name="commandClass" value=" com.baobaotao.domain.User"/>
在②处复写了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()获取这个配置值。
表单控制器的工作流程从表单页面提交开始,处理成功后转向成功页面,这个流程涉及到两个视图:表单页面和成功页面,这需要在表单控制器中通过属性进行定义:
<bean name="/registerUser.html" class="com.baobaotao.web.user.UserRegisterController">
<property name="bbtForum" ref="bbtForum" />
<property name="formView" value="register" /> ①表单录入页面(逻辑视图名,下同)
<property name="successView" value="registerSuccess" /> ②成功页面
</bean>
通过formView属性指定表单录入页面对应的逻辑视图名,而successView属性表示成功页面的视图逻辑名。通过代码清单
2前后缀视图解析器的处理,它们将分别对应WEB-INF/jsp/register.jsp和WEB-INF/jsp
/registerSuccess.jsp的JSP页面。
代码清单 2 前后缀视图解析器
…
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix"> ①前缀
<value>/WEB-INF/jsp/</value>
</property>
<property name="suffix"> ②后缀
<value>.jsp</value>
</property>
</bean>
一般情况下表单录入页面需要通过Spring表单标签绑定表单对象,以便根据表单对象初始值生成表单页面,在校验失败后能够重现提交前的表单数据。让我们看看这个register.jsp用户注册页面的内容:
代码清单 3 register.jsp:用户注册页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<html>
<head>
<title>宝宝淘论坛用户注册</title>
</head>
<body>
①Spring MVC表单标签,可以直接和/registerUser.html控制器
绑定(fromView),无需通过action指定提交的目标地址。
<form:form>
用户名:<form:input path="userName" />
<br>
密 码:<form:password path="password" />
<br>
Email:<form:input path="email" />
<br>
<input type="submit" value="注册" />
<input type="reset" value="重置" />
</form:form>
</body>
</html>
在①处,应用Spring的表单标签定义了一个能够和表单对象绑定的页面表单。和Struts不同的是作为表单标签的<form:form>
元素无需设定提交地址(在Struts中必须指定表单标签的action属性),Spring
MVC能够自动根据控制器的formView属性获知该表单页面的提交地址。使用过Struts
Action开发表单提交功能的读者也许会知道开发Struts处理表单功能是比较麻烦,因为可能会为了开发一个表单设计多个Action:一个用户初始
化表单,另一个用于提交表单。而Spring的SimpleFormController的高明之处在于,它已经将表单处理工作流程编制到控制器中,我们
仅需要在子类中复写开放出方法就可以充分享受预定义工作流程的好处。我们应该如何有选择地覆盖父类方法,以便正确地影响表单工作流程呢?这回答这个问题需
要对SimpleFormController的工作流程有一个详细的了解。
表单数据校验
我们在UserRegisterController覆盖了父类的onBindAndValidate()方法,通过BbtForum业务对象的方法判断userName是否已经被占用,如果已经被占用,将相应错误添加到errors对象中。
通过错误标签显示错误
当存在合法性检查错误时,请求被导向到formView的表单页面中。但是如果register.jsp表单页面没有做任何配合操作,校验错误的信息就象
空气和电磁波一样,虽然存在但却看不到,如果我们在register.jsp中相应地添加一些Spring错误标签这面魔法镜,错误信息就现形了。下面我
们对register.jsp视图文件进行调整,加入显示校验错误的标签:
代码清单 6 register.jsp:添加错误标签
…
<form:form>
用户名:<form:input path="userName" />
<font color="red"><form:errors path="userName" /></font>①userName的校验错误
<br>
密 码:<form:password path="password" />
<font color="red"><form:errors path="password" /></font>②password的校验错误
<br>
Email:<form:input path="email" />
<font color="red"><form:errors path="email" /></font> ③email的校验错误
<br>
<input type="submit" value="注册" />
<input type="reset" value="重置" />
</form:form>
…
由于我们在构造错误时,使用了错误代码,错误代码是引用国际化资源的凭借。为了让错误代码生效,我们就必须提供相应的国际化资源。假设我们将错误资源放在
基名为errors的国际化资源文件中,提供诸如errors.properties和errors_zh_CN.properties的国际化资源文
件,那么错误信息就可以做到国际化了。以下是errors.properties资源文件的内容(绿色部分为错误代码):
required.username=user name can't be empty.
required.password=password can't be empty.
required.email=email can't be empty.
invalid.email=email is valid.
exists.userName=user name already existed.
将诸如errors.properties和errors_zh_CN.properties的整套资源文件都放到类路径下后,还需要在上下文中引用这些
国际化资源。因为国际化资源信息仅需要在Web展现层使用,所以直接在DispatcherServlet上下文对应的baobaotao-
servlet.xml配置文件中声明就可以了:
代码清单 7 baobaotao-servlet.xml
<bean id="messageSource" ① 注意一定要使用“messageSource”这个Bean名称
class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames">
<list>
<value>errors</value> ② 指定资源文件基名称
</list>
</property>
</bean>
…
分享到:
相关推荐
在低版本的Spring中,你必须通过JSTL或...不过这一情况已经一去不复返了,从Spring 2.0开始,Spring MVC开始全面支持表单标签,通过Spring MVC表单标签,我们可以很容易地将控制器相关的表单对象绑定到HTML表单元素中。
本篇文章将深入探讨Spring MVC中的表单标签库,以及如何在实际项目中使用它们来创建动态、交互式的表单。 1. **表单标签库介绍** Spring MVC的表单标签库是JSP的一部分,它可以生成HTML表单元素,并且能够自动绑定...
在使用Spring的表单标签库之前,需要在JSP页面中引入Spring的Taglib。这通常在页面的`<head>`部分完成,通过添加以下行: ```jsp <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> ``` ...
全书共计12章,分别从Spring框架、模型2和MVC模式、Spring MVC介绍、控制器、数据绑定和表单标签库、传唤器和格式化、验证器、表达式语言、JSTL、国际化、上传文件、下载文件多个角度介绍了Spring MVC。除此之外,...
全书共计12章,分别从Spring框架、模型2和MVC模式、Spring MVC介绍、控制器、数据绑定和表单标签库、传唤器和格式化、验证器、表达式语言、JSTL、国际化、上传文件、下载文件多个角度介绍了Spring MVC。除此之外,...
5. **JSTL(JavaServer Pages Standard Tag Library)**:JSTL提供了一系列标签库,简化了JSP页面中的业务逻辑,可以与Spring MVC配合使用,减少Java代码的编写。 6. **JSP和Servlet API**:Spring MVC依赖于...
Spring MVC 是一个强大的Java web开发框架,用于构建可维护、高性能和灵活的Web应用程序。这个"spring mvc login demo"项目旨在提供一个基础的登录功能示例,帮助开发者理解如何在Spring MVC环境中实现用户身份验证...
将Spring MVC与Ajax结合使用,可以实现页面的异步更新,提升用户体验,同时保持服务器负载均衡。 首先,我们需要理解Spring MVC的基本工作流程。当用户发起请求时,Spring MVC的DispatcherServlet会拦截这个请求,...
全书共计12章,分别从Spring框架、模型2和MVC模式、Spring MVC介绍、控制器、数据绑定和表单标签库、传唤器和格式化、验证器、表达式语言、JSTL、国际化、上传文件、下载文件多个角度介绍了Spring MVC。除此之外,...
全书共计12章,分别从Spring框架、模型2和MVC模式、Spring MVC介绍、控制器、数据绑定和表单标签库、传唤器和格式化、验证器、表达式语言、JSTL、国际化、上传文件、下载文件多个角度介绍了Spring MVC。除此之外,...
详细的Spring MVC教程,内容包括控制器 重定向 保存并获取属性参数 拦截器 表单标签和验证表单 视图和视图解析器 上传文件 数据转换和格式化
9. Spring MVC表单标签和处理静态资源,提供了表单标签库,以及处理静态资源的方式。 10. 数据转换和数据格式化及数据校验,可以通过Spring MVC的注解来实现数据的转换、格式化和校验。 11. 处理JSON,Spring MVC...
书中涵盖了关于Spring MVC的诸多知识点,包括Spring框架的基本概念、依赖注入、XML配置、控制器以及Spring MVC的特定内容,如注解型控制器、数据绑定、表单标签库、转换器与格式化器、验证器以及表达式语言等。...
在Spring MVC框架中,服务端表单验证是一个关键的步骤,确保从客户端接收到的数据是有效和安全的。本实例提供了完整的代码和配置,让你能够快速理解和应用服务端验证。以下是对这个实例的详细解析: 1. **Spring ...
### Spring MVC 附件上传知识点详解 #### 一、Spring MVC框架下的文件上传概述 在Spring MVC框架中实现文件上传功能是十分常见的需求之一。本文档将详细介绍如何在Spring MVC环境中配置并实现文件上传功能,包括...
1. **注解驱动的Controller**:在Spring 2.5中,你可以使用`@Controller`注解来标记一个类作为Spring MVC的控制器。这个注解告诉Spring该类包含处理HTTP请求的方法。例如: ```java @Controller public class ...
Spring MVC提供了丰富的表单标签库,如、等,简化了表单元素的创建和数据绑定。当表单提交时,Spring MVC会自动将请求参数与Model对象的属性进行绑定。 七、异常处理与国际化 Spring MVC提供了全局和局部的异常...
13. **表单标签** Spring MVC 提供了 `form:form`、`form:input` 等标签简化表单处理,例如: ```jsp ... ``` 以上就是 Spring MVC 的基础使用教程,通过这些知识,你可以构建一个完整的后端应用。继续...