0

我一直在使用以下代码:

@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 的使用在这里不正确。

Spring MVC 中的@ModelAttribute 是什么?

我是否以正确的方式使用它?它似乎有效,但想确保我没有做错任何事。

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

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

在 JSP 视图中,我将表单名称添加为commandName="formName".

4

1 回答 1

0

这个签名也应该非常适合你:

public ModelAndView myRequestHandler(@Valid MyModelForm form)

这里 Spring MVC 将确保MyModelForm根据从表单提交的内容创建和绑定实例。

现在,额外@ModelAttribute带给你什么:

首先是简单的案例:

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

假设您没有任何其他方法 with @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)

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

于 2013-03-21T00:58:23.083 回答