Spring MVC 處理模型數據(@ModelAttribute)


SpringMVC中的模型數據是非常重要的,因為MVC中的控制(C)請求處理業務邏輯來生成數據模型(M),而視圖(V)就是為了渲染數據模型的數據。

直白來講,上面這句話的意思就是:當有一個查詢的請求,控制器(C)會把請求攔截下來,然后把根據請求的內容對它進行分配適合的處理方法,在處理方法上進行處理查詢的業務邏輯,得到了數據,再把數據封裝成數據模型對象,最后把數據模型(M)對象傳給了視圖(V),讓視圖去渲染數據模型。
 
-----以下內容來自《Spring3.0就這么簡單》
我們知道SpringMVC通過 @RequestMapping將請求引導到處理方法上,使用適合的 方法簽名(@RequestParam/@PathVariable等)將請求消息綁定到入參中(入參:方法的參數)。方法入參綁定請求消息只是處理方法第一步,還有更為重要的任務等待完成,即根據入參執行相應的邏輯,產生模型數據,導向到特定視圖。
 
 
如何將模型數據輸出給視圖是SpringMVC框架的一項重要工作,SpringMVC提供了以下幾種途徑輸出模型數據:
  • ModelAndView:處理方法返回值類型為ModelAndView時,方法體即可通過該對象添加模型數據。
  • @ModelAttribute:方法入參標注該注解后,入參的對象就會放到數據模型中。
  • Map及Model:入參為org.springframework.ui.Model、org.springframework.uiModelMap或java.util.Map時,處理方法返回時,Map中的數據會自動添加到模型中。
  • @SessionAttributes:將模型中的某個屬性暫存到HttpSession中,以便多個請求之間可以共享這個屬性。
 
在這里只講解@ModelAttribute的使用和理解:
@ModelAttribute相當於是什么?
自己的理解:
          我覺得@ModelAttribute其實相當於我們自己手動操作封裝對象的過程,比如說:在Servlet中,本來是要我們自己從request中獲取請求參數,然后進行封裝成對象,根據這個封裝好的對象進行業務邏輯操作,最終從Dao層獲取到返回的數據,我們再把這些數據封裝成對象,返回給視圖jsp。視圖jsp就可以使用el表達式等方式直接調用。@ModelAttribute就是 解決了我們自己手動操作封裝對象、傳遞對象給視圖的操作
 
@ModelAttribute放置的位置不同也有不同的功能。那么@ModelAttribute可以放置在哪些位置呢?如下:
  • 可以在方法入參上使用@ModelAttribute注解
  • 還可以在方法定義中使用@ModelAttribute注解
  1. 放在方法入參上使用:
