Java 使用ModelAttribute作为RequestMapping方法的方法参数可以吗?

Java 使用ModelAttribute作为RequestMapping方法的方法参数可以吗?,java,jsp,spring-mvc,Java,Jsp,Spring Mvc,我一直在使用以下代码: @RequestMapping(value="/myUrl", method=RequestMethod.GET) public ModelAndView myRequestHandler( HttpServletRequest request, HttpServletResponse response, @ModelAttribute(value="paramName") @ValidMyModelForm form) // automatically

我一直在使用以下代码:

@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是否正确

我用对了吗?这似乎有效,但我想确保我没有做错任何事

表单对象通过单独的方法添加到模型中,使用如下代码:

 modelAndView.addObject("formName", new MyModelForm());

在JSP视图中,我添加了一个表单名称,作为
commandName=“formName”

此签名也应该对您非常有效:

public ModelAndView myRequestHandler(@Valid MyModelForm form)
在这里,SpringMVC将确保根据表单提交的内容创建并绑定一个
MyModelForm
实例

现在,附加的
@modeldattribute
为您带来了什么:

首先是简单的情况:

public ModelAndView myRequestHandler(@ModelAttribute("paramName") @Valid MyModelForm form)
假设您没有使用
@modeldattribute
的任何其他方法,上述操作将按名称
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)
}
其次,如果您有一个用@modeldattribute注释的方法,该方法预加载MyModelForm的一部分:

@ModelAttribute("paramName");
public MyModelForm loadModel(int id) {
   MyModelForm fromDB = loadFromDB(id);
}
现在,您的方法签名的优点是:

public ModelAndView myRequestHandler(@ModelAttribute("paramName") @Valid MyModelForm form)

您从数据库中预先填充的模型将通过表单中提交的内容得到增强。

确保您是否做错了的唯一方法是尝试。哦,到目前为止,它对我来说一直很好。。。但是我想检查我是否滥用了这样一个事实,即当一个自动连接的bean与我的model属性具有相同的名称时,会创建一个新bean并调用setter。虽然它是有效的,但我想知道它是否只是碰巧起作用,如果是的话,是否有一种更“标准的方式”来使用表单:spring中的表单?链接问题中的解释促使我重新思考这种编码方式。我明白了。。。既然你说优势。。。这是否意味着它是连接JSP和模型中spring
标记的首选/唯一方法。由于模型将通过我在表单中提交的内容得到增强,我希望它只是表单的副本,而不是数据库自动修改的数据副本。我想对装饰JPA实体的模型表单做一些检查。。。我认为,如果我在某个时间点调用merge,仅将实体作为参数,那么更改应该发送到数据库。这种推理还取决于这样一个事实:每次使用ajax获取表单时,我都会在模型表单的构造函数中创建一个新的ModelForm,并使用new ModelEntity()。用户填充除主键字段之外的所有字段并提交表单。我根据表单中的一些其他参数设置主键字段。我想只要我不叫合并就可以了。