什么是Spring MVC中的@ModelAttribute?

问题

Spring MVC中@ModelAttribute的用途和用途是什么?


#1 热门回答(360 赞)

@ModelAttribute引用Model对象的属性(MVC中的M;)所以假设我们有一个带有表单支持对象的表单,称为"Person"然后你可以让Spring MVC通过使用@ModelAttribute注释将此对象提供给Controller方法:

public String processForm(@ModelAttribute("person") Person person){
    person.getStuff();
}

Check here为一个例子(Spring 2.5),另见"Using @ModelAttribute on a method argument"(Spring 3.1)。

另一方面,注释用于定义应该成为模型一部分的对象。因此,如果要在模型中引用Person对象,可以使用以下方法:

@ModelAttribute("person")
public Person getPerson(){
    return new Person();
}

这个带注释的方法将允许访问View中的Person对象,因为它会自动添加到Spring的Models中。

"Using @ModelAttribute on a method"(春季3.1)。

希望这有帮助。


#2 热门回答(115 赞)

我知道这是一个旧线程,但我想我把帽子戴在戒指上,看看我是否可以把水弄得多一点:)

我发现我最初的理解2333734417的努力是Spring决定将几个注释合二为一的结果。一旦我将它分成几个较小的注释,它就变得更加清晰了:

对于参数注释,请将@ModelAttribute视为等效于@Autowired + @Qualifieri.e。它尝试从Spring托管模型中检索具有给定名称的bean。如果找不到命名的bean,而不是抛出错误或者返回null,它隐含地扮演了角色:@Beani.e。使用默认构造函数创建新实例,并将bean添加到模型中。

对于方法注释,可以认为@ModelAttribute相当于@Bean + @Before,即它将用户代码构造的bean放在模型中,并且在请求处理方法之前总是调用它。

形象地说,我在下面看到了@ModelAttribute(请不要按字面意思!!):

@Bean("person")
@Before
public Person createPerson(){
  return new Person();
}

@RequestMapping(...)
public xxx handlePersonRequest( (@Autowired @Qualifier("person") | @Bean("person")) Person person, xxx){
  ...
}

正如你所看到的,Spring做出了正确的决定,使其无所不包;没有人想看一个注释smorgasbord。


#3 热门回答(19 赞)

对于我的风格,我总是使用@ModelAttribute从spring form jsp中捕获对象。例如,我在jsp页面上设计表单,该表单与commandName一起存在

<form:form commandName="Book" action="" methon="post">
      <form:input type="text" path="title"></form:input>
</form:form>

我用跟随代码捕获控制器上的对象

public String controllerPost(@ModelAttribute("Book") Book book)

并且书的每个字段名必须与表单子元素中的路径匹配