1.当表单控制器接收到GET请求时,它调用formBackingObject()方法,创建表单对象。该方法可以被子类覆盖,对于编辑操作的表单来说,你可以通过该方法从数据库中加载表单对象,当表单页面显示时,表单显示出待编辑的数据了;
2.表单对象和页面表单数据之间需要通过属性编辑器实现双向转化,对于非基本数据类型或String类型的属性来说,你可能需要注册一些自定义编辑器。你可以通过覆盖initBinder()方法,通过调用binder.registerCustomEditor()的方法注册编辑器;
3.表单对象通过bindOnNewForm属性(可以通过配置设置,默认为false)判断是否需要将GET请求参数绑定到formBackingObject()方法创建的表单对象中。如果bindOnNewForm为true,执行绑定操作,在绑定完成后,还将调用onBindOnNewForm()回调方法(子类可以提供具体实现)。否则到下一步。不过一般情况下,GET请求参数是用于加载等编辑表单对象的ID值,如topicId、forumId等,一般无需进行绑定;
4.调用referenceData()方法(子类可提供具体实现)准备一些关联的数据,如性别下拉框数据,学历下拉框数据等。一般采用ModelMap创建视图业务中需要用到的请求属性数据,键为属性名,值为属性值,如ModelMap("param1", "paramValue1");
5.使用控制器formView定义的视图渲染表单对象;
6.用户填写或更改表单后,提交表单,向表单控制器发起一个POST请求;
7.接收到POST请求时,表单控制器知道这是一个表单数据提交的操作,所以启动表单提交处理流程;
8.首先通过sessionForm属性判断表单控制器是否启用了Session。如果启用了Session,直接从Session中取出原表单对象,否则再次调用formBackingObject()方法构造出一个表单对象。sessionForm默认为false,可以通过配置进行调整,启用Session可能提高运行性能,但会占用一定的内存;
9.将POST请求参数填充到表单对象中;
10.调用onBind()方法,该方法允许你在表单填充完成后,合法性校验之前执行一些特定的操作;
11.如果validateOnBinding属性设置为true,注册在控制器中的校验器开始工作,对表单对象的属性值执行合法性校验。如果有合法性错误,将被注册到Errors对象中(关于如何注册校验器,我们将稍后介绍);
12.调用onBindAndValidate()方法,该方法允许你在数据绑定及合法性校验后,执行一些额外的自定义操作,你也可以在这里,执行一些额外的合法性校验;
13.调用processFormSubmission()方法处理提交任务,该方法内部又包含后续几步工作;
14.判断方法入参传入errors是否包含错误,如果包含错误返回到formView对应的表单页面中,否则到下一步;
15.通过isFormChangeRequest()方法(默认为false)判断请求是否为表单更改请求,如果为true,调用onFormChange()方法,然后返回到formView对应的表单页面,否则到下一步;
16.如果子类覆盖了onSubmit()方法,执行之,否则执行子类的doSubmitAction()方法。通过这两者之一完成业务的处理,然后返回successView属性指定的成功页面。
spring2.0 文档
org.springframework.web.servlet.mvc.SimpleFormController 是AbstractFormController的子类别,对于简单的表单可以直接继承这个类别,并重新定义其onSubmit()或 doSubmitAction()方法以处理使用者的请求,SimpleFormController的处理流程是这样的:
- 呼叫processFormSubmission()以检验 Errors 物件,看看在绑定或验证时有无任何的错误。
- 如果有错误发生,返回"formView"所设定的页面。
- 如果isFormChangeRequest()根据request被重新定义并返回true,则也会回到"formView",在回到"formView"之前会呼叫 onFormChange() ,让您有机会修正表单物件。
- 如果没有错误发生,则会呼叫带有HttpServletRequest、 HttpServletResponse、Object、BindException参数的onSubmit(),预设是呼叫仅带Object及 BindException的onSubmit(),而后者预设是呼叫只有Object参数的onSubmit(),预设是导向设定的 "successView",可以考虑重新定义doSubmitAction(),不用返回ModelAndView,预设会导向 "successView",在不需要向"successView"传送任何Model资料物件时可以使用。
Method Summary
protected void
doSubmitAction(Objectcommand)
Template method for submit actions.
String
getFormView()
Return the name of the view that should be used for form display.
String
getSuccessView()
Return the name of the view that should be shown on successful submit.
protected boolean
isFormChangeRequest(HttpServletRequestrequest)
Simpler isFormChangeRequest
variant, called by the full variant isFormChangeRequest(HttpServletRequest, Object)
.
protected boolean
isFormChangeRequest(HttpServletRequestrequest, Objectcommand)
Determine whether the given request is a form change request.
protected void
onFormChange(HttpServletRequestrequest, HttpServletResponseresponse, Objectcommand)
Simpler onFormChange
variant, called by the full variant onFormChange(HttpServletRequest, HttpServletResponse, Object, BindException)
.
protected void
onFormChange(HttpServletRequestrequest, HttpServletResponseresponse, Objectcommand, BindExceptionerrors)
Called during form submission if isFormChangeRequest(javax.servlet.http.HttpServletRequest)
returns true
.
protected ModelAndView
onSubmit(HttpServletRequestrequest, HttpServletResponseresponse, Objectcommand, BindExceptionerrors)
Submit callback with all parameters.
protected ModelAndView
onSubmit(Objectcommand)
Simplest onSubmit
variant.
protected ModelAndView
onSubmit(Objectcommand, BindExceptionerrors)
Simpler onSubmit
variant.
protected ModelAndView
processFormSubmission(HttpServletRequestrequest, HttpServletResponseresponse, Objectcommand, BindExceptionerrors)
This implementation calls showForm(HttpServletRequest, HttpServletResponse, BindException)
in case of errors, and delegates to the full onSubmit(HttpServletRequest, HttpServletResponse, Object, BindException)
's variant else.
protected Map
referenceData(HttpServletRequestrequest)
Create a reference data map for the given request.
protected Map
referenceData(HttpServletRequestrequest, Objectcommand, Errorserrors)
Create a reference data map for the given request and command, consisting of bean name/bean instance pairs as expected by ModelAndView.
void
setFormView(StringformView)
Set the name of the view that should be used for form display.
void
setSuccessView(StringsuccessView)
Set the name of the view that should be shown on successful submit.
protected ModelAndView
showForm(HttpServletRequestrequest, HttpServletResponseresponse, BindExceptionerrors)
This implementation shows the configured form view, delegating to the analogous showForm(HttpServletRequest, HttpServletResponse, BindException, Map)
variant with a "controlModel" argument.
protected ModelAndView
showForm(HttpServletRequestrequest, HttpServletResponseresponse, BindExceptionerrors, MapcontrolModel)
This implementation shows the configured form view.
protected boolean
suppressValidation(HttpServletRequestrequest, Objectcommand)
This implementation delegates to isFormChangeRequest(HttpServletRequest, Object)
: A form change request changes the appearance of the form and should not get validated but just show the new form.
发表评论
-
spring-MessageSource
2010-05-05 15:41 1723将Spring自带的org.springframework.c ... -
spring的扩展点--PropertyPlaceholderConfigurer
2010-05-05 14:01 1074它的作用是一个资源属性的配置器,能够将BeanFactory的 ... -
ApplicationContextAware
2010-03-30 14:36 1155JDK-doc 2.5.6 Interface Applic ... -
org.springframework.beans.factory.BeanCreationException: Error creating bean wit
2010-01-24 18:45 3835org.springframework.beans.facto ... -
SPRING框架的7大模块
2008-08-23 16:48 988核心容器:核心容器 ... -
使用Spring编写第一个程序-spring初级体验
2008-08-23 16:52 789对最原始的HelloWorld.java ... -
Spring中BeanFactory配置文件的元素解析
2008-08-24 11:39 745<?xml version="1.0" ... -
使用Lookup方法注射方法
2008-08-24 17:46 699spring方法解决下面的问题:一个singleton bea ... -
替换任意的方法
2008-08-24 18:06 836在spring中不但提供了Lookup方法来注射方法,还提供了 ... -
一个普通表单控制器(SimpleFornController)处理视图流转的例子
2008-08-26 09:40 787Spring附有一些简单的窗体处理handler,这些hand ... -
SPRING分发器(DispatcherServlet)
2008-09-09 00:15 1366分发器(DispatcherServlet) Sprin ... -
Spring的View和ViewResolver的使用
2008-09-11 23:15 1533打开Spring的源代码,我们可以在org.springfra ... -
ModelAndView解析
2008-09-16 09:39 1269查看spring的帮助文档得到以下信息: org.sprin ... -
spring验证器Validator接口
2008-09-16 21:30 2631spring2.0 Validator接口 ... -
spring web mvc配置
2008-09-17 11:04 1131spring内建一个请求驱动 ... -
spring视图解析器
2008-09-17 15:21 1351spring最常用的JSP/JSTL视图解析器是: Int ... -
Spring dataSource配置
2010-01-23 13:40 1822不管通过何种持久化 ... -
AOP(Aspect Oriented Programming ) 面向切面编程
2010-01-23 13:38 836AOP是什么? AOP是OO ...
相关推荐
在Java Web开发中,Spring MVC框架是一个非常流行的MVC(模型-...但是,理解`SimpleFormController`的工作方式可以帮助我们更好地掌握Spring MVC的核心概念,以及框架如何帮助我们管理Web应用中的数据流和控制流程。
在Spring MVC框架中,`SimpleFormController`是一个基础的控制器类,它简化了处理表单提交和模型数据绑定的过程。这个控制器是Spring MVC早期版本中的一个组件,现在已经被`@Controller`注解的类所取代,尽管如此,...
MutiActionControl(多动作控制器)的概念在Spring MVC中指的是一个控制器可以有多个处理方法,每个方法对应一个特定的请求URL。这种方式增强了代码的组织性和可维护性,避免了单一方法处理所有请求的复杂性。例如:...
springMVC3学习(六)--SimpleFormController(源码) 文章地址:http://blog.csdn.net/itmyhome1990/article/details/25988733
这种控制器的优点是可以处理复杂的表单数据,并且有简单的验证功能。但是,它也需要编写 Controller 代码。 Spring MVC 提供了三种类型的控制器,每种控制器都有其特点和应用场景。开发者可以根据实际情况选择合适...
控制器类(FileUploadController.java) ```java import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.web.bind.ServletRequestDataBinder; ...
`SimpleFormController`是Spring MVC早期版本中用于处理表单提交的基础控制器。在`onSubmit`方法中,我们获取到用户提交的数据(`User`对象),并将其放入模型(`ModelAndView`)中以便于视图渲染。`...
首先,`SimpleFormController`是Spring MVC早期版本中提供的一个抽象控制器,主要用于处理表单提交。它内置了对HTTP请求方法(GET和POST)的处理,简化了表单验证和模型数据的绑定过程。`SimpleFormController`通常...
控制器可以继承 AbstractFormController 或 AbstractWizardFormController,以便处理用户输入表单。例如,LoginBankController 是一个继承自 SimpleFormController 的控制器,它负责处理用户登录请求。 视图 在 ...
- 控制器处理完请求后返回ModelAndView对象; - `DispatcherServlet`再通过ViewResolver解析视图名称,获得具体的视图对象; - 最后,`DispatcherServlet`将模型数据填充到视图中并渲染页面,返回给客户端。 ###...
- Spring MVC提供多种类型的控制器,如AbstractController、AbstractCommandController、MultiActionController、SimpleFormController等,帮助开发者处理不同复杂度的控制逻辑。 - 与Struts相比,Spring MVC允许...
Spring MVC虽然提供了表单控制器(如SimpleFormController和AbstractWizardController),但它们仍然局限在单个请求级别的控制。相比之下,Spring Web Flow提供了一种更高级别的解决方案,它允许开发者以声明式的...
在类级别上,它定义了控制器处理的请求的基本路径,如 `@RequestMapping("/forum.do")`。在方法级别上,它进一步细化了处理的具体请求,例如 `@RequestMapping` 与 `RequestMethod.GET` 结合表示处理 GET 方法的请求...
Spring提供了多种控制器基类,如`AbstractController`、`AbstractCommandController`、`MultiActionController`、`SimpleFormController`和`AbstractWizardFormController`,以适应不同层次的控制需求。与Struts不同...
Spring MVC 提供了一些控制器,如 SimpleFormController 和 AbstractWizardController,但它们仍然没有完全解决页面流程的管理问题。 Spring Web Flow 提供了一种统一的方法来定义和实现页面流程,使得流程逻辑独立...
如果你的控制器不需要处理表单数据,可以选择不使用表单控制器,这是Spring MVC与Struts的一个显著区别。 Spring MVC遵循“开闭原则”,即对扩展开放,对修改关闭。框架的核心类的某些方法被声明为final,不允许...
自己写的spring表单绑定的小例子,分别使用SimpleFormController,MultiActionController,spring的form tag和validator。 还在MultiActionController里面实现了表单的绑定
3. `SimpleFormController`是Spring MVC早期版本中的一个控制器类,它简化了处理表单提交的过程。以下是一些关键方法的解释: - `formBackingObject()`:创建并返回用于填充表单的初始模型对象。 - `initBinder()`...
为了适应复杂的应用场景,Spring提供了多种抽象控制器,如AbstractController、AbstractCommandController、MultiActionController、SimpleFormController和AbstractWizardFormController,允许开发者按需选择。...