是否可以将ModelAttribute用作RequestMapping方法的方法参数?

时间:2013-03-20 23:28:22

标签: java jsp spring-mvc

我一直在使用以下代码:

@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 个答案:

答案 0 :(得分:0)

此签名也应该适合您:

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注释的方法,那么preloads会说你的MyModelForm的一部分:

@ModelAttribute("paramName");
public MyModelForm loadModel(int id) {
   MyModelForm fromDB = loadFromDB(id);
}

现在,您的方法签名的优势在于:

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

将是您从数据库中预先填充的模型,将使用表单中提交的内容进行增强。