一、如果只配置一个视图解析器,则简单:
<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视图解析器会解析所有视图,它要是排前面,后面的视图解析器就没机会了。