@ModelAttribute注解的使用

阅读更多

 

@ModelAttribute最主要的作用是将数据添加到模型对象中,用于视图页面展示时使用。但是根据@ModelAttribute注释的位置不同,和其他注解组合使用,致使含义有所不同。

 

1.@ModelAttribute注释方法 

例子(1),(2),(3)类似,被@ModelAttribute注释的方法会在此controller每个方法执行前被执行,因此对于一个controller映射多个URL的用法来说,要谨慎使用。

 

(1)@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方法之前先被调用,它把请求参数abc的值加入到一个名为attributeName的model属性中,然后带着这个参数执行helloWorld方法

 

 

(2)@ModelAttribute注释返回具体类的方法

 

@ModelAttribute 
public Account addAccount(@RequestParam String number) { 
    return accountManager.findAccount(number); 
} 
@RequestMapping(value = "/helloWorld") 
public String helloWorld(Account account) { 
    return "helloWorld"; 
} 

 这种情况,model属性的名称没有指定,它由返回类型隐含表示,如这个方法返回Account类型,那么这个model属性的名称是account。不过名称不一致时,类一致也能获取到,比如上面helloWorld方法参数名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"; 
   } 
}

 这个例子中使用@ModelAttribute注释的value属性,来指定model属性的名称。model属性值就是方法的返回值。它的作用相当于model.addAttribute("attributeName",abc);

 

 

(4)@ModelAttribute和@RequestMapping同时注释一个方法

 

@Controller 
public class HelloWorldController { 
    @RequestMapping(value = "/helloWorld.do") 
    @ModelAttribute("attributeName") 
    public String helloWorld() { 
         return "hi"; 
    } 
}

 这时这个方法的返回值并不是表示一个视图名称,而是model属性的值,视图名称由RequestToViewNameTranslator根据请求"/helloWorld.do"转换为逻辑视图helloWorld。Model属性名称由@ModelAttribute(value=””)指定,相当于在request中封装了key=attributeName,value=hi。

 

 

2.@ModelAttribute注释一个方法的参数 

(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"; 
     } 
}

 在这个例子里,@ModelAttribute("user") User user注释方法参数,参数user的值来源于addAccount()方法中的model属性。

此时如果方法体没有标注@SessionAttributes("user"),那么scope为request,如果标注了,那么scope为session

 

(2)从Form表单或URL参数中获取(实际上,不做此注释也能拿到user对象)

@Controller 
public class HelloWorldController { 
     @RequestMapping(value = "/helloWorld") 
     public String helloWorld(@ModelAttribute User user) { 
         return "helloWorld"; 
     } 
}

 

 

 

 

你可能感兴趣的:(@ModelAttribute注解的使用)