今天研究了比较久,网上的资料说的不是很清楚,来这里整理一下。
不一定准确,但是八九不离十吧。
ModelAttribute是一个在控制器里使用的注解,用来从Model里存取数据。它可以注解在方法或者方法参数上。注解在方法上意味着往Model里存数据,注解在参数上意味着从Model取数据。
有几种用法,参考自 http://blog.youkuaiyun.com/li_xiao_ming/article/details/8349115
一.在方法上注解
这种情况下,方法会在每个控制器方法调用之前被调用。
1.@ModelAttribute注释void返回值的方法
public class HelloWorldController {
@ModelAttribute
public void populateModel(@RequestParam String abc, Model model) {
model.addAttribute("attributeName", abc);
}
@RequestMapping(value = "/helloWorld")
public String helloWorld() {
return "helloWorld";
}
}
这种情况下,populateModel先被执行,在model中置入请求参数(/helloWorld?abc=text),之后执行helloworld,返回视图和准备好的model。
2.@ModelAttribute注释返回具体类的方法
@ModelAttribute
public Account addAccount(@RequestParam String number) {
return accountManager.findAccount(number);
}
这种情况下,返回的对象会被置入Model,再传入控制器。该对象在Model中的名称由返回值类型决定,该例中名字是account。如果有多个同类型的对象会怎么样?我不知道。
3.@ModelAttribute(value="")注释返回具体类的方法
@Controller
public class HelloWorldController {
@ModelAttribute("attributeName")
public String addAccount(@RequestParam String abc) {
return abc;
}
@RequestMapping(value = "/helloWorld")
public String helloWorld() {
return "helloWorld";
}
}
这种情况和上一种类似,只是对象在Model中的名称由ModelAttribute的value参数决定
二.@ModelAttribute注释方法参数
这种情况下,参数回从Model中取出数据
1.从Model中获取
@Controller
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";
}
}
user参数将从Model中取出名字是“user”的对象
2.从请求中获取
@Controller
public class HelloWorldController {
@RequestMapping(value = "/helloWorld")
public String helloWorld(@ModelAttribute User user) {
return "helloWorld";
}
}
user回从请求中绑定数据。其实写不写标注都可以完成绑定。