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" />
<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方法。