@ModelAttribute注释在方法参数级别的含义是什么?

时间:2011-01-15 16:49:19

标签: java spring spring-mvc annotations

Spring 3参考资料告诉我们:

  

将它放在方法上时   参数,@ModelAttribute映射a   模型属性具体,   带注释的方法参数

我不明白这个魔法咒语,因为我确定模型对象的别名(如果使用ModelMap作为返回类型的键值)在执行请求处理程序方法后传递给View。因此,当请求处理程序方法执行时,模型对象的名称无法映射到方法参数。

为了解决这个矛盾,我去了stackoverflow并找到了this详细的例子。 例子的作者说:

  

//“personAttribute”模型具有   从...传递给控制器   JSP

看来,他被春季参考所吸引......

为了消除我在我的环境中部署他的示例应用程序的魅力,并从方法MainController.saveEdit()中残留地剪切@ModelAttribute注释。结果应用程序无需任何更改即可运行!所以我得出结论:不需要@ModelAttribute注释来将Web表单的字段值传递给参数的字段。然后我坚持这个问题:@ModelAttribute注释的意思是什么?如果唯一的意思是在View中为模型对象设置别名,那么为什么这种方式比明确地将对象添加到ModelMap更好?

1 个答案:

答案 0 :(得分:8)

关键是@ModelAttribute是可选的 - 如果参数没有注释且其类型没有特殊含义(即它不是HttpServletRequestModelMap等等),它被视为@ModelAttribute - 带注释的论点。

因此,在两种情况下实际需要@ModelAttribute

  • 指定属性的名称。如果省略@ModelAttribute或者空value,则使用默认名称(带有第一个字母去除资本的参数的类型名称)。

  • 如果参数的类型具有特殊含义。例如,如果您的域对象作为属性传递java.security.Principal传递,则需要对其进行注释,否则Spring将传递HttpServletRequest.getUserPrincipal()的结果。

有些人倾向于在没有实际需要的情况下使用@ModelAttribute来记录论证的含义。