天天看點

Spring Web MVC 多viewResolver視圖解析器解決方案

viewResolver的定義如下:

public interface ViewResolver {

View resolveViewName(String viewName, Locale locale) throws Exception;

}

在spring 中,常用的ViewResolver 有如下幾種:

InternalResourceViewResolver 将邏輯視圖名字解析為一個路徑
BeanNameViewResolver 将邏輯視圖名字解析為bean的Name屬性,進而根據name屬性,找定義View的bean
ResourceBundleResolver 和BeanNameViewResolver一樣,隻不過定義的view-bean都在一個properties檔案中,用這個類進行加載這個properties檔案
XmlViewResolver 和ResourceBundleResolver一樣,隻不過定義的view-bean在一個xml檔案中,用這個類來加載xml檔案

當我們需要多個viewResolver的時候,spring 架構為我們提供了很好的支援,我們隻要在[spring-dispatcher-name]-servlet.xml中定義多個ViewResolver就可以了。如:

<!– 定義JSP視圖解析器–> 

<bean id=”jspViewResolver” class=”org.springframework.web.servlet.view.InternalResourceViewResolver”> 

    <property name=”prefix” value=”/WEB-INF/”></property> 

    <property name=”suffix” value=”.jsp”></property> 

    <property name=”order” value=”1” /> 

</bean>      
<bean id=”freemarkerViewResolver” class=”com.founder.web.commom.springmvc.view.ExtFreeMarkerViewResolver”> 
 <property name=”contentType” value=”text/html; charset=UTF-8”/> 
 <property name=”exposeRequestAttributes” value=”false”/> 
 <property name=”exposeSessionAttributes” value=”false”/> 
 <property name=”exposeSpringMacroHelpers” value=”true”/> 
 <property name=”cacheUnresolved” value=”false”/> 
 <property name=”order” value=”0” /> 
 </bean>      

DispatcherServlet會加載所有的viewResolver到一個list中,并按照優先級進行解析。

注意:①order中的值越小,優先級越高。

②而id為viewResolver的viewResolver的優先級是最低的。

PS:

如果某個解析器沒有找到合适的視圖,Spring會在上下文中尋找是否配置了其它的解析器。 如果有,它會繼續進行解析,否則,Srping會抛出一個​

​Exception​

​。

要記住,當一個視圖解析器找不到合适的視圖時,它可能 傳回null值。 但是,不是每個解析器都這麼做。這是因為,在某些情況下,解析器可能無法偵測出符合要求的視圖是否存在。 比如,​

​InternalResourceViewResolver​

​​在内部調用了​

​RequestDispatcher​

​​。 請求分發是檢查一個JSP檔案是否存在的唯一方法,不幸的是,這個方法隻能用一次。 同樣的問題在​

​VelocityViewResolver​

​​和其它解析器中也有。 當使用這些解析器時,最好仔細閱讀它們的Javadoc,看看需要的解析器是否無法發現不存在的視圖。 這個問題産生的副作用是,如果​

​InternalResourceViewResolver​

​​解析器沒有放在鍊的末端, ​

​InternalResourceViewResolver​

​​後面的那些解析器根本得不到使用, 因為​

​InternalResourceViewResolver​

​總是傳回一個視圖!
public boolean checkResource(Locale locale) throwsException {
        File file = new File(this.getServletContext().getRealPath("/") + getUrl());
        return file.exists();//判斷該jsp頁面是否存在