天天看點

@ModelAttribute使用詳解

http://blog.csdn.net/hejingyuan6/article/details/49995987

[email protected]注釋void傳回值的方法

1. @Controller  

2. public class HelloModelController {  

3.       

4.     @ModelAttribute   

5.     public void populateModel(@RequestParam String abc, Model model) {    

6.        model.addAttribute("attributeName", abc);    

7.     }    

8.   

9.     @RequestMapping(value = "/helloWorld")    

10.     public String helloWorld() {    

11.        return "helloWorld.jsp";    

12.     }    

13.   

14. }  
           

在這個代碼中,通路控制器方法helloWorld時,會首先調用populateModel方法,将頁面參數abc(/helloWorld.ht?abc=text)放到model的attributeName屬性中,在視圖中可以直接通路。

jsp頁面頁面如下:

1. <%@ page language="java" contentType="text/html; charset=utf-8"  

2.     pageEncoding="utf-8"%>  

3. <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>  

4. <html>  

5. <head>  

6. </head>  

7. <body>  

8. <c:out value="${attributeName}"></c:out>  

9. </body>  

10. </html>  
           

[email protected]注釋傳回具體類的方法

1. @Controller  

2. public class Hello2ModelController {  

3.       

4.     @ModelAttribute   

5.     public User populateModel() {    

6.        User user=new User();  

7.        user.setAccount("ray");  

8.        return user;  

9.     }    

10.     @RequestMapping(value = "/helloWorld2")    

11.     public String helloWorld() {    

12.        return "helloWorld.jsp";    

13.     }    

14. }  
           

當使用者請求 http://localhost:8080/test/helloWorld2.html時,首先通路populateModel方法,傳回User對象,model屬性的名稱沒有指定,它由傳回類型隐含表示,如這個方法傳回User類型,那麼這個model屬性的名稱是user。 

這個例子中model屬性名稱有傳回對象類型隐含表示,model屬性對象就是方法的傳回值。它無須要特定的參數。

jsp 中如下通路:

1. <c:out value="${user.account}"></c:out>  


也可以指定屬性名稱

1. @Controller  

2. public class Hello2ModelController {  

3.       

4.     @ModelAttribute(value="myUser")  

5.     public User populateModel() {    

6.        User user=new User();  

7.        user.setAccount("ray");  

8.        return user;  

9.     }    

10.     @RequestMapping(value = "/helloWorld2")    

11.     public String helloWorld(Model map) {    

12.        return "helloWorld.jsp";    

13.     }    

14. }  
           

jsp中如下通路:

1. <c:out value="${myUser.account}"></c:out>  

對象合并:

1. @Controller  

2. public class Hello2ModelController {  

3.       

4.     @ModelAttribute  

5.     public User populateModel() {    

6.        User user=new User();  

7.        user.setAccount("ray");  

8.        return user;  

9.     }    

10.       

11.     @RequestMapping(value = "/helloWorld2")    

12.     public String helloWorld(User user) {  

13.         user.setName("老王");  

14.        return "helloWorld.jsp";    

15.     }    

16. }  
           

對象合并指定對象名稱:

1. @Controller  

2. public class Hello2ModelController {  

3.       

4.     @ModelAttribute("myUser")  

5.     public User populateModel() {    

6.        User user=new User();  

7.        user.setAccount("ray");  

8.        return user;  

9.     }    

10.       

11.     @RequestMapping(value = "/helloWorld2")    

12.     public String helloWorld(@ModelAttribute("myUser") User user) {  

13.         user.setName("老王");  

14.        return "helloWorld.jsp";    

15.     }    

16. }  
           

這樣在jsp中可以使用如下方式通路

1. <c:out value="${myUser.name}"></c:out>  

2. <c:out value="${myUser.account}"></c:out>  
           

3.通過此特性控制權限.

我們可以在基類方法中控制寫此注解,需要控制權限的控制器,繼承控制器就可以了。

1. public class BaseController {  

2.       

3.     @ModelAttribute  

4.     public void populateModel() throws Exception {    

5.        SysUser user=ContextUtil.getCurrentUser();  

6.        if(user.getAccount().equals("admin")){  

7.            throw new Exception("沒有權限");  

8.        }  

9.     }    

10. }  
           

需要控制權限的類繼承BaseController

1. @Controller  

2. public class Hello2ModelController extends BaseController {  

3.       

4.     @RequestMapping(value = "/helloWorld2")    

5.     public String helloWorld(@ModelAttribute("myUser") User user) {  

6.         user.setName("老王");  

7.        return "helloWorld.jsp";    

8.     }    

9. }  
           

這樣就可以控制權限了,當然控制權限的方法有很多,比如通過過濾器等。這裡隻是提供一種思路。

總結:

@ModelAttribute具有如下三個作用:

①綁定請求參數到指令對象:放在功能處理方法的入參上時,用于将多個請求參數綁定到一個指令對象,進而簡化綁定流程,而且自動暴露為模型資料用于視圖頁面展示時使用。其實@ModelAttribute此處對于供視圖頁面展示來說與model.addAttribute("attributeName", abc);功能類似。

1. public String test(@ModelAttribute("user") UserModel user)   

此處多了一個注解@ModelAttribute("user"),它的作用是将該綁定的指令對象以“user”為名稱添加到模型對象中供視圖頁面展示使用。我們此時可以在視圖頁面使用${user.username}來擷取綁定的指令對象的屬性。

②暴露@RequestMapping 方法傳回值為模型資料:放在功能處理方法的傳回值上時,是暴露功能處理方法的傳回值為模型資料,用于視圖頁面展示時使用。

1. public @ModelAttribute("user2") UserModel test3(@ModelAttribute("user2") UserModel user)  

大家可以看到傳回值類型是指令對象類型,而且通過@ModelAttribute("user2")注解,此時會暴露傳回值到模型資料( 名字為user2 ) 中供視圖展示使用

@ModelAttribute 注解的傳回值會覆寫@RequestMapping 注解方法中的@ModelAttribute 注解的同名指令對象

③暴露表單引用對象為模型資料:放在處理器的一般方法(非功能處理方法)上時,是為表單準備要展示的表單引用對象,如注冊時需要選擇的所在城市等,而且在執行功能處理方法(@RequestMapping 注解的方法)之前,自動添加到模型對象中,用于視圖頁面展示時使用;