SimpleFormController 工作流

需要注意的是这两个控制器都是横跨两个页面的控制器,一个是get进入修改或新增页面,另一个就是页面提交即保存或增加( 使 用SimpleFormController时,你无需为初始化表单编写额外的控制器,当你通过GET请求访问表单控制器时,表单控制器自动将请求导向到 表单录入页面。而当你通过POST请求访问表单控制器时,表单控制器执行表单提交的业务,根据处理成功与否,或导向到成功页面,或导向到表单录入页面(当 发生异常时导向到错误页面)

       由于SimpleFormController是继承 AbstractFormController,在该AbstractFormController中的handleRequestInternal方法 需要判断当前提交的方法是Get还是Post,如果是Get则是New一个View,如果是Post则是运行客户端业务逻辑,然后跳转到成功页面。

  • 通过Get 方式请求一个View

1、Controller受到一个Get请求;

2、formBackingObject()方法,如果需要读取数据库,这里是一个比较好的地 方去做这件事情。然后将Object通过request.setAttribute来传递到页面;如果页面表单需要绑定多个Object,可以在这里读取 数据库取得,然后设置到页面上。

3、initBinder() 这里是用来进行数据格式化转换的;如果在页面上显示某些类型需要进行格式化显示,那么需要在XXXXFormController中重载该方法,指定特定的转换器完成对特定Object的设置。如对于日期格式需要在本方法中增加如下代码:

binder.registerCustomEditor(Date.class, null, new CustomDateEditor(

new SimpleDateFormat("MM/dd/yyyy"),true));

4、调用 AbstractFormController.handleRequestInternal方法,在该方法中判断,如果是新建一个Form View,则调用ShowNewForm方法,在ShowNewForm方法中调用了ShowForm方法,SimpleFormController实 现了此方法,指向的url是Controller中注册的formView参数。

6、View 模块完成,显示给用户。

 

  • 通过Post方式提交一个Form

1、 提交后根据Action指向的URL在urlMapping配置中找到指定的Controller;

2、 如果配置了Validator则使用该Validator(见applicationContext-validation.xml)进行相关的验证;缺省是beanValidator。错误信息写入到errors参数里。

3、调用 AbstractFormController.handleRequestInternal方法,在该方法中判断是通过Post来调用此方法,则调用 processFormSubmission方法,该方法会先判断errors中是否有验证错误,如果有则返回到原表单页面,显示错误信息。

4、 验证通过后进入onSubmit方法,该方法的command参数对应绑定到页面的对象,

如果在表单中有多个对象需要进行绑定,那么其它对象可以通过this.bindAndValidate(HttpServletRequest request, Object command);方法来进行绑定。

5、 做相关的业务操作。

6、往返回界面上输出结果提示信息,通过getText和saveMessage()方法完 成。getText()第一个参数是在资源文件中的信息代码,第二个参数是发给该信息的参数,在该信息中通过{0}来读取,第三个参数是当前使用的 Locale。saveMessage()的信息显示是通过 common/messages.jsp来进行。

7、 返回一个ModelAndView(new RedirectView(success)),success对应action-servlet.xml文件该Controller所配置successView,跳转路径是相对路径。

而对于MultiActionController来说,要么继承这个类,要么给它设个delegate,注意不能类中出现方法多态。相对简单一些

 

-------------------------------------------------------------------------------------------------------------------------------------------------------------------

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属性指定的成功页面。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值