1. 程式人生 > >springmvc檢視解析機制1

springmvc檢視解析機制1

雖然我們在之前的示例中一直都是使用一個InternalResourceViewResolver進行檢視查詢,但這並不意味著每個基於 Spring MVC的Web應用程式只能使用一個ViewResolver。實際上,Dispatcher- Servlet不但可以接受多個HandlerMapping以處理Web請求到具體Handler的對映,也可以接受多個ViewResolver以處理檢視的查詢。

DispatcherServlet初始化時,將根據型別掃描自己的WebApplicationContext中定義的 ViewResolver。如果查詢到存在多個ViewResolver的定義,DispatcherServlet將根據這些ViewResolver 的優先順序進行排序,然後當需要根據邏輯檢視名查詢具體的View例項的時候,將按照排序後的順序遍歷這些ViewResolver,只要期間任何一個 ViewResolver返回非空的View例項,當前查詢即告結束。如果DispatcherServlet沒能在當前的 WebApplicationContext中找到任何的ViewResolver定義,它將使用 InternalResourceViewResolver作為預設的ViewResolver使用。

ViewResolver的優先順序的指定使用Ordered介面作為標準,這已經成為Spring框架內設定優先順序方式的慣例了。假設我們希望主要使用ResourceBundleViewResolver進行邏輯檢視名到具體View例項的查詢,如果沒能找到,再尋求 InternalResourceViewResolver的幫助。我們可以在Dispatcher- Servlet的WebApplicationContext中新增如下配置內容:

 

Xml程式碼

 

01
<bean id="resourceBundleViewResolver"
02  class="org.springframework.Web.servlet.view.
03 ResourceBundleViewResolver">
04 <property name="order" value="1"></property>
05 </bean>
06 <bean id="viewResolver"
07 class="org.springframework.Web.servlet.view.
08 InternalResourceViewResolver">
09 <property name="prefix" value="/WEB-INF/jsp/"/>
10 <property name="suffix" value=".jsp"/>
11 </bean>

相應ViewResolver的bean定義對應的id或者name屬性值是任意的,DispatcherServlet將按照型別來獲取ViewResolver。如果沒有為某個ViewResolver指定order值的話,預設值為Integer.MAX_ VALUE,對應的是最低優先順序。

如果為DispatcherServlet指定多個ViewResolver的話,不要給予 InternalResour- ceViewResolver以及其他UrlBasedViewResolver子類過高的優先順序,因為這些ViewResolver即使找不到相應的檢視,也不會返回null以給我們輪詢下一個ViewResolver的機會,這樣,我們所指定的其他ViewResolver實際上就形同虛設。合理的處理方式是,給予ResourceBundleView- Resolver或者XmlViewResolver這種能夠通過返回null以表明無法找到相應檢視的ViewResolver較高的優先順序,而只是將 InternalResourceViewResolver(或者其他類似行為的ViewResolver)新增為最低優先順序ViewResolver,以作為DispatcherServlet的後備查詢物件。

----------------------------------------------------------------------------------------------

13.5. 檢視與檢視解析

所有web應用的MVC框架都有它們定位檢視的方式。 Spring提供了檢視解析器供你在瀏覽器顯示模型資料,而不必被束縛在特定的檢視技術上。 Spring內建了對JSP,Velocity模版和XSLT檢視的支援。第 14 章 整合檢視技術這一章詳細說明了Spring如何與不同的檢視技術整合。

ViewResolverView是Spring的檢視處理方式中特別重要的兩個介面。 ViewResolver提供了從檢視名稱到實際檢視的對映。 View處理請求的準備工作,並將該請求提交給某種具體的檢視技術。

