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 注解的方法)之前,自動添加到模型對象中,用于視圖頁面展示時使用;