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如何與不同的檢視技術整合。
ViewResolver
和View
是Spring的檢視處理方式中特別重要的兩個介面。 ViewResolver
提供了從檢視名稱到實際檢視的對映。 View
處理請求的準備工作,並將該請求提交給某種具體的檢視技術。
13.5.1. 檢視解析器(ViewResolver
)
正如前面(第 13.3 節 “控制器”)所討論的, SpringWeb框架的所有控制器都返回一個ModelAndView
例項。 Sprnig中的檢視以名字為標識,檢視解析器通過名字來解析檢視。Spring提供了多種檢視解析器。我們將舉例加以說明。
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的包裝), 以及其子類JstlView 和TilesView 。 通過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
時, 這個檢視解析器將請求傳遞給RequestDispatcher
,RequestDispatcher
再將請求傳遞給/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引擎處理的檢視, 我們通常使用
雖然我們在之前的示例中一直都是使用一個InternalResourceViewResolver進行檢視查詢,但這並不意味著每個基於 Spring MVC的Web應用程式只能使用一個ViewResolver。實際上,Dispatcher- Servlet不但可以接受多個HandlerMapp
在spring-servlet.xml中配置檢視解析器
<!-- 配置檢視解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
今天在搭建SpringMVC開發框架的時候,出現freemarker的檢視沒有找到,報404錯誤。我的配置程式碼如下:
<!--freemarker -->
<mvc:view-controller path="/" view-name="homepage/i
SpringMVC如何解析檢視概述
不論控制器返回一個String,ModelAndView,View都會轉換為ModelAndView物件,由檢視解析器解析檢視,然後,進行頁面的跳轉。
檢視解析原始碼分析:重要的兩個介面ViewResolver和View。
檢視和檢視解析器
參考瞭如下
https://blog.csdn.net/typa01_kk/article/details/45902783
今天搭建了一個新的工程,從頭開始搞的,處理完髮現,能正常進入controller但是 報404
研究了一番,猜測應該是檢視解析器沒有正常工作
如果是返回地址寫錯了
1.預設內部處理器:InternalResourceViewResolver
註冊檢視解析器在springmvc.xml配置檔案中進行配置,
註冊檢視解析器:
<bean
檢視解析器型別
InternalResourceViewResolver表示內建的檢視(jsp)
FreeMarkerViewResolverfreeMarker的檢視(ftl)
BeanNameV
檢視解析器
在springmvc中,請求處理執行完成後,最終返回一個ModelAndView物件,即使返回的是Model或者String等型別的處理方法,springm內部也會將他們裝配成一個ModelAndView物件,springmvc藉助檢視解析器(ViewReslover),得到最終
轉自:
SpringMVC檢視解析器
前言
在前一篇部落格中講了SpringMVC的Controller控制器,在這篇部落格中將接著介紹一下SpringMVC檢視解析器。當我們對SpringMVC控制的資源發起請求時,這些請求都會被SpringMVC的Disp
在前一篇部落格中講了SpringMVC的Controller控制器,在這篇部落格中將接著介紹一下SpringMVC檢視解析器。當我們對SpringMVC控制的資源發起請求時,這些請求都會被SpringMVC的DispatcherServlet處理,接著Spring會分析看哪一個Handl
基本概念
所有的 MVC 框架都有一套它自己的解析檢視的機制,SpringMVC 也不例外。
它使用 ViewResolver 進行檢視解析,讓使用者在瀏覽器中渲染模型。
ViewResolver 介面在檢視名稱和真正的檢視之間提供對映,它是一種開箱即用的
一、註解說明
在spring-boot+spring mvc 的專案中,有些時候我們需要自己配置一些專案的設定,就會涉及到這三 我們在使用SpringMVC的時候,想必都知道,為了安全性考慮,我們的JSP檔案都會放在WEB-INF下,
但是我們在外部是不可以直接訪問/WEB-INF/目錄下的資源對吧,
只能通過內部伺服器進行轉發的形式進行訪問,那麼InternalResourceViewResolver底層通過轉發形式幫我們解決了這個
最近在使用springMVC做一個東西,但是我的spring是剛學,springMVC更是一知半解,尤其對於控制器和檢視間的過程一直搞不清楚,今天有些理解,在這記錄下來.
@controller中的@requestMapping"攔截"了相應的請求頁面,並且交給相應的方法處理,方法處理的返回就是
注意!!!
此文章需要配置了SpringDispatcherServlet和InternalResourceViewResolver才能夠使用,如果不會配置,請翻看我【SpringMVC】系列的第一篇文章《【SpringMVC】1. SpringMVC的第
檢視解析器的作用:
就是當 DispatcherServlet將ModelAndView傳遞給檢視解析器的時候,將ModelAndView資料填充到相應的檢視中,然後返回一個帶有資料的檢視給Dispat
檢視解析器:在SpringMVC-HelloWorld 可以參考
一、檢視和檢視解析器:預設使用InternalResourceViewResolver
請求處理方法執行完成後,最終返回一個ModelAndView物件.
即使返回的是String,View或者M
轉自:https://www.cnblogs.com/daxin/p/3551537.html
SpringMVC 多檢視解析器配置以及問題 在SpringMVC模式當中可以通過如下配置來支援多檢視解析
<bean id="JSPViewResolver" class= 目標方法無論返回的是string、ModelAndView、View,最終都被解析成modelAndView
關鍵的實現程式碼是在springmvc.xml配置檔案中定義解析器。
參考程式碼如下:
<?xml version="1.0" encoding="U
對於控制器的目標方法,無論其返回值是String、View、ModelMap或是ModelAndView,SpringMVC都會在內部將它們封裝為一個ModelAndView物件進行返回。
Spring MVC 藉助檢視解析器(ViewResolve InternalResourceViewResolver
和InternalResourceView
。 這種檢視實現最終會呼叫Servlet API的
相關推薦
springmvc檢視解析機制1
springMVC檢視解析器的配置和使用
SpringMVC檢視解析器InternalResourceViewResolver
springMVC檢視解析原理學習
springmvc 檢視解析器工作不正常
SpringMVC檢視解析器
springmvc檢視解析器配置
SpringMVC 檢視解析器及配置
SpringMVC檢視解析器和url跳轉問題
springmvc檢視解析順序2
13.SpringMVC 檢視解析
Spring Boot實踐——SpringMVC檢視解析
SpringMVC 檢視解析器 InternalResourceViewResolver
關於SpringMVC中檢視解析器的理解
【SpringMVC】6.SpringMVC的檢視和檢視解析器
配置SpringMVC中的檢視解析器
05.SpringMVC-核心元件-檢視解析器-流程分析
SpringMVC 配置多個檢視解析器遇到的問題
SpringMVC(二四) 檢視解析流程
SpringMVC中的檢視和檢視解析器