您的位置:首页 > 编程语言 > Java开发

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流程简述
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息