ModelAndView 類別就如其名稱所示,是表明了Spring Web MVC程式中呈現畫面時所使用Model資料物件與View資料物件,因爲Java程式中一次只能返回一個物件,因此ModelAndView的做用封裝這兩個物件,以方便您一次返回Model與View這兩個物件。web
最簡單的ModelAndView是持有View的名稱返回,以後View名稱被View resolver,也就是實做org.springframework.web.servlet.View介面的實例解析,例如 InternalResourceView或JstlView等等,最簡單的ModelAndView建構方式以下:
ModelAndView(String viewName)spring
若是您要返回呈現畫面時所需的Model資料物件,則可使用Map物件來收集呈現資料時所需的資料,而後在建構ModelAndView做爲建構時的引數,您可使用下面這個版本的ModelAndView建構方法:
ModelAndView(String viewName, Map model)瀏覽器
Map物件中設定好鍵(Key)與值(Value),以後能夠在要呈現的畫面中取出加以顯示(例如在JSP網頁中),若是您要返回一個Model資料物件並指定Model的名稱,則可使用下面這個ModelAndView版本:
ModelAndView(String viewName, String modelName, Object modelObject)this
藉由modelName,您能夠在要View的實做類別中取出Model資料物件,並根據View所使用的技術來加以顯示(多是JSP網頁、Pdf等呈現技術)。spa
ModelAndView類別也提供實做View介面的物件來做爲建構時的引數,如下是三個可用的建構方法版本:
ModelAndView(View view)
ModelAndView(View view, Map model)
ModelAndView(View view, String modelName, Object modelObject)htm
一個實做View的實例是org.springframework.web.servlet.view.RedirectView, ModelAndView預設是使用轉發(Forward)方式來完成請求的結果畫面,使用RedirectView的話,則會使用從新導向(Redirect)將請求重導至指定的結果畫面位置,以呈現請求的結果,例如:
...
public ModelAndView handleRequest(....) ... {
...
return new ModelAndView(new RedirectView(this.getViewPage()));
}
...資源
在這邊,viewPage所設定的位址要是從伺服器網頁根目錄開始指定,而不是Web應用程式的根目錄,因此您的getViewPage()傳回的位址必須像是/FirstSpringMVC/pages/index.htm這樣的位址,其中FirstSpringMVC是您的Web應用程式目錄。get
使用轉發(Forward)方式的話,網址列上並不會出現被轉發的目標位址,並且轉發方式是在Web應用程式以內進行,能夠訪問Web應用程式所設定的內部目錄,像是WEB-INF目錄,於是您能夠將一些要控管存取的資源放到WEB-INF下,如此使用者就沒法直接請求這些資源,而必須透過 DispatcherServlet與Controller的處理與控管,才能夠取得這些資源,轉發方式只能在Web應用程式中進行,不能指定至其它的 Web應用程式位址。servlet
使用從新導向(Redirect)的話,Web應用程式會要求客戶端瀏覽器從新發出一個所指定的請求位址,也就是實際上至關於客戶端從新鏈接至一個所指定的位址,所以瀏覽器的位址列上會出現被從新導向的資訊,從新導向的請求是由瀏覽器發出,因此不能訪問Web應用程式中的隱藏目錄,像是WEB-INF,從新導向是從新要求一個網頁,因此能夠指定至其它的Web應用程式位址。model