spring MVC 3.0中的simpleFormcontroller工作流程

khy*_*ati 6 spring controller spring-mvc

我看过很多关于simpleFormcontroller工作原理的例子.

但我仍然有些困惑.

我想知道什么时候formBackingObject(),referenceData(),onSubmit()调用的方法?

我不知道这些方法的确切工作流程?

有人能解释一下吗?

Ani*_*kur 12

工作流程如下,并由AbstractFormController班级控制 -

  1. 控制器接收新表单的请求(通常是GET).
  2. 调用formBackingObject(),默认情况下返回已配置的commandClass实例(请参阅超类公开的属性),但也可以重写为例如从数据库中检索对象(需要使用表单修改) ).
  3. 调用initBinder(),它允许您为命令类的某些字段(通常是非原始类型或非String类型的属性)注册自定义编辑器.这将为这些属性值呈现适当的字符串,例如特定于语言环境的日期字符串.
  4. 仅当bindOnNewForm设置为true时,才应用ServletRequestDataBinder以使用初始请求参数填充新表单对象,并调用onBindOnNewForm(HttpServletRequest,Object,BindException)回调方法.注意:此时不应用任何已定义的验证器,以允许部分绑定.但请注意,通过initBinder()应用的任何Binder自定义(例如DataBinder.setRequiredFields(String [])仍然适用.因此,如果使用bindOnNewForm = true和initBinder()自定义用于验证字段而不是使用Validators,如果只为新表单填充一些字段,则错误对象中缺少字段可能会出现一些绑定错误.显示绑定器错误的任何视图(JSP等)都需要是智能的,对于这种情况考虑是否显示初始表单视图或后续发布结果,跳过前者的错误显示.
  5. 调用showForm()以返回应呈现的视图(通常是呈现表单的视图).此方法必须在子类中实现.
  6. showForm()实现将调用referenceData() ,您可以实现提供编辑表单(如语言环境的对象列表,你打算让用户选择一个距离)时,您可能需要的任何相关的参考数据.
  7. 模型被暴露并且视图被渲染,让用户填写表单.
  8. 控制器接收表单提交(通常是POST).要使用不同的方式检测表单提交,请覆盖isFormSubmission方法.
  9. 如果未设置sessionForm,则调用formBackingObject()以检索表单对象.否则,控制器尝试查找已在会话中绑定的命令对象.如果找不到该对象,它会调用handleInvalidSubmit - 默认情况下 - 尝试创建一个新的表单对象并重新提交该表单.
  10. 所述ServletRequestDataBinder被施加来填充当前请求参数的形式的对象.
  11. 调用onBind(HttpServletRequest,Object,Errors),它允许您在绑定之后但在验证之前进行自定义处理(例如,将请求参数手动绑定到bean属性,以供Validator查看).
  12. 如果设置了validateOnBinding,则将调用已注册的Validator.Validator将检查表单对象属性,并通过给定的Errors对象注册相应的错误.
  13. 调用onBindAndValidate(),它允许您在绑定和验证后进行自定义处理(例如,手动绑定请求参数,并在Validator之外验证它们).
  14. 调用processFormSubmission()来处理提交,有或没有绑定错误.此方法必须在子类中实现.

资源

有关更多详细信息和图表表示以了解流程,您可以参考下面的链接 -


Ral*_*lph 5

SimpleFormController 自 Spring 3.0 起已弃用

在 Spring 3.0 中,使用一个带有两种方法的控制器用于创建过程(第三种用于显示页面)。它的典型外观是这样的:

/**
 * Shows a form for car creation.
 */
@RequestMapping(params = "form", method = RequestMethod.GET)
public ModelAndView createForm() {
    ModelMap uiModel = new ModelMap();
    uiModel.addAttribute("carCreateFormBackingObject", new CarCreateFormBackingObject()); //formBackingObject - often called command object
    uiModel.addAttribute("manufactureres", this.manufactureresDao.readAll()); //referenceData
    return new ModelAndView("car/create", uiModel);
}

/**
 * Creates the car and redirects to its detail page.
 *
 */
@RequestMapping(method = RequestMethod.POST)
public ModelAndView create(final @Valid CarCreateFormBackingObject carCreateFormBackingObject,
        final BindingResult bindingResult) {

    if (bindingResult.hasErrors()) {
                ModelMap uiModel = new ModelMap();
        uiModel.addAttribute("carCreateFormBackingObject", carCreateFormBackingObject);
        uiModel.addAttribute("manufactureres", this.manufactureresDao.readAll()); //referenceData
        return new ModelAndView("car/create", uiModel);
    }

    Car car = this.carService.create(carCreateFormBackingObject.name, ...);
    return new ModelAndView(new RedirectView("/cars/" + car.getId(), true)); //redirect to show page
}
Run Code Online (Sandbox Code Playgroud)

我仍然想知道 formBackingObject(),refernceData() 方法由谁和何时自动调用?

回到你的问题“我仍然想知道 formBackingObject(),refernceData() 方法被谁和何时自动调用?”

所有这些方法都被SimpleFormController(及其超类AbstractFormController)调用,遵循模板方法模式。-SimpleFormController在此流程的某些挂钩中定义流程和您的具体子类“插件”以获得业务价值。

  • formBackingObjectinAbstractFormController在控制器需要处理提交 (POST) 或为初始“新”视图构建 Command 对象时调用。

  • referenceData总是AbstractFormController在需要为视图构建模型时调用。