ModelAndView

ModelAndView 類別就如其名稱所示,是代表了Spring Web MVC程式中呈現畫面時所使用Model資料物件與View資料物件,由於Java程式中一次只能返回一個物件,所以ModelAndView的作用封裝這兩個物件,以方便您一次返回Model與View這兩個物件。

最簡單的ModelAndView是持有View的名稱返回,之後View名稱被View resolver,也就是實作org.springframework.web.servlet.View介面的實例解析,例如 InternalResourceViewJstlView等等,最簡單的ModelAndView建構方式如下:
ModelAndView(String viewName)

如果您要返回呈現畫面時所需的Model資料物件,則可以使用Map物件來收集呈現資料時所需的資料,然後在建構ModelAndView作爲建構時的引數,您可以使用下面這個版本的ModelAndView建構方法:
ModelAndView(String viewName, Map model)

Map物件中設定好鍵(Key)與值(Value),之後可以在要呈現的畫面中取出加以顯示(例如在JSP網頁中),如果您要返回一個Model資料物件並指定Model的名稱,則可以使用下面這個ModelAndView版本:
ModelAndView(String viewName, String modelName, Object modelObject)

藉由modelName,您可以在要View的實作類別中取出Model資料物件,並根據View所使用的技術來加以顯示(可能是JSP網頁、Pdf等呈現技術)。

ModelAndView類別也提供實作View介面的物件來作爲建構時的引數,以下是三個可用的建構方法版本:
ModelAndView(View view)
ModelAndView(View view, Map model)
ModelAndView(View view, String modelName, Object modelObject)

 

一個實作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應用程式目錄。

使用轉發(Forward)方式的話,網址列上並不會出現被轉發的目標位址,而且轉發方式是在Web應用程式之內進行,可以訪問Web應用程式所設定的內部目錄,像是WEB-INF目錄,因而您可以將一些要控管存取的資源放到WEB-INF下,如此使用者就無法直接請求這些資源,而必須透過 DispatcherServlet與Controller的處理與控管,纔可以取得這些資源,轉發方式只能在Web應用程式中進行,不能指定至其它的 Web應用程式位址。

使用重新導向(Redirect)的話,Web應用程式會要求客戶端瀏覽器重新發出一個所指定的請求位址,也就是實際上相當於客戶端重新連接至一個所指定的位址,因此瀏覽器的位址列上會出現被重新導向的資訊,重新導向的請求是由瀏覽器發出,所以不能訪問Web應用程式中的隱藏目錄,像是WEB-INF,重新導向是重新要求一個網頁,所以可以指定至其它的Web應用程式位址。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章