Spring MVC @ModelAttribute 詳解,mvc@modelattribute
1.@ModelAttribute注釋void傳回值的方法[java] view plaincopyprint?01.@Controller 02.public class HelloModelController { 03. 04. @ModelAttribute 05. public void populateModel(@RequestParam String abc, Model model) { 06. model.addAttribute("attributeName", abc); 07. } 08. 09. @RequestMapping(value = "/helloWorld") 10. public String helloWorld() { 11. return "helloWorld.jsp"; 12. } 13. 14.} 在這個代碼中,存取控制器方法helloWorld時,會首先調用populateModel方法,將頁面參數abc(/helloWorld.ht?abc=text)放到model的attributeName屬性中,在視圖中可以直接存取。jsp頁面頁面如下:[html] view plaincopyprint?01.<%@ page language="java" contentType="text/html; charset=utf-8" 02. pageEncoding="utf-8"%> 03.<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 04.<html> 05.<head> 06.</head> 07.<body> 08.<c:out value="${attributeName}"></c:out> 09.</body> 10.</html> 2.@ModelAttribute注釋返回具體類的方法[java] view plaincopyprint?01.@Controller 02.public class Hello2ModelController { 03. 04. @ModelAttribute 05. public User populateModel() { 06. User user=new User(); 07. user.setAccount("ray"); 08. return user; 09. } 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 中如下訪問:[html] view plaincopyprint?01.<c:out value="${user.account}"></c:out> 也可以指定屬性名稱[java] view plaincopyprint?01.@Controller 02.public class Hello2ModelController { 03. 04. @ModelAttribute(value="myUser") 05. public User populateModel() { 06. User user=new User(); 07. user.setAccount("ray"); 08. return user; 09. } 10. @RequestMapping(value = "/helloWorld2") 11. public String helloWorld(Model map) { 12. return "helloWorld.jsp"; 13. } 14.} jsp中如下訪問:[html] view plaincopyprint?01.<c:out value="${myUser.account}"></c:out> 對象合并:[java] view plaincopyprint?01.@Controller 02.public class Hello2ModelController { 03. 04. @ModelAttribute 05. public User populateModel() { 06. User user=new User(); 07. user.setAccount("ray"); 08. return user; 09. } 10. 11. @RequestMapping(value = "/helloWorld2") 12. public String helloWorld(User user) { 13. user.setName("老王"); 14. return "helloWorld.jsp"; 15. } 16.} 對象合并指定對象名稱:[java] view plaincopyprint?01.@Controller 02.public class Hello2ModelController { 03. 04. @ModelAttribute("myUser") 05. public User populateModel() { 06. User user=new User(); 07. user.setAccount("ray"); 08. return user; 09. } 10. 11. @RequestMapping(value = "/helloWorld2") 12. public String helloWorld(@ModelAttribute("myUser") User user) { 13. user.setName("老王"); 14. return "helloWorld.jsp"; 15. } 16.} 這樣在jsp中可以使用如下方式訪問[html] view plaincopyprint?01.<c:out value="${myUser.name}"></c:out> 02.<c:out value="${myUser.account}"></c:out> 3.通過此特性控制許可權.我們可以在基類方法中控制寫此註解,需要控制許可權的控制器,繼承控制器就可以了。[java] view plaincopyprint?01.public class BaseController { 02. 03. @ModelAttribute 04. public void populateModel() throws Exception { 05. SysUser user=ContextUtil.getCurrentUser(); 06. if(user.getAccount().equals("admin")){ 07. throw new Exception("沒有許可權"); 08. } 09. } 10.} 需要控制許可權的類繼承BaseController[java] view plaincopyprint?01.@Controller 02.public class Hello2ModelController extends BaseController { 03. 04. @RequestMapping(value = "/helloWorld2") 05. public String helloWorld(@ModelAttribute("myUser") User user) { 06. user.setName("老王"); 07. return "helloWorld.jsp"; 08. } 09.} 這樣就可以控制許可權了,當然控制許可權的方法有很多,比如通過過濾器等。這裡只是提供一種思路。總結:@ModelAttribute具有如下三個作用:①綁定請求參數到命令對象:放在功能處理方法的入參上時,用於將多個請求參數綁定到一個命令對象,從而簡化繫結資料流程,而且自動暴露為模型資料用於視圖頁面展示時使用。其實@ModelAttribute此處對於供視圖頁面展示來說與model.addAttribute("attributeName", abc);功能類似。[java] view plaincopyprint?01.public String test(@ModelAttribute("user") UserModel user) 此處多了一個註解@ModelAttribute("user"),它的作用是將該綁定的命令對象以“user”為名稱添加到模型對象中供視圖頁面展示使用。我們此時可以在視圖頁面使用${user.username}來擷取綁定的命令對象的屬性。②暴露@RequestMapping 方法傳回值為模型資料:放在功能處理方法的傳回值上時,是暴露功能處理方法的傳回值為模型資料,用於視圖頁面展示時使用。[java] view plaincopyprint?01.public @ModelAttribute("user2") UserModel test3(@ModelAttribute("user2") UserModel user) 大家可以看到傳回值類型是命令物件類型,而且通過@ModelAttribute("user2")註解,此時會暴露傳回值到模型資料( 名字為user2 ) 中供視圖展示使用@ModelAttribute 註解的傳回值會覆蓋@RequestMapping 註解方法中的@ModelAttribute 註解的同名命令對象③暴露表單引用對象為模型資料:放在處理器的一般方法(非功能處理方法)上時,是為表單準備要展示的表單引用對象,如註冊時需要選擇的所在城市等,而且在執行功能處理方法(@RequestMapping 註解的方法)之前,自動添加到模型對象中,用於視圖頁面展示時使用;
擷取【】 java後台架構 springmvc mybatis(oracle 和 mysql) HTML5 全新高大尚