一、如果只配置一個視圖解析器,則簡單:
<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視圖解析器會解析所有視圖,它要是排前面,後面的視圖解析器就沒機會了。