Spring学习笔记(十二)----SimpleFormController(上)

SimpleFormController在Controller继承体系位于最底端,是一个功能强大,而且比较复杂的Controller。下面是SimpleFormController的主要继承图谱:
 
Spring学习笔记(十二)----SimpleFormController(上)
     SimpleFormController本身的强大和复杂性从上图就可以看出。实际上,SimpleController除了在处理上要经过一个多步的流程,而且在处理不同类型请求时(如post,get)。(希望大家看一下上面的图和bean定义)
下面是SimpleFormController的处理流程,分为post方法和get方法。
 
get方法处理流程(一般连接的形式为get方法):
  1. 按请求转到相应controller;
  2. 调用formBackingObject()方法,创建一个command对象的实例(如果设定了commandClass,则不需要override formBackingObject()方法了);
  3. 调用initBinder(),注册需要的类型转换器;
  4. 调用showForm()方法,返回一个view,即准备呈现给用户的视图,一般情况下这个方法是不需要override的,只需设定formView即可;
  5. 调用referenceData()方法。这个方法返回一个Map对象,可以把在view中需要展现的数据放入这个Map中;
  6. 转到formView指定的视图。

   一般情况下步骤2,3,4的方法是不需要override的,它们只需要在配置文件中进行相关属性的定义即可。而步骤5的referenceData()一般是要在自己的SimpleFormController中进行重新定义的。

post方法处理流程(一般用于处理表单):

  1. 按请求转到相应controller;
  2. 调用formBackingObject()方法,创建一个command对象的实例(如果设定了commandClass,则不需要override formBackingObject()方法了);
  3. 把请求参数注入表单对象;
  4. 执行onBind()方法;
  5. 执行validator验证。
  6. 执行onBindAndValidate()方法;
  7. 若有err,则转到formView视图;
  8. 执行onSubmit()方法或doSubmitAction()方法。
     同处理get方法一样,步骤2的formBackingObject()方法一般是不会去重载的。步骤3也不需要我们做什么。真正需要我们做的是4,5,6,8步。当然4,5,6是可选的,如果有需要,可以去实现它们中的一个或几个,执行的步骤是按上面的顺序。但步骤8的两个方法是必须选一个的(两个都override是没有意义的)。
     这里要说明一下onSubmit()方法和doSubmitAction()方法。在SimpleFormController中,有三种形式的onSubmit方法,它们是:
  • onSubmit(req, res, command, errs);
  • onSubmit(command, errs);
  • onSubmit(command);

   但是这三种方法不是孤立的,第一个方法在执行中会调用第二个方法,第二个方法在执行中会调用第三个方法。一般在定义自己的SimpleFormController时只是override onSubmit(command)方法。

   doSubmitAction()方法是一个有意思的方法,它的完整定义如下:

protected void doSubmitAction(Object obj) throws Exception

它的返回类型是void,而不是我们预想的ModelAndView,并且也不返回任何视图层需要的数据。实际上doSubmitAction执行完毕后会自动转到successView视图。并且如果配合sessionForm来使用的的话(sessionForm设为true),那么在转到successView视图后,在session中可以取到先前的表单对象(所谓的POJO)。

  说了这么多,还是看个实例比较形象(SimpleFormController(中))。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值