springmvc的InternalResourceViewResolver 配置

1、视图解析InternalResourceViewResolver

org.springframework.web.servlet.view.InternalResourceViewResolver

InternalResourceViewResolver类的作用:

InternalResourceViewResolver会将视图名解析为JSP文件。另外,如果在你的JSP页面中使用了JSP标准标签库 (JavaServer Pages Standard Tag Library,JSTL)的 话,InternalResourceViewResolver能够将视图名解析为JstlView形式的JSP文件,从而将JSTL本地化和资源bundle变量暴露给JSTL的格式化(formatting)和信息(message)标签。
Spring提供了两个JSP标签库,一个用于表单到模型的绑定,另一个提供了通用的工具类特性。
考虑一个简单的场景,假设逻辑视图名为home。通用的实践是将JSP文件放到Web应用的WEB-INF目录下,防止对它的直接访问。如果我们将所有的JSP文件都放在“/WEB-INF/views/”目录下, 并且home页的JSP名为home.jsp,那么我们可以确定物理视图的路径 就是逻辑视图名home再加上“/WEB-INF/views/”前缀和“.jsp”后缀。如下图所示:
springmvc的InternalResourceViewResolver 配置
2、参数

prefix 这个表示目录 例:

<property name="prefix" value="/WEB-INF/JSP/"/>

suffix 这个表示后缀 例:

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

order 这个表示视图解析器的执行顺序,按值从小到大的顺序执行 例:

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

3、单格式的视图解析(jsp)

<bean id="viewResolver"
   class="org.springframework.web.servlet.view.InternalResourceViewResolver">
   <property name="prefix" value="/WEB-INF/page/" />
   <property name="suffix" value=".jsp" />
   <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
</bean>

4、多格式的视图解析(jsp)

<!-- 配置Html试图解析器 -->
<bean id="htmlViewResolver"
     class="org.springframework.web.servlet.view.InternalResourceViewResolver">
   <property name="order" value="0" />
   <property name="viewClass"
           value="com.jack.common.spring.HtmlResourceView" />
   <property name="prefix" value="/WEB-INF/html/" />
   <property name="suffix" value=".html"></property>
   <property name="contentType" value="text/html;charset=UTF-8"></property>
</bean>

<!-- Jsp视图解析器 -->
<bean id="jspViewResolver"
     class="org.springframework.web.servlet.view.InternalResourceViewResolver">
   <property name="order" value="1" />
   <!-- 如果配置的有html视图解析器,不能用jstl的那个 -->
   <!-- <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> -->
   <property name="viewClass" value="org.springframework.web.servlet.view.InternalResourceView" />
   <property name="prefix" value="/WEB-INF/page/" />
   <property name="suffix" value=".jsp"></property>
</bean>

可以发现htmlViewResolver视图解析器的viewClass值有些奇怪,这是因为我们需要新建一个html的解析器,该解析器要继承 InternalResourceView 并且重写 checkResource方法,代码:

import org.springframework.web.servlet.view.InternalResourceView;
import java.io.File;
import java.util.Locale;

public class HtmlResourceView extends InternalResourceView {
    @Override
    public boolean checkResource(Locale locale) throws Exception {
        File file = new File(this.getServletContext().getRealPath("/")+getUrl());
        return file.exists();
    }
}

为什么?

由于UrlBasedViewResolver(InternalResourceViewResolver的父类)的loadView方法,代码:

protected View loadView(String viewName, Locale locale) throws Exception {
    AbstractUrlBasedView view = this.buildView(viewName);
    View result = this.applyLifecycleMethods(viewName, view);
    return view.checkResource(locale)?result:null;
}

public boolean checkResource(Locale locale) throws Exception {
	 return true;
}

发现这个方法,AbstractUrlBasedView.checkResource()是永远返回true的,也就是如果找不到,也会返回一个result,但是这个result是找不到的。

为此需要重写AbstractUrlBasedView这个类,更改checkResource方法。

上一篇:如何在不使用GPS的情况下获取我的Android设备国家代码?


下一篇:android – 以编程方式设置Locale