13.5.1. 檢視解析器(ViewResolver

正如前面(第 13.3 節 “控制器”)所討論的, SpringWeb框架的所有控制器都返回一個ModelAndView例項。 Sprnig中的檢視以名字為標識,檢視解析器通過名字來解析檢視。Spring提供了多種檢視解析器。我們將舉例加以說明。

表 13.4. 檢視解析器

 

ViewResolver 描述

 

AbstractCachingViewResolver 抽象檢視解析器實現了對檢視的快取。在檢視被使用之前,通常需要進行一些準備工作。 從它繼承的檢視解析器將對要解析的檢視進行快取。
XmlViewResolver XmlViewResolver實現ViewResolver,支援XML格式的配置檔案。 該配置檔案必須採用與Spring XML Bean Factory相同的DTD。預設的配置檔案是 /WEB-INF/views.xml
ResourceBundleViewResolver ResourceBundleViewResolver實現ViewResolver, 在一個ResourceBundle中尋找所需bean的定義。 這個bundle通常定義在一個位於classpath中的屬性檔案中。預設的屬性檔案是views.properties
UrlBasedViewResolver UrlBasedViewResolver實現ViewResolver, 將檢視名直接解析成對應的URL,不需要顯式的對映定義。 如果你的檢視名和檢視資源的名字是一致的,就可使用該解析器,而無需進行對映。
InternalResourceViewResolver 作為UrlBasedViewResolver的子類, 它支援InternalResourceView(對Servlet和JSP的包裝), 以及其子類JstlViewTilesView。 通過setViewClass方法,可以指定用於該解析器生成檢視使用的檢視類。 更多資訊請參考UrlBasedViewResolver的Javadoc。
VelocityViewResolver /FreeMarkerViewResolver 作為UrlBasedViewResolver的子類, 它能支援VelocityView(對Velocity模版的包裝)和FreeMarkerView以及它們的子類。

舉例來說,當使用JSP作為檢視層技術時,就可以使用UrlBasedViewResolver。 這個檢視解析器會將檢視名解析成URL,並將請求傳遞給RequestDispatcher來顯示檢視。

<bean id="viewResolver"> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/></bean>當返回的檢視名為test時, 這個檢視解析器將請求傳遞給RequestDispatcherRequestDispatcher再將請求傳遞給/WEB-INF/jsp/test.jsp

當在一個web應用中混合使用不同的檢視技術時,可以使用ResourceBundleViewResolver

<bean id="viewResolver"> <property name="basename" value="views"/> <property name="defaultParentView" value="parentView"/></bean>ResourceBundleViewResolver通過basename所指定的ResourceBundle解析檢視名。 對每個待解析的檢視,ResourceBundle裡的[檢視名].class所對應的值就是實現該檢視的類。 同樣,[檢視名].url所對應的值是該檢視所對應的URL。 從上面的例子裡能夠發現,可以指定一個parent view,其它的檢視都可以從parent view擴充套件。用這種方法,可以宣告一個預設的檢視。

關於檢視快取的注意事項 - 繼承AbstractCachingViewResolver的解析器可以快取它曾經解析過的檢視。 當使用某些檢視技術時,這可以大幅度的提升效能。 也可以關掉快取功能,只要把cache屬性設成false就可以了。 而且,如果需要在系統執行時動態地更新某些檢視(比如,當一個Velocity模板被修改了), 可以呼叫removeFromCache(String viewName, Locale loc)方法來達到目的。

13.5.2. 檢視解析鏈

Spring支援多個檢視解析器一起使用。可以把它們當作一個解析鏈。 這樣有很多好處,比如在特定情況下重新定義某些檢視。 定義檢視解析鏈很容易,只要在應用上下文中定義多個解析器就可以了。 必要時,也可以通過order屬性來宣告每個解析器的序列。 要記住的是,某個解析器的order越高, 它在解析鏈中的位置越靠後。

下面這個例子展示了一個包含兩個解析器的解析鏈。 一個是InternalResourceViewResolver,這個解析器總是被自動的放到鏈的末端。 另一個是XmlViewResolver,它支援解析Excel檢視(而InternalResourceViewResolver不可以)。

01 <bean id="jspViewResolver">
02 <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
03 <property name="prefix" value="/WEB-INF/jsp/"/>
04 <property name="suffix" value=".jsp"/></bean><bean id="excelViewResolver">
05 <property name="order" value="1"/>
06 <property name="location" value="/WEB-INF/views.xml"/>
07 </bean>
08 <!-- in views.xml -->
09 <beans>
10  <bean name="report"/>
11 </beans>

 

如果某個解析器沒有找到合適的檢視,Spring會在上下文中尋找是否配置了其它的解析器。 如果有,它會繼續進行解析,否則,Srping會丟擲一個Exception

要記住,當一個檢視解析器找不到合適的檢視時,它可能 返回null值。 但是,不是每個解析器都這麼做。這是因為,在某些情況下,解析器可能無法偵測出符合要求的檢視是否存在。 比如,InternalResourceViewResolver在內部呼叫了RequestDispatcher。 請求分發是檢查一個JSP檔案是否存在的唯一方法,不幸的是,這個方法只能用一次。 同樣的問題在VelocityViewResolver和其它解析器中也有。 當使用這些解析器時,最好仔細閱讀它們的Javadoc,看看需要的解析器是否無法發現不存在的檢視。 這個問題產生的副作用是,如果InternalResourceViewResolver解析器沒有放在鏈的末端, InternalResourceViewResolver後面的那些解析器根本得不到使用, 因為InternalResourceViewResolver總是返回一個檢視!

13.5.3. 重定向(Rediret)到另一個檢視

在前面我們提到過,一個控制器通常會返回檢視名,然後由檢視解析器解析到某種檢視實現。 對於像JSP這樣實際上由Servlet/JSP引擎處理的檢視, 我們通常使用InternalResourceViewResolverInternalResourceView。 這種檢視實現最終會呼叫Servlet API的

相關推薦

springmvc檢視解析機制1

雖然我們在之前的示例中一直都是使用一個InternalResourceViewResolver進行檢視查詢,但這並不意味著每個基於 Spring MVC的Web應用程式只能使用一個ViewResolver。實際上,Dispatcher- Servlet不但可以接受多個HandlerMapp

springMVC檢視解析器的配置和使用

在spring-servlet.xml中配置檢視解析器 <!-- 配置檢視解析器 -->    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"

SpringMVC檢視解析器InternalResourceViewResolver

  今天在搭建SpringMVC開發框架的時候,出現freemarker的檢視沒有找到,報404錯誤。我的配置程式碼如下: <!--freemarker --> <mvc:view-controller path="/" view-name="homepage/i

springMVC檢視解析原理學習

SpringMVC如何解析檢視概述 不論控制器返回一個String,ModelAndView,View都會轉換為ModelAndView物件,由檢視解析器解析檢視,然後,進行頁面的跳轉。 檢視解析原始碼分析:重要的兩個介面ViewResolver和View。 檢視和檢視解析器

springmvc 檢視解析器工作不正常

參考瞭如下 https://blog.csdn.net/typa01_kk/article/details/45902783 今天搭建了一個新的工程,從頭開始搞的,處理完髮現,能正常進入controller但是 報404 研究了一番,猜測應該是檢視解析器沒有正常工作 如果是返回地址寫錯了

SpringMVC檢視解析

1.預設內部處理器:InternalResourceViewResolver      註冊檢視解析器在springmvc.xml配置檔案中進行配置,      註冊檢視解析器: <bean

springmvc檢視解析器配置

檢視解析器型別 InternalResourceViewResolver表示內建的檢視(jsp) FreeMarkerViewResolverfreeMarker的檢視(ftl) BeanNameV

SpringMVC 檢視解析器及配置

檢視解析器 在springmvc中,請求處理執行完成後,最終返回一個ModelAndView物件,即使返回的是Model或者String等型別的處理方法,springm內部也會將他們裝配成一個ModelAndView物件,springmvc藉助檢視解析器(ViewReslover),得到最終

SpringMVC檢視解析器和url跳轉問題

轉自: SpringMVC檢視解析器 前言    在前一篇部落格中講了SpringMVC的Controller控制器,在這篇部落格中將接著介紹一下SpringMVC檢視解析器。當我們對SpringMVC控制的資源發起請求時,這些請求都會被SpringMVC的Disp

springmvc檢視解析順序2

 在前一篇部落格中講了SpringMVC的Controller控制器,在這篇部落格中將接著介紹一下SpringMVC檢視解析器。當我們對SpringMVC控制的資源發起請求時,這些請求都會被SpringMVC的DispatcherServlet處理,接著Spring會分析看哪一個Handl

13.SpringMVC 檢視解析

基本概念 所有的 MVC 框架都有一套它自己的解析檢視的機制,SpringMVC 也不例外。 它使用 ViewResolver 進行檢視解析,讓使用者在瀏覽器中渲染模型。 ViewResolver 介面在檢視名稱和真正的檢視之間提供對映,它是一種開箱即用的

Spring Boot實踐——SpringMVC檢視解析

一、註解說明   在spring-boot+spring mvc 的專案中,有些時候我們需要自己配置一些專案的設定,就會涉及到這三

SpringMVC 檢視解析器 InternalResourceViewResolver

我們在使用SpringMVC的時候,想必都知道,為了安全性考慮,我們的JSP檔案都會放在WEB-INF下, 但是我們在外部是不可以直接訪問/WEB-INF/目錄下的資源對吧, 只能通過內部伺服器進行轉發的形式進行訪問,那麼InternalResourceViewResolver底層通過轉發形式幫我們解決了這個

關於SpringMVC檢視解析器的理解

最近在使用springMVC做一個東西,但是我的spring是剛學,springMVC更是一知半解,尤其對於控制器和檢視間的過程一直搞不清楚,今天有些理解,在這記錄下來. @controller中的@requestMapping"攔截"了相應的請求頁面,並且交給相應的方法處理,方法處理的返回就是

SpringMVC】6.SpringMVC檢視檢視解析

注意!!! 此文章需要配置了SpringDispatcherServlet和InternalResourceViewResolver才能夠使用,如果不會配置,請翻看我【SpringMVC】系列的第一篇文章《【SpringMVC】1. SpringMVC的第

配置SpringMVC中的檢視解析

檢視解析器的作用: 就是當 DispatcherServlet將ModelAndView傳遞給檢視解析器的時候,將ModelAndView資料填充到相應的檢視中,然後返回一個帶有資料的檢視給Dispat

05.SpringMVC-核心元件-檢視解析器-流程分析

檢視解析器:在SpringMVC-HelloWorld 可以參考 一、檢視和檢視解析器:預設使用InternalResourceViewResolver 請求處理方法執行完成後,最終返回一個ModelAndView物件. 即使返回的是String,View或者M

SpringMVC 配置多個檢視解析器遇到的問題

轉自:https://www.cnblogs.com/daxin/p/3551537.html SpringMVC 多檢視解析器配置以及問題 在SpringMVC模式當中可以通過如下配置來支援多檢視解析 <bean id="JSPViewResolver" class=

SpringMVC(二四) 檢視解析流程

目標方法無論返回的是string、ModelAndView、View,最終都被解析成modelAndView 關鍵的實現程式碼是在springmvc.xml配置檔案中定義解析器。   參考程式碼如下: <?xml version="1.0" encoding="U

SpringMVC中的檢視檢視解析

  對於控制器的目標方法,無論其返回值是String、View、ModelMap或是ModelAndView,SpringMVC都會在內部將它們封裝為一個ModelAndView物件進行返回。    Spring MVC 藉助檢視解析器(ViewResolve