可以使用ModelAttribute作为RequestMapping方法的方法参数吗?
我一直在使用下面的代码:可以使用ModelAttribute作为RequestMapping方法的方法参数吗?
@RequestMapping(value="/myUrl", method=RequestMethod.GET)
public ModelAndView myRequestHandler(
HttpServletRequest request, HttpServletResponse response,
@ModelAttribute(value="paramName") @ValidMyModelForm form)
// automatically populates form setters from form:form in JSP view
{
}
在以下链接我开始怀疑我的ModelAttribute的用法是错误的在这里读的答案。
What is @ModelAttribute in Spring MVC?
我使用它的正确方法?它似乎工作,但要确保我没有做错什么。
形式对象添加在看起来像一个单独的使用方法的代码来建模:
modelAndView.addObject("formName", new MyModelForm());
在JSP视图我有一个形式名称加入作为commandName="formName"
。
这个签名也应该完全为你工作:
public ModelAndView myRequestHandler(@Valid MyModelForm form)
这里的Spring MVC将确保MyModelForm
实例被创建和绑定的依据是什么,从你的表单提交。现在
,什么是附加@ModelAttribute
为您带来:
首先简单情况:
public ModelAndView myRequestHandler(@ModelAttribute("paramName") @Valid MyModelForm form)
假设你没有与@ModelAttribute
,上面有哪些需要做的是寻找一个模型中的任何其他方法通过名称paramName
,由于该假设不太可能存在,那么MyModelForm的一个实例将像以前一样被创建并绑定,另外还有一个模型对象,其名称为paramName
,可用于您的查看: paramName.myformValue
等。
所以:
public ModelAndView myRequestHandler(@ModelAttribute("paramName") @Valid MyModelForm form)
等同于:
public ModelAndView myRequestHandler(@Valid MyModelForm form, Model model) {
...
model.addAttribute("paramName", form)
}
其次,如果您有@ModelAttribute注解的方法,它预载说你MyModelForm的一部分:
@ModelAttribute("paramName");
public MyModelForm loadModel(int id) {
MyModelForm fromDB = loadFromDB(id);
}
现在,您的方法签名的优点是:
public ModelAndView myRequestHandler(@ModelAttribute("paramName") @Valid MyModelForm form)
将是您从您的数据库预先填充模型,将是什么形式提交增强。
我看到...既然你说优势......这是否意味着它是JSP和模型中连接spring'
由于模型将随着我在表单中提交的内容而得到增强,我希望它只是我的表单副本,而不是数据库的数据副本自动修改。我想对装饰JPA实体的模型表单进行一些检查。 – 2013-03-21 01:46:16
思考我的问题......我想如果我在某个时间点将实体作为参数调用合并,那么应该将更改发送到数据库。另外这个推理依赖于这样一个事实,即每次我使用ajax获取表单时,都会在模型表单的构造函数中使用新的ModelEntity()创建一个新的ModelForm。用户填充除主键字段以外的所有字段并提交表单。我根据表单中的其他参数设置主键字段。我想这应该没问题,只要我不叫合并。 – 2013-03-21 02:26:38
确保您是否做错了或不做的唯一方法就是尝试一下。 – 2013-03-20 23:31:10
哦,它到目前为止一直工作正常......但我想检查是否滥用了创建新bean的事实,并且当自动装配的bean与我的模型属性具有相同的名称时调用setter。虽然它起作用,但我想了解它是否偶然运行,如果有的话,是否还有一种更“标准方式”使用form:form在春季? – 2013-03-20 23:54:40
关联问题中的解释让我重新思考这种编码方式。 – 2013-03-20 23:56:30