@ModelAttribute運用詳解

被@ModelAttribute註釋的方法會在此controller每一個方法執行前被執行,所以對於一個controller映射多個URL的用法來講,要謹慎使用。html

咱們編寫控制器代碼時,會將保存方法獨立成一個控制器也是如此。java

 

1.@ModelAttribute註釋void返回值的方法spring

@Controller
public class HelloModelController {
    
    @ModelAttribute 
    public void populateModel(@RequestParam String abc, Model model) {  
       model.addAttribute("attributeName", abc);  
    }  

    @RequestMapping(value = "/helloWorld")  
    public String helloWorld() {  
       return "helloWorld.jsp";  
    }  

}

在這個代碼中,訪問控制器方法helloWorld時,會首先調用populateModel方法,將頁面參數abc(/helloWorld.ht?abc=text)放到model的attributeName屬性中,在視圖中能夠直接訪問。數據庫

jsp頁面頁面以下。mvc

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
    <html>
    <head>
    </head>
    <body>
    <c:out value="${attributeName}"> </c:out>
    </body>
    </html>

 

2.@ModelAttribute註釋返回具體類的方法app

@Controller
public class Hello2ModelController {
    
    @ModelAttribute 
    public User populateModel() {  
       User user=new User();
       user.setAccount("ray");      
        return user;
    }  
    @RequestMapping(value = "/helloWorld2")  
    public String helloWorld() {  
       return "helloWorld.jsp";  
    }  
}

當用戶請求 http://localhost:8080/test/helloWorld2.ht時,首先訪問populateModel方法,返回User對象,model屬性的名稱沒有指定,jsp

它由返回類型隱含表示,如這個方法返回User類型,那麼這個model屬性的名稱是user。 
這個例子中model屬性名稱有返回對象類型隱含表示,model屬性對象就是方法的返回值。它無需要特定的參數。spa

jsp 中以下訪問:.net

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

也能夠指定屬性名稱code

@Controller
public class Hello2ModelController {
    
    @ModelAttribute(value="myUser")  
      public User populateModel() {  
       User user=new User();
       user.setAccount("ray");      
        return user;
    }  
    @RequestMapping(value = "/helloWorld2")  
    public String helloWorld(Model map) {  
       return "helloWorld.jsp";  
    }  
}

jsp中以下訪問:

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

 

對象合併:

@Controller
public class Hello2ModelController {
    
    @ModelAttribute    public User populateModel() {  
       User user=new User();
       user.setAccount("ray");     
         return user;
    }  
    
    @RequestMapping(value = "/helloWorld2")  
    public String helloWorld(User user) {
        user.setName("老王");    
          return "helloWorld.jsp";  
    }  
}

這個在編寫代碼的時候頗有用處,好比在更新的時候,咱們能夠如今populateModel方法中根據ID獲取對象,而後使用spring mvc的自動組裝功能,組裝

User對象,這樣在客戶端提交了值的屬性纔會被組裝到對象中。

好比:User對象,首先從數據庫中獲取此對象,客戶端表單只有account屬性,提交時就只會改變account屬性。

 

對象合併指定對象名稱:

@Controller
public class Hello2ModelController {
    
    @ModelAttribute("myUser")    public User populateModel() {  
       User user=new User();
       user.setAccount("ray");      
       return user;
    }  
    
    @RequestMapping(value = "/helloWorld2")  
    public String helloWorld(@ModelAttribute("myUser") User user) {
        user.setName("老王");      
         return "helloWorld.jsp";  
    }  
}

這樣在jsp中能夠使用以下方式訪問

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

 

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

咱們能夠在基類方法中控制寫此註解,須要控制權限的控制器,繼承控制器就能夠了。

public class BaseController {
    
    @ModelAttribute    public void populateModel() throws Exception {  
       SysUser user=ContextUtil.getCurrentUser();    
          if(user.getAccount().equals("admin")){    
                 throw new Exception("沒有權限");
       }
    }  
}

須要控制權限的類繼承BaseController

@Controller
public class Hello2ModelController extends BaseController {
    
    @RequestMapping(value = "/helloWorld2")  
    public String helloWorld(@ModelAttribute("myUser") User user) {
        user.setName("老王");      
         return "helloWorld.jsp";  
    }  
}

這樣就能夠控制權限了,固然控制權限的方法有不少,好比經過過濾器等。這裏只是提供一種思路。

相關文章
相關標籤/搜索