Spring MVC表单控制器SimpleFormController 流程解说
2013-03-27 23:15
435 查看
以注册为例:
1、当表单控制器接收到一个请求时,请求控制器会先判断请求类型,进入handleRequestInternal()【因为Controller继承SimpleFormController,其又继承AbstractFormController抽象类,抽象类里有该方法】具体可以查看文章:流程整理
2、handleRequestInternal()方法首先调用isFormSubmission()判断是否为Form Submission,该方法中若request.getMethod()为POST则返回true
【GET流程】
一开始请求注册为GET,所以不是Form Submission,调用showNewForm()
3、showNewForm()流程:
(1)首先调用getErrorsForNewForm()
<1>调用formBackingObject():使用createCommand()创建一个新表单对象
<2>调用createBinder():创建一个绑定对象
[1] 建立ServletRequestDataBinder
[2] 呼叫prepareBinder()
[3] 呼叫initBinder():用来初始化绑定对象,可以进行数据格式化
<3>调用isBindOnNewForm()判断是否将GET请求参数绑定到formBackingObject()方法创建的表单中
是,则呼叫onBindOnNewForm()回调方法(默认为false)
(2)其次调用showForm():显示表单
<1>调用isSessionForm()判断是否为session form,是则将表单对象放到session
<2>调用referenceData():准备一些关联的数据,如下拉列表
<3>回传ModelAndView,将表单显示在页面上
【POST流程】
4、当填写完表单,提交后就发送一个POST请求,handleRequestInternal中isFormSubmission返回true
<1>调用getCommand():为请求返回一个表单对象
[1] 调用isSessionForm()判断是否为session form
——>是,则判断表单对象是否在session中——>是,则从session取得原表单对象
——>否(或不在session中),调用formBackingObject(),创建一个新的表单对象回传
[2] 呼叫currentFormObject()回传sessionFormObject
<2>调用bindAndValidate():进行绑定和验证
[1] 调用createBinder()创建一个ServletRequestDataBinder类型的绑定对象
[2] new BindException()
[3] 创建和初始化一个绑定对象后,调用suppressBinding()判断是否禁止绑定,不禁止则
——>呼叫ServletRequestDataBinder.bind()绑定请求参数到表单对象中
——>呼叫onBind() :允许在表单填完后,合法性校验前执行一些特定操作
——>之后调用isValidateOnBinding判断是否绑定验证,是则调用suppressValidation判断是否禁止验证,不禁止则验证表单对象(呼叫ValidationUtils.invokeValidator())
——>之后呼叫onBindAndValidator():允许在数据绑定及合法性校验之后,执行一些额外的自定义操作
[4] 回传ServletRequestDataBinder对象
——————————————##############################———————————————
!【 在SimpleFormController中重写了suppressValidation方法】
【 由于suppressValidation以isFormChangeRequest结果为返回值,所以我们可以在注册的控制类中重写isFormChangeRequest方法,
如将增删改查返回true(禁止验证),提交保存返回false(不禁止),自定义哪些动作要Validator类验证,哪些不要。
isFormChangeRequest为true 之后会自动调用onFormChange,可以重写在里面进行自定义的操作(包括自定义的检查)。
----》所以,默认情况下onFormChange不执行Validator验证、onSubmit执行Validator验证
如果要让onFormChange执行Validator验证,必须重写isFormChangeRequest(返回true才会执行onFormChange),
并且suppressValidation返回值必须为false(才不会禁止验证)。
】
——————————————##############################———————————————
<3>执行完bindAndValidate()后把回传的binder取出result(binder.getBindingResult() ),传给new BindException,之后
调用processFormSubmission():用于处理提交任务
[1] 调用BindException的hasErrors()判断BindException是否有error,有则呼叫showForm,在页面显示错误
(如果禁止验证,则该处不会出现错误)
——>showForm()先判断isSessionForm(),是则从session取回表单对象,将error传给referenceData(),并取得Map物件,最后将Map物件带入ModelAndView回传
[2] 否则,调用isFormChangeRequest(),判断请求是否为表单更改请求【可以在Controller类中重写】
——>是则呼叫onFormChange():在提交之前更改表单【可以在Controller类中重写<如添加验证结果>】
——>之后呼叫showForm()回传,显示表单
[3] 当前2个不成立,呼叫onSubmit()回传【可在Controller类中重写,可以修改表单,跳转到成功页面>】
——>onSubmit()先呼叫getSuccessView取得成功返回页面,在new ModelAndView()回传
如需要流程的简化介绍--参看文章:Spring流程简述
相关文章推荐
- Spring MVC的表单控制器——SimpleFormController
- 使用Spring MVC 的表单控制器SimpleFormController
- Spring MVC的表单控制器——SimpleFormController .
- 使用Spring MVC 的表单控制器SimpleFormController
- Spring MVC的表单控制器——SimpleFormController
- spring mvc基础篇(三):后端控制器之SimpleFormController
- 表单控制器SimpleFormController
- spring mvc示例代码(使用SimpleFormController表单控制)
- SimpleFormController的工作流程以及表单的验证
- Spring MVC 复杂表单分部提交--使用AbstractWizardFormController解决方案
- SpringMVC学习之控制器—simpleformcontroller
- spring MVC中前端提交Form表单在controller中的数据绑定
- Spring mvc (三) [继承SimpleFormController配合formbean区别get和post请求]
- spring mvc的SimpleFormController与AJAX结合遇到的一些问题
- Spring MVC 复杂表单分部提交--使用AbstractWizardFormController解决方案
- Spring MVC中Controller如何获取Form表单提交的数据
- spring mvc的SimpleFormController与AJAX结合遇到的一些问题
- spring mvc的SimpleFormController与AJAX结合遇到的一些问题
- Spring MVC(四)封装表单参数的控制器(AbstractCommandController)
- Spring MVC中Controller如何获取Form表单提交的数据