//UserController.java在方法入參處使用@ModelAttribute
@RequestMapping(value="/model")
public String handleModel(@ModelAttribute("user") User user){
    user.setUserId("1000");
    return "/user/createSuccess";
}
SpringMVC 將請求消息綁定到User對象中,然后再以“user”為鍵將User對象放到模型中。
在准備對視圖進行渲染前,SpringMVC還會進一步將模型中的數據轉儲到視圖的上下文中以暴露給視圖對象。
對於JSP視圖來說,SpringMVC會將模型數據轉儲到ServletRequest的屬性列表中(即通過ServletRequest#setAttribute(String name,Object o )保存)。
handleModel()返回的邏輯視圖名為 /user/createSuccess,對應createSuccess.jsp視圖對象,這樣createSuccess.jsp就可以使用${user.userName}等方式順利訪問到模型中的數據了。
 
   2.  在方法定義中使用@ModelAttribute注解:
除了可以在方法入參上使用@ModelAttribute注解,還可以在方法定義中使用@ModelAttribute注解。SpringMVC在調用目標處理方法前,會先逐個調用在方法級上標注了@ModelAttribute的方法,並將這些方法的返回值添加到模型中。如下:
@ModelAttribute("user")
public User getUser(){          <---1//訪問UserController中的任何一個請求處理方法前,
    User user = new User();         //SpringMVC先執行該方法,並將返回值以user為鍵添加到模型中 
    user.setUserId("1001");
    return user;
}
@RequestMapping(value="/model")
public String handleModel(@ModelAttribute("user") User user){     <---2 //在此,模型數據會賦給User的入參,
    user.setUserName("tom");                                           //然后再根據HTTP請求消息進一步填充覆蓋user對象
    return "/user/showUser";
}
當訪問UserController中的任何一個請求處理方法前,都會事先執行標注了@ModelAttribute的getUser()方法,並將其返回值以user為鍵添加到模型中。
由於 ② 處的handleModel()方法使用了入參級的@ModelAttribute注解,且屬性名和 ① 處方法級@ModelAttribute的屬性名相同。這時,SpringMVC會將 ① 處獲取的模型屬性先賦值給 ② 處的人參user,然后再根據HTTP請求消息對user進行填充覆蓋,得到一個整合版本的user對象。
 
提示: 處理方法入參最多只能使用一個SpringMVC的注解,如 handleModel (@ModelAttribute("user") User user)的user入參使用了@ModelAttribute,就不能再使用@RequestParam或@CookieValue。如果使用了兩個注解,SpringMVC就跑出異常。 
 
注:由於參考網上內容太多,忘記了出處...如有侵權請告知,Email: JamKong@126.com

SpringMVC中的模型數據是非常重要的,因為MVC中的控制(C)請求處理業務邏輯來生成數據模型(M),而視圖(V)就是為了渲染數據模型的數據。

直白來講,上面這句話的意思就是:當有一個查詢的請求,控制器(C)會把請求攔截下來,然后把根據請求的內容對它進行分配適合的處理方法,在處理方法上進行處理查詢的業務邏輯,得到了數據,再把數據封裝成數據模型對象,最后把數據模型(M)對象傳給了視圖(V),讓視圖去渲染數據模型。
 
-----以下內容來自《Spring3.0就這么簡單》
我們知道SpringMVC通過 @RequestMapping將請求引導到處理方法上,使用適合的 方法簽名(@RequestParam/@PathVariable等)將請求消息綁定到入參中(入參:方法的參數)。方法入參綁定請求消息只是處理方法第一步,還有更為重要的任務等待完成,即根據入參執行相應的邏輯,產生模型數據,導向到特定視圖。
 
 
如何將模型數據輸出給視圖是SpringMVC框架的一項重要工作,SpringMVC提供了以下幾種途徑輸出模型數據:
  • ModelAndView:處理方法返回值類型為ModelAndView時,方法體即可通過該對象添加模型數據。
  • @ModelAttribute:方法入參標注該注解后,入參的對象就會放到數據模型中。
  • Map及Model:入參為org.springframework.ui.Model、org.springframework.uiModelMap或java.util.Map時,處理方法返回時,Map中的數據會自動添加到模型中。
  • @SessionAttributes:將模型中的某個屬性暫存到HttpSession中,以便多個請求之間可以共享這個屬性。
 
在這里只講解@ModelAttribute的使用和理解:
@ModelAttribute相當於是什么?
自己的理解:
          我覺得@ModelAttribute其實相當於我們自己手動操作封裝對象的過程,比如說:在Servlet中,本來是要我們自己從request中獲取請求參數,然后進行封裝成對象,根據這個封裝好的對象進行業務邏輯操作,最終從Dao層獲取到返回的數據,我們再把這些數據封裝成對象,返回給視圖jsp。視圖jsp就可以使用el表達式等方式直接調用。@ModelAttribute就是 解決了我們自己手動操作封裝對象、傳遞對象給視圖的操作
 
@ModelAttribute放置的位置不同也有不同的功能。那么@ModelAttribute可以放置在哪些位置呢?如下:
  • 可以在方法入參上使用@ModelAttribute注解
  • 還可以在方法定義中使用@ModelAttribute注解
  1. 放在方法入參上使用:
//UserController.java在方法入參處使用@ModelAttribute
@RequestMapping(value="/model")
publicString handleModel(@ModelAttribute("user")User user){
user.setUserId("1000");
return"/user/createSuccess";
}
SpringMVC 將請求消息綁定到User對象中,然后再以“user”為鍵將User對象放到模型中。
在准備對視圖進行渲染前,SpringMVC還會進一步將模型中的數據轉儲到視圖的上下文中以暴露給視圖對象。
對於JSP視圖來說,SpringMVC會將模型數據轉儲到ServletRequest的屬性列表中(即通過ServletRequest#setAttribute(String name,Object o )保存)。
handleModel()返回的邏輯視圖名為 /user/createSuccess,對應createSuccess.jsp視圖對象,這樣createSuccess.jsp就可以使用${user.userName}等方式順利訪問到模型中的數據了。
 
   2.  在方法定義中使用@ModelAttribute注解:
除了可以在方法入參上使用@ModelAttribute注解,還可以在方法定義中使用@ModelAttribute注解。SpringMVC在調用目標處理方法前,會先逐個調用在方法級上標注了@ModelAttribute的方法,並將這些方法的返回值添加到模型中。如下:
@ModelAttribute("user")
publicUser getUser(){ <---1//訪問UserController中的任何一個請求處理方法前,
User user =newUser(); //SpringMVC先執行該方法,並將返回值以user為鍵添加到模型中
user.setUserId("1001");
return user;
}
 
@RequestMapping(value="/model")
publicString handleModel(@ModelAttribute("user")User user){ <---2 //在此,模型數據會賦給User的入參,
user.setUserName("tom"); // 然后再根據HTTP請求消息進一步填充覆蓋user對象
return"/user/showUser";
}
當訪問UserController中的任何一個請求處理方法前,都會事先執行標注了@ModelAttribute的getUser()方法,並將其返回值以user為鍵添加到模型中。
由於 ② 處的handleModel()方法使用了入參級的@ModelAttribute注解,且屬性名和 ① 處方法級@ModelAttribute的屬性名相同。這時,SpringMVC會將 ① 處獲取的模型屬性先賦值給 ② 處的人參user,然后再根據HTTP請求消息對user進行填充覆蓋,得到一個整合版本的user對象。
 
提示: 處理方法入參最多只能使用一個SpringMVC的注解,如 handleModel (@ModelAttribute("user") User user)的user入參使用了@ModelAttribute,就不能再使用@RequestParam或@CookieValue。如果使用了兩個注解,SpringMVC就跑出異常。 


免責聲明!

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



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