Spring 3参考资料告诉我们:
将它放在方法上时 参数,
@ModelAttribute
映射a 模型属性具体, 带注释的方法参数
我不明白这个魔法咒语,因为我确定模型对象的别名(如果使用ModelMap
作为返回类型的键值)在执行请求处理程序方法后传递给View。因此,当请求处理程序方法执行时,模型对象的名称无法映射到方法参数。
为了解决这个矛盾,我去了stackoverflow并找到了this详细的例子。 例子的作者说:
//“personAttribute”模型具有 从...传递给控制器 JSP
看来,他被春季参考所吸引......
为了消除我在我的环境中部署他的示例应用程序的魅力,并从方法MainController.saveEdit()
中残留地剪切@ModelAttribute注释。结果应用程序无需任何更改即可运行!所以我得出结论:不需要@ModelAttribute
注释来将Web表单的字段值传递给参数的字段。然后我坚持这个问题:@ModelAttribute
注释的意思是什么?如果唯一的意思是在View中为模型对象设置别名,那么为什么这种方式比明确地将对象添加到ModelMap
更好?
答案 0 :(得分:8)
关键是@ModelAttribute
是可选的 - 如果参数没有注释且其类型没有特殊含义(即它不是HttpServletRequest
,ModelMap
等等),它被视为@ModelAttribute
- 带注释的论点。
因此,在两种情况下实际需要@ModelAttribute
:
指定属性的名称。如果省略@ModelAttribute
或者空value
,则使用默认名称(带有第一个字母去除资本的参数的类型名称)。
如果参数的类型具有特殊含义。例如,如果您的域对象作为属性传递java.security.Principal
传递,则需要对其进行注释,否则Spring将传递HttpServletRequest.getUserPrincipal()
的结果。
有些人倾向于在没有实际需要的情况下使用@ModelAttribute
来记录论证的含义。