6

我看过很多关于如何simpleFormcontroller工作的例子。

但我还是有些困惑。

我想知道何时调用formBackingObject()方法?referenceData()onSubmit()

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

谁能解释我?

4

5 回答 5

12

工作流程如下,由AbstractFormController类控制-

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

资源

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

于 2014-09-01T07:35:50.210 回答
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
}

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

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

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

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

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

于 2012-10-11T07:32:51.863 回答
1

formBackingObject()方法,当你想在渲染页面之前采取一些行动时使用。即类似于 HTML 组件中的默认值。

refereceData()方法,用于在表单中添加参考数据,即填充下拉列表

OnSubmit()方法,在您提交表单时调用。

但是,如果您使用的是 Spring 3.0,请按照以下方法使用注释

@RequestMapping(value = "/index.htm", method = RequestMethod.GET)
public String showLogin() {
    return "user/login";
}

这将与 formBackingObject 相同。并在此方法中使用 modelMap() 并添加参考数据。

以与方法 = POST 相同的方式添加方法,这将与 OnSubmit() 相同

于 2012-10-11T06:53:37.660 回答
0

rfe 链接

http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/web/servlet/mvc/SimpleFormController.html

阅读工作流程..您可以简单地理解您的疑问..

于 2013-01-11T07:11:29.643 回答
0

FormBackingObjectMethod()---> @RequestMapping(requestMethod.GET) while first time form shown to the screen formBackingObject is the reason

initBinder()---> normally used for suppose you want date field should be for example (custom date example : dd**MM***yyyy) needed means use initBinder method

onSubmit() -->@RequestMapping(requestMethod.POST) while submitting the form onSubmit() method get called

i hope this helps

于 2018-02-07T04:55:02.803 回答