问题
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 + @Qualifier
i.e。它尝试从Spring托管模型中检索具有给定名称的bean。如果找不到命名的bean,而不是抛出错误或者返回null
,它隐含地扮演了角色:@Bean
i.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)
并且书的每个字段名必须与表单子元素中的路径匹配