Spring MVC @ModelAttribute 詳解
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