天天看點

SpringMVC中視圖解析器的優先級

    在SpringMVC中可以同時定義多個ViewResolver視圖解析器,然後它們會組成一個ViewResolver鍊。當Controller處理器方法傳回一個邏輯視圖名稱後,ViewResolver鍊将根據其中ViewResolver的優先級來進行處理。所有的ViewResolver都實作了Ordered接口,在Spring中實作了這個接口的類都是可以排序的。在ViewResolver中是通過order屬性來指定順序的,預設都是最大值。是以我們可以通過指定ViewResolver的order屬性來實作ViewResolver的優先級,order屬性是Integer類型,order越小,對應的ViewResolver将有越高的解析視圖的權利,是以第一個進行解析的将是ViewResolver鍊中order值最小的那個。當一個ViewResolver在進行視圖解析後傳回的View對象是null的話就表示該ViewResolver不能解析該視圖,這個時候如果還存在其他order值比它大的ViewResolver就會調用剩餘的ViewResolver中的order值最小的那個來解析該視圖,依此類推。當ViewResolver在進行視圖解析後傳回的是一個非空的View對象的時候,就表示該ViewResolver能夠解析該視圖,那麼視圖解析這一步就完成了,後續的ViewResolver将不會再用來解析該視圖。當定義的所有ViewResolver都不能解析該視圖的時候,Spring就會抛出一個異常。

       基于Spring支援的這種ViewResolver鍊模式,我們就可以在SpringMVC應用中同時定義多個ViewResolver,給定不同的order值,這樣我們就可以對特定的視圖特定處理,以此來支援同一應用中有多種視圖類型。注意:像InternalResourceViewResolver這種能解析所有的視圖,即永遠能傳回一個非空View對象的ViewResolver一定要把它放在ViewResolver鍊的最後面。

<bean class="org.springframework.web.servlet.view.XmlViewResolver">  
   <property name="location" value="/WEB-INF/views.xml"/>  
   <property name="order" value="1"/>  
</bean>  
 <bean class="org.springframework.web.servlet.view.BeanNameViewResolver"
		p:order="0" />
<bean  
   class="org.springframework.web.servlet.view.UrlBasedViewResolver">  
   <property name="prefix" value="/WEB-INF/" />  
   <property name="suffix" value=".jsp" />  
   <property name="viewClass" value="org.springframework.web.servlet.view.InternalResourceView"/>  
</bean>
           

注:p:order="0"就相當于<property name="order" value="0"  />

版權聲明:本文為CSDN部落客「weixin_33762130」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。

原文連結:https://blog.csdn.net/weixin_33762130/article/details/92318553