springmvc的InternalResourceViewResolver 配置

时间:2021-08-06
本文章向大家介绍springmvc的InternalResourceViewResolver 配置,主要包括springmvc的InternalResourceViewResolver 配置使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

springmvc的InternalResourceViewResolver 配置

 
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”后缀。如下图所示:
 
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" />
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方法。
————————————————
版权声明:本文为CSDN博主「小明同学——」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文地址:https://www.cnblogs.com/codefarmer-zb/p/15110535.html