spring MVC 3.0中的simpleFormcontroller工作流程

时间:2012-10-11 06:07:23

标签: spring spring-mvc controller

我已经看到很多关于simpleFormcontroller如何运作的例子。

但我仍然有些困惑。

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

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

任何人都可以解释一下吗?

5 个答案:

答案 0 :(得分:10)

工作流程如下,由AbstractFormController class-

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

Source

有关详细信息和图表表示以了解流程,请参阅以下链接 -

答案 1 :(得分:3)

自Spring 3.0以来,

SimpleFormController已被弃用

在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(),seenceData()方法是由谁和何时自动调用的?”

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

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

  • referenceData在需要为视图构建模型时始终会调用AbstractFormController

答案 2 :(得分:1)

formBackingObject()方法,用于在渲染页面之前执行某些操作。即喜欢HTML组件中的默认值。

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

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

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

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

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

使用method = POST以与OnSubmit()

相同的方式添加方法

答案 3 :(得分:0)

rfe folling link

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

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

答案 4 :(得分:0)

FormBackingObjectMethod()---> @RequestMapping(requestMethod.GET) 而第一次表单显示在屏幕上的形式是BackingObject的原因

initBinder()--->通常用于假设你想要日期字段应该是例如(自定义日期示例:dd ** MM *** yyyy)需要的意思是使用initBinder方法

onSubmit() - > @RequestMapping(requestMethod.POST)  同时提交表单onSubmit()方法得到调用

我希望这有帮助