此注解用于注释在方法上或请求参数中,用来携带 model到显示页面进行显示。
1、@ModelAttribute注释方法
如果把@ModelAttribute放在方法的注解上时,代表的是:该Controller的所有方法在调用前,先执行此@ModelAttribute方法。可以把这个@ModelAttribute特性,应用在BaseController当中,所有的Controller继承BaseController,即可实现在调用Controller时,先执行@ModelAttribute方法。比如权限的验证(也可以使用Interceptor)等。例如:
@ModelAttribute
public Account addAccount(@RequestParam String number) {
return accountManager.findAccount(number);
}
这种情况,model属性的名称没有指定,它由返回类型隐含表示,如这个方法返回Account类型,那么这个model属性的名称是account。这个例子中model属性名称有返回对象类型隐含表示,model属性对象就是方法的返回值。也可以通过@ModelAttribute(“Attributename”)来指定model的名称。如:
@ModelAttribute("attributeName")
public String addAccount(@RequestParam String abc) {
return abc;
}
这个例子中使用@ModelAttribute注释的value属性,来指定model属性的名称。model属性对象就是方法的返回值。也可以通过@ModelAttribute(“Attributename”)来指定model的名称。如:
@ModelAttribute("attributeName")
public String addAccount(@RequestParam String abc) {
return abc;
}
这时这个方法的返回值并不是表示一个视图名称,而是model属性的值,视图名称由RequestToViewNameTranslator根据请求"/helloWorld.do"转换为逻辑视图helloWorld。Model属性名称有@ModelAttribute(value=””)指定,相当于在request中封装了key=attributeName,value=hi。
2、@ModelAttribute注释一个方法的参数
注解在参数上时,可以从Form表单或URL参数中获取参数并绑定到model中(实际上,不做此注释也能拿到user对象)
public class HelloWorldController {
@ModelAttribute("user")
public User addAccount() {
return new User("jz","123");
}
@RequestMapping(value = "/helloWorld")
public String helloWorld(@ModelAttribute("user") User user) {
user.setUserName("jizhou");
return "helloWorld";
}
}
在这个例子里,@ModelAttribute("user") User user注释方法参数,参数user的值来源于addAccount()方法中的model属性。