Spring中配置視圖解析器(一)

一、如果只配置一個視圖解析器,則簡單:

<bean id="viewResolver"
		class="org.springframework.web.servlet.view.InternalResourceViewResolver"
		p:prefix="/WEB-INF/page/"
		p:suffix=".jsp" />
		

上面的配置就只能返回JSP頁面,如果在page文件夾下面查找不到,頁面就會返回404錯誤;如果是隻返回HTML頁面,就將上面配置的後綴suffix的值改爲 ".html"

二、如果我的項目既要返回JSP頁面,又要返回HTML頁面,如何在Spring中配置視圖解析器?

方法一:採用 InternalResourceViewResolver配置兩個解析器

但是,這個不是接單的兩個模塊結合就可以。如果第一個InternalResourceViewResolver解析器沒有查找到頁面資源,它有一個buildView方法,會返回true,就不會說用第二個InternalResourceViewResolver解析器來查找。

@Override
	protected AbstractUrlBasedView buildView(String viewName) throws Exception {
		InternalResourceView view = (InternalResourceView) super.buildView(viewName);
		if (this.alwaysInclude != null) {
			view.setAlwaysInclude(this.alwaysInclude);
		}
		view.setPreventDispatchLoop(true);
		return view;
	}

爲了解決這個問題,我們就必須重寫 InternalResourceView類的public boolean checkResource(Locale locale)方法,判斷資源是否存在,不存在則返回 false。

package com.tianlin.common;

import java.io.File;
import java.util.Locale;

import org.springframework.web.servlet.view.InternalResourceView;

/**
 * HTML視圖解析器,判斷請求的資源是否存在
 * **/
public class HTMLResourceView extends InternalResourceView{
	
	  @Override    
	    public boolean checkResource(Locale locale) {    
	        System.out.println(this.getServletContext().getRealPath("/") +"++"+ super.getUrl());  
	         File file = new File(this.getServletContext().getRealPath("/") + super.getUrl());    
	         return file.exists();// 判斷該頁面是否存在    
	    }   

}
package com.tianlin.common;

import java.io.File;
import java.util.Locale;


/**
 * JSP視圖解析器,判斷請求的資源是否存在
 * **/
import org.springframework.web.servlet.view.InternalResourceView;

public class JSPResourceView extends InternalResourceView {
	
	@Override
	public boolean checkResource(Locale locale) {    
        System.out.println(this.getServletContext().getRealPath("/") +"++"+ super.getUrl());  
         File file = new File(this.getServletContext().getRealPath("/") + super.getUrl());    
         return file.exists();// 判斷該頁面是否存在    
    } 

}

然後修改spring配置:

<!-- 返回JSP  -->
<bean id="viewResolver"
		class="org.springframework.web.servlet.view.InternalResourceViewResolver"
		p:prefix="/WEB-INF/page/"
		p:order="2"
		p:suffix=".jsp"
        <!-- 對應的類,判斷資源是否存在,重寫了checkResource方法  -->
		p:viewClass="com.tianlin.common.JSPResourceView" />

<!-- 返回HTML  -->		
<bean id="HtmlviewResolver"
		class="org.springframework.web.servlet.view.InternalResourceViewResolver"
		p:prefix="/WEB-INF/views/"
		p:order="3"
		p:suffix=".html"
        <!-- 對應的類,判斷資源是否存在,重寫了checkResource方法  -->
		p:viewClass="com.tianlin.common.HTMLResourceView" />

配置viewClass屬性,order屬性的值大小問題沒影響,查找不到就會執行另一個解析器。

方法二:採用兩個不同種類的解析器 :InternalResourceViewResolver 和 freemarker

<!-- JSP視圖解析器 -->
<bean id="viewResolver"
		class="org.springframework.web.servlet.view.InternalResourceViewResolver"
		p:prefix="/WEB-INF/page/"
		p:order="2"
		p:suffix=".jsp"  />

<!--## html視圖解析器  必須先配置freemarkerConfig, 注意html是沒有prefix前綴屬性的 ##-->
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
		<!-- 配置freemarker,這裏主要解決頁面亂碼問題,還有其他屬性配置暫不涉及 -->
		<property name="freemarkerSettings">
		<bean class="org.springframework.beans.factory.config.PropertiesFactoryBean">
				<property name="properties">
					<props>
						<prop key="default_encoding">utf-8</prop>
						<prop key="output_encoding">utf-8</prop>
					</props>
				</property>
			</bean>
		</property>
		<property name="templateLoaderPath">
			<value>/WEB-INF/views/</value>
		</property>
	</bean>
	<!-- 配置HTML視圖解析器, order的值要比JSP小,優先級比 InternalResourceViewResolver 視圖解析器要高 -->
<bean id="htmlviewResolver"
	class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"
		p:suffix=".html" 
		p:order="1">
		<property name="contentType" value="text/html;charset=UTF-8" />
	</bean> 

這裏需要注意的是 InternalResourceViewResolver的優先級一定要比 freemarker的低,即freemarker的order屬性的值要更小;InternalResourceViewResolver視圖解析器會解析所有視圖,它要是排前面,後面的視圖解析器就沒機會了。

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章