被@ModelAttribute注释的方法会在每个controller方法执行前被执行。
对于一个controller映射多个URL的类,要谨慎使用。
使用方式:
@ModelAttribute注释void返回值的方法
@Controller
public class HelloWorldController {
@ModelAttribute
public void populateModel(@RequestParam String abc, Model model) {
model.addAttribute("attributeName", abc);
}
@RequestMapping(value = "/helloWorld")
public String helloWorld() {
return "helloWorld";
}
}
- 在获得请求/helloWorld后,先执行populateModel()方法,再执行helloWorld()方法。
- 把请求参数(/helloWorld?abc=text)加入一个名为attributeName的model属性中,之后执行helloWorld()方法,返回视图名helloWorld和model。
- 当URL或者post中不包含参数时,会报错。
@ModelAttribute注释返回具体类的方法
@ModelAttribute
public Account addAccount(@RequestParam String number) {
return accountManager.findAccount(number);
}
- model属性的名称没有指定,它由返回类型隐含表示。
- 如这个方法返回Account类型,那么这个model属性的名称就是account。
- model属性对象的值就是方法的返回值。
@ModelAttribute(“attributeName”)注释返回具体类的方法
@Controller
public class HelloWorldController {
@ModelAttribute("attributeName")
public String addAccount(@RequestParam String abc) {
return abc;
}
@RequestMapping(value = "/helloWorld")
public String helloWorld() {
return "helloWorld";
}
}
- 使用注解指定的attributeName属性来指定model属性的名称。
- model对象的值就是方法的返回值。
@ModelAttribute和@RequestMapping同时注释一个方法
@Controller
public class HelloWorldController {
@RequestMapping(value = "/helloWorld.do")
@ModelAttribute("attributeName")
public String helloWorld() {
return "hi";
}
}
- 这个方法的返回值并不是表示一个视图名称,而是model属性的值。
- 视图名称由RequestToViewNameTranslator根据请求”/helloWorld”转换为逻辑视图helloWorld。
@ModelAttribute注释一个方法的参数
@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";
}
}
- 以@ModelAttribute(“user”)方法注释参数,参数的值来源于addAccount()方法中的model属性。
- 如果方法体标注了@SessionAttributes(“user”),那么scope为session,没有标注,那么scope为request。
从form表单或URL参数中获取(脱裤子放屁)
@Controller
public class HelloWorldController {
@RequestMapping(value = "/helloWorld")
public String helloWorld(@ModelAttribute User user) {
return "helloWorld";
}
}
- 这个时候这个User类一定要有无参的构造函数。