Spring MVC @ModelAttribute 詳解

jopen 8年前發布 | 10K 次閱讀 Spring MVC Web框架

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.html時,首先訪問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";  
    }  
}

 

對象合并指定對象名稱:

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

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


總結:


@ModelAttribute具有如下三個作用:

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

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

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


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

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


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

@ModelAttribute 注解的返回值會覆蓋@RequestMapping 注解方法中的@ModelAttribute 注解的同名命令對象



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



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

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!