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视图解析器会解析所有视图,它要是排前面,后面的视图解析器就没机会了。

 

 

 

 

 

 

 

 

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