khy*_*ati 6 spring controller spring-mvc
我看过很多关于simpleFormcontroller工作原理的例子.
但我仍然有些困惑.
我想知道什么时候formBackingObject(),referenceData(),onSubmit()调用的方法?
我不知道这些方法的确切工作流程?
有人能解释一下吗?
Ani*_*kur 12
工作流程如下,并由AbstractFormController班级控制 -
- 控制器接收新表单的请求(通常是GET).
- 调用formBackingObject(),默认情况下返回已配置的commandClass实例(请参阅超类公开的属性),但也可以重写为例如从数据库中检索对象(需要使用表单修改) ).
- 调用initBinder(),它允许您为命令类的某些字段(通常是非原始类型或非String类型的属性)注册自定义编辑器.这将为这些属性值呈现适当的字符串,例如特定于语言环境的日期字符串.
- 仅当bindOnNewForm设置为true时,才应用ServletRequestDataBinder以使用初始请求参数填充新表单对象,并调用onBindOnNewForm(HttpServletRequest,Object,BindException)回调方法.注意:此时不应用任何已定义的验证器,以允许部分绑定.但请注意,通过initBinder()应用的任何Binder自定义(例如DataBinder.setRequiredFields(String [])仍然适用.因此,如果使用bindOnNewForm = true和initBinder()自定义用于验证字段而不是使用Validators,如果只为新表单填充一些字段,则错误对象中缺少字段可能会出现一些绑定错误.显示绑定器错误的任何视图(JSP等)都需要是智能的,对于这种情况考虑是否显示初始表单视图或后续发布结果,跳过前者的错误显示.
- 调用showForm()以返回应呈现的视图(通常是呈现表单的视图).此方法必须在子类中实现.
- 该showForm()实现将调用referenceData() ,您可以实现提供编辑表单(如语言环境的对象列表,你打算让用户选择一个距离)时,您可能需要的任何相关的参考数据.
- 模型被暴露并且视图被渲染,让用户填写表单.
- 控制器接收表单提交(通常是POST).要使用不同的方式检测表单提交,请覆盖isFormSubmission方法.
- 如果未设置sessionForm,则调用formBackingObject()以检索表单对象.否则,控制器尝试查找已在会话中绑定的命令对象.如果找不到该对象,它会调用handleInvalidSubmit - 默认情况下 - 尝试创建一个新的表单对象并重新提交该表单.
- 所述ServletRequestDataBinder被施加来填充当前请求参数的形式的对象.
- 调用onBind(HttpServletRequest,Object,Errors),它允许您在绑定之后但在验证之前进行自定义处理(例如,将请求参数手动绑定到bean属性,以供Validator查看).
- 如果设置了validateOnBinding,则将调用已注册的Validator.Validator将检查表单对象属性,并通过给定的Errors对象注册相应的错误.
- 调用onBindAndValidate(),它允许您在绑定和验证后进行自定义处理(例如,手动绑定请求参数,并在Validator之外验证它们).
- 调用processFormSubmission()来处理提交,有或没有绑定错误.此方法必须在子类中实现.
有关更多详细信息和图表表示以了解流程,您可以参考下面的链接 -
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在需要为视图构建模型时调用。
| 归档时间: |
|
| 查看次数: |
10601 次 |
| 最近记录: |