【问题标题】:What is the meaning of @ModelAttribute annotation at method argument level?@ModelAttribute 注解在方法参数级别的含义是什么?
【发布时间】:2011-06-09 16:55:08
【问题描述】:

Spring 3 参考告诉我们:

当你把它放在一个方法上时 参数,@ModelAttribute 映射一个 模型属性到特定的, 带注释的方法参数

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

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

// "personAttribute" 模型有 已从 JSP

看来,他被Spring参考迷住了……

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

【问题讨论】:

    标签: java spring spring-mvc annotations


    【解决方案1】:

    关键是@ModelAttribute 是可选的——如果参数没有注释并且它的类型没有特殊含义(即它不是HttpServletRequestModelMap 等等),它被视为@ModelAttribute-annotated 参数.

    所以,@ModelAttribute 在两种情况下是有效的:

    • 指定属性的名称。如果@ModelAttribute 被省略或value 为空,则使用默认名称(参数类型名称的第一个字母不大写)。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-12
      • 1970-01-01
      • 2016-09-25
      • 2013-07-03
      • 2012-01-31
      • 2014-02-19
      • 2010-10-28
      相关资源
      最近更新 更多