SimpleFormController在Controller继承体系位于最底端,是一个功能强大,而且比较复杂的Controller。下面是SimpleFormController的主要继承图谱:
下面是SimpleFormController的处理流程,分为post方法和get方法。
get方法处理流程(一般连接的形式为get方法):
- 按请求转到相应controller;
- 调用formBackingObject()方法,创建一个command对象的实例(如果设定了commandClass,则不需要override formBackingObject()方法了);
- 调用initBinder(),注册需要的类型转换器;
- 调用showForm()方法,返回一个view,即准备呈现给用户的视图,一般情况下这个方法是不需要override的,只需设定formView即可;
- 调用referenceData()方法。这个方法返回一个Map对象,可以把在view中需要展现的数据放入这个Map中;
- 转到formView指定的视图。
post方法处理流程(一般用于处理表单):
- 按请求转到相应controller;
- 调用formBackingObject()方法,创建一个command对象的实例(如果设定了commandClass,则不需要override formBackingObject()方法了);
- 把请求参数注入表单对象;
- 执行onBind()方法;
- 执行validator验证。
- 执行onBindAndValidate()方法;
- 若有err,则转到formView视图;
- 执行onSubmit()方法或doSubmitAction()方法。
- onSubmit(req, res, command, errs);
- onSubmit(command, errs);
- onSubmit(command);
protected void doSubmitAction(Object obj) throws Exception |
它的返回类型是void,而不是我们预想的ModelAndView,并且也不返回任何视图层需要的数据。实际上doSubmitAction执行完毕后会自动转到successView视图。并且如果配合sessionForm来使用的的话(sessionForm设为true),那么在转到successView视图后,在session中可以取到先前的表单对象(所谓的POJO)。