回覆列表
  • 1 # 使用者6342472618169

    ViewResolver將把邏輯檢視名解析為具體的View,這樣透過這種策略模式,很容易地更換其他檢視技術。View會根據傳進來的Model模型資料進行渲染,此處的Model實際上是一個Map資料結構,因此很容易支援其他檢視技術。當我們對SpringMVC控制的資源發起請求時,這些請求都會被SpringMVC的org.springframework.web.servlet.DispatcherServlet處理,接著 SpringMVC會分析看哪一個HandlerMapping定義的請求對映中存在對該請求的最合理的對映。然後透過該HandlerMapping取得 其對應的Handler,接著再透過相應的HandlerAdapter處理該Handler。HandlerAdapter在對Handler進行處理 之後會返回一個ModelAndView物件。在獲得了ModelAndView物件之後,Spring就需要把該View渲染給使用者,即返回給瀏覽器。 在這個渲染的過程中,發揮作用的就是ViewResolver和View。當Handler返回的ModelAndView中不包含真正的檢視,只返回一 個邏輯檢視名稱,ViewResolver會把該邏輯檢視名稱解析為真正的檢視View物件。View真正進行檢視渲染,把結果返回給瀏覽器。SpringMVC用於處理檢視最重要的兩個介面是ViewResolver和View。ViewResolver的主要作用是把一個邏輯上的檢視名稱解析為一個真正的檢視,SpringMVC中用於把View物件呈現給客戶端的是View物件本身,而ViewResolver只是把邏輯檢視名稱解析為物件的View物件。View介面的主要作用是用於處理檢視,然後返回給客戶端。如果【servlet-name】-servlet.xml當中的配置例子:

    UrlBasedViewResolver:它是對ViewResolver的一種簡單實現,而且繼承了AbstractCachingViewResolver,主要就是提供的一種拼接URL的方式來解析檢視,它可以讓我們透過prefix屬性指定一個指定的字首,透過suffix屬性指定一個指定的字尾,然後把返回的邏輯檢視名稱加上指定的字首和字尾就是指定的檢視URL了。prefix=/WEB-INF/jsps/,suffix=.jsp,返回的檢視名稱viewName=test/indx,則UrlBasedViewResolver解析出來的檢視URL就是/WEB-INF/jsps/test/index.jsp。預設的prefix和suffix都是空串。URLBasedViewResolver支援返回的檢視名稱中包含redirect:字首,這樣就可以支援URL在客戶端的跳轉,如當返回的檢視名稱是”redirect:test.do”的時候,URLBasedViewResolver發現返回的檢視名稱包含”redirect:”字首,於是把返回的檢視名稱字首”redirect:”去掉,取後面的test.do組成一個RedirectView,RedirectView中將把請求返回的模型屬性組合成查詢引數的形式組合到redirect的URL後面,然後呼叫HttpServletResponse物件的sendRedirect方法進行重定向。同樣URLBasedViewResolver還支援forword:字首,對於檢視名稱中包含forword:字首的檢視名稱將會被封裝成一個InternalResourceView物件,然後在伺服器端利用RequestDispatcher的forword方式跳轉到指定的地址。使用UrlBasedViewResolver的時候必須指定屬性viewClass,表示解析成哪種檢視,一般使用較多的就是InternalResourceView,利用它來展現jsp,但是當我們使用JSTL的時候我們必須使用JstlView。下面是一段UrlBasedViewResolver的定義,根據該定義,當返回的邏輯檢視名稱是test的時候,UrlBasedViewResolver將把邏輯檢視名稱加上定義好的字首和字尾,即“/WEB-INF/test.jsp”,然後新建一個viewClass屬性指定的檢視型別予以返回,即返回一個url為“/WEB-INF/test.jsp”的InternalResourceView物件。

  • 中秋節和大豐收的關聯?
  • 求婚鑽戒也能改款嗎?需要注意哪幾點?