可以使用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"

+1

确保您是否做错了或不做的唯一方法就是尝试一下。 – 2013-03-20 23:31:10

+0

哦,它到目前为止一直工作正常......但我想检查是否滥用了创建新bean的事实,并且当自动装配的bean与我的模型属性具有相同的名称时调用setter。虽然它起作用,但我想了解它是否偶然运行,如果有的话,是否还有一种更“标准方式”使用form:form在春季? – 2013-03-20 23:54:40

+0

关联问题中的解释让我重新思考这种编码方式。 – 2013-03-20 23:56:30

这个签名也应该完全为你工作:

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) 

将是您从您的数据库预先填充模型,将是什么形式提交增强。

+0

我看到...既然你说优势......这是否意味着它是JSP和模型中连接spring'

'标签的首选/唯一方式。 – 2013-03-21 01:40:52

+0

由于模型将随着我在表单中提交的内容而得到增强,我希望它只是我的表单副本,而不是数据库的数据副本自动修改。我想对装饰JPA实体的模型表单进行一些检查。 – 2013-03-21 01:46:16

+0

思考我的问题......我想如果我在某个时间点将实体作为参数调用合并,那么应该将更改发送到数据库。另外这个推理依赖于这样一个事实,即每次我使用ajax获取表单时,都会在模型表单的构造函数中使用新的ModelEntity()创建一个新的ModelForm。用户填充除主键字段以外的所有字段并提交表单。我根据表单中的其他参数设置主键字段。我想这应该没问题,只要我不叫合并。 – 2013-03-21 02:26:38