被@ModelAttribute注释的方法会在每个controller方法执行前被执行。
    对于一个controller映射多个URL的类,要谨慎使用。
    使用方式:

    1. @ModelAttribute注释void返回值的方法

      1. @Controller
      2. public class HelloWorldController {
      3. @ModelAttribute
      4. public void populateModel(@RequestParam String abc, Model model) {
      5. model.addAttribute("attributeName", abc);
      6. }
      7. @RequestMapping(value = "/helloWorld")
      8. public String helloWorld() {
      9. return "helloWorld";
      10. }
      11. }
      1. 在获得请求/helloWorld后,先执行populateModel()方法,再执行helloWorld()方法。
      2. 把请求参数(/helloWorld?abc=text)加入一个名为attributeName的model属性中,之后执行helloWorld()方法,返回视图名helloWorld和model。
      3. 当URL或者post中不包含参数时,会报错。
    2. @ModelAttribute注释返回具体类的方法

      1. @ModelAttribute
      2. public Account addAccount(@RequestParam String number) {
      3. return accountManager.findAccount(number);
      4. }
      1. model属性的名称没有指定,它由返回类型隐含表示。
      2. 如这个方法返回Account类型,那么这个model属性的名称就是account。
      3. model属性对象的值就是方法的返回值。
    3. @ModelAttribute(“attributeName”)注释返回具体类的方法

      1. @Controller
      2. public class HelloWorldController {
      3. @ModelAttribute("attributeName")
      4. public String addAccount(@RequestParam String abc) {
      5. return abc;
      6. }
      7. @RequestMapping(value = "/helloWorld")
      8. public String helloWorld() {
      9. return "helloWorld";
      10. }
      11. }
      1. 使用注解指定的attributeName属性来指定model属性的名称。
      2. model对象的值就是方法的返回值。
    4. @ModelAttribute和@RequestMapping同时注释一个方法

      1. @Controller
      2. public class HelloWorldController {
      3. @RequestMapping(value = "/helloWorld.do")
      4. @ModelAttribute("attributeName")
      5. public String helloWorld() {
      6. return "hi";
      7. }
      8. }
      1. 这个方法的返回值并不是表示一个视图名称,而是model属性的值。
      2. 视图名称由RequestToViewNameTranslator根据请求”/helloWorld”转换为逻辑视图helloWorld。
    5. @ModelAttribute注释一个方法的参数

      1. @Controller
      2. public class HelloWorldController {
      3. @ModelAttribute("user")
      4. public User addAccount() {
      5. return new User("jz","123");
      6. }
      7. @RequestMapping(value = "/helloWorld")
      8. public String helloWorld(@ModelAttribute("user") User user) {
      9. user.setUserName("jizhou");
      10. return "helloWorld";
      11. }
      12. }
      1. 以@ModelAttribute(“user”)方法注释参数,参数的值来源于addAccount()方法中的model属性。
      2. 如果方法体标注了@SessionAttributes(“user”),那么scope为session,没有标注,那么scope为request。
    6. 从form表单或URL参数中获取(脱裤子放屁)

      1. @Controller
      2. public class HelloWorldController {
      3. @RequestMapping(value = "/helloWorld")
      4. public String helloWorld(@ModelAttribute User user) {
      5. return "helloWorld";
      6. }
      7. }
      1. 这个时候这个User类一定要有无参的构造函数。