@ModelAttribute運用詳解


被@ModelAttribute注釋的方法會在此controller每個方法執行前被執行,因此對於一個controller映射多個URL的用法來說,要謹慎使用。

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

 

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

@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頁面頁面如下。

<%@ 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注釋返回具體類的方法

@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屬性的名稱沒有指定,

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

jsp 中如下訪問:

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

也可以指定屬性名稱

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM