ModelAndView的構造方法有7個。但是它們都是相通的。這里使用無參構造函數來舉例說明如何構造ModelAndView實例。??
ModelAndView 類別就如其名稱所示,是代表了MVC Web程序中Model與View的對象,不過它只是方便您一次返回這兩個對象的holder,Model與View兩者仍是分離的概念。
最簡單的ModelAndView是持有View的名稱返回,之后View名稱被view resolver,也就是實作org.springframework.web.servlet.View接口的實例解析,例如 InternalResourceView或JstlView等等:
ModelAndView(String viewName)
如果您要返回Model對象,則可以使用Map來收集這些Model對象,然后設定給ModelAndView,使用下面這個版本的 ModelAndView:
ModelAndView(String viewName, Map model)
Map對象中設定好key與value值,之后可以在視圖中取出,如果您只是要返回一個Model對象,則可以使用下面這個 ModelAndView版本:
ModelAndView(String viewName, String modelName, Object modelObject)
藉由modelName,您可以在視圖中取出Model并顯示。
ModelAndView類別提供實作View接口的對象來作View的參數:
ModelAndView(View view)
ModelAndView(View view, Map model)
ModelAndView(View view, String modelName, Object modelObject)
一個例子是 org.springframework.web.servlet.view.RedirectView,ModelAndView預設是使 用forward來轉發請求結果至視圖,使用RedirectView的話,則會使用redirect將請求重導至視圖,例如:
…
public ModelAndView handleRequest(....) … {
??? ....
???
??? return?new ModelAndView(new RedirectView(this.getViewPage()));
}
....
在這邊,viewPage的地址是從服務器網頁根目錄開始指定,而不是Web應用程序的根目錄,所以您的getViewPage()傳回的地 址必須像是 /springapp/pages/index.htm這樣的地址,其中springapp是您的Web應用程序目錄。
使用forward的話,網址列上并不會出現被轉發的目標地址,而且forward是在Web應用程序之內進行,可以訪問Web應用程序的 隱藏目錄,像是WEB-INF,然而forward只能在Web應用程序中進行,不能指定至其它的Web應用程序地址。
使用redirect的話,是要求客戶端瀏覽器重新發出一個指定的請求地址,因此網址列上會出現被重導的目錄地址,重導的請求是由瀏覽器發出,所以不能 訪問Web應用程序中的隱藏目錄,像是WEB-INF,然而重導是重新要求一個網頁,所以可以指定至其它的Web應用程序地址。
DispatcherServlet會根據傳回的ModelAndView來解析View名稱,并處理給予的Model。View名稱的解析 是委托給實 作org.springframework.web.servlet.ViewResolver接口的實例,ViewResolver接口定義如下:
public?interface ViewResolver {
??? public view resolveViewName(String, Locale locale) throws ServletException;
}
ViewResolver的一個實例是InternalResourceViewResolver,名稱解析完之后,實際的View繪制與Model轉 換處理是交給實作org.springframework.web.servlet.View的實例,View接口如下:
public?interface View {
??? public void render(Map model, HttpServletResquest resquest, HttpServletResponse response) throws ServletException, IOException;
}
View的實作之前用過 org.springframework.web.servlet.view.InternalResourceView,另外也還有JstlView、 TilesView、VelocityView等等的實作,分別進行不同的表現展處理 。
ModelAndView()
這個構造方法構造出來的ModelAndView
不能直接使用,應為它沒有指定view,也沒有綁定對應的model對象。當然,model對象不是必須的,但是view確實必須的。
用這個構造方法構造的實例主要用來在以后往其中加view設置和model對象。
給ModelAndView
實例設置view的方法有兩
個:setViewName(String viewName) 和 setView(View view)。前者是使用view
name,后者是使用預先構造好的View對象。其中前者比較常用。事實上View是一個接口,而不是一個可以構造的具體類,我們只能通過其他途徑來獲取
View的實例。對于view
name,它既可以是jsp的名字,也可以是tiles定義的名字,取決于使用的ViewNameResolver如何理解這個view name。
如何獲取View的實例以后再研究。
而對應如何給ModelAndView
實例設置model則比較復雜。有三個方法可以使用:
addObject(Object modelObject)
addObject(String modelName, Object modelObject)
addAllObjects(Map modelMap)
ModelAndView
可以接收Object類型的對象,ModelAndView
將它視為其眾多model中的一個。當使用Object類型的對象的時候,必須指定一個名字。ModelAndView
也可以接收沒有明顯名字的對象,原因在于ModelAndView
將調用spring自己定義的Conventions 類的.getVariableName()方法來為這個model生成一個名字。顯然,對model而言,名字是必須的。
Conventions.getVariableName()生成名字的規則是使用對象的類名的小寫模式來作model名字。當這個model是集合或數 組的時候,使用集合的第一個元素的類名加s來作model的名字。
ModelAndView
也可以接收Map類型的對象,ModelAndView
將這個Map中的元素視為model,而不是把這個Map本身視為model。但是其他的集合類可以用本身作為model對象。
實際上,ModelAndView
對model的支持來自于類ModelMap,這個類繼承自HashMap。
完整的例子
public ModelAndView handleRequestInternal( HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView mav = new ModelAndView("hello"); // 實例化一 個VIew的ModelAndView實例 mav.addObject("message", "Hello World!"); // 添加一個帶名的model對象 return mav; }
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
