我一直在使用以下代码:
@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"
。
答案 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)
将是您从数据库中预先填充的模型,将使用表单中提交的内容进行增强。