它的作用是在Controller返回的时候进行解析视图

   @RequestMapping("/advertising")  

    public String advertising(Model model ) {
return "ta";
}
}

如上 ta就是查找到ta.jsp 然后往WEB-INF目录进行查找。而WEB-INF是对web来说是安全目录,是不能直接访问里面的资源的

这个是一个springmvc的视图解析器,通常是用来配置jsp的

<bean id="jsp"  class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
<property name="order" value="44" />
<property name="contentType" value="text/html"/>
<property name="prefix" value="/WEB-INF/"/>
<property name="suffix" value=".jsp"/>
</bean>

但是我先除了配置jsp还想配置html的时候就会出现问题。

如:

我WEB-INF下面有ta.html和tas.jsp

<mvc:view-controller path="/" view-name="ta"/>//注意是以这个为重点
<mvc:annotation-driven />
<mvc:default-servlet-handler/>
<!-- 自动扫描(自动注入) -->
<context:component-scan base-package="com.wwzuizz.**.controller"/>
<mvc:resources mapping="/WEB-INF/**" location="/WEB-INF/"/>
<bean id="html" class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
<property name="order" value="3344" />
<property name="prefix" value="/WEB-INF/"></property>
<property name="suffix" value=".html"/>
<property name="contentType" value="text/html"></property>
</bean>
<bean id="jsp" class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
<property name="order" value="44" />
<property name="contentType" value="text/html"/>
<property name="prefix" value="/WEB-INF/"/>
<property name="suffix" value=".jsp"/>
</bean>

进行如上配置的时候,根据优先级它会先取jsp,然后在html。可是发现它只是检查一次而已,如如果是jsp的order比较低,则只会解析jsp,如果找不到就直接异常了。

如果是html的order比较低,则只会解析html,如果找不到也会直接报异常。

我想要的效果是优先解析jsp,找不到再解析htnl。

查看源码UrlBasedViewResolver(InternalResourceViewResolver的父类)

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;
}

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

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

为此只需要重写AbstractUrlBasedView这个类

<mvc:view-controller path="/" view-name="ta"/>
<mvc:annotation-driven />
<mvc:default-servlet-handler/>
<!-- 自动扫描(自动注入) -->
<context:component-scan base-package="com.wwzuizz.**.controller"/>
<mvc:resources mapping="/WEB-INF/**" location="/WEB-INF/"/>
<bean id="html" class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
<property name="order" value="3344" />
<property name="viewClass" value="com.wwzuizz.common.DefaultJstlView"/>
<property name="prefix" value="/WEB-INF/"></property>
<property name="suffix" value=".html"/>
<property name="contentType" value="text/html"></property>
</bean>
<bean id="jsp" class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
<property name="order" value="44" />
<property name="viewClass" value="com.wwzuizz.common.DefaultJstlView"/>
<property name="contentType" value="text/html"/>
<property name="prefix" value="/WEB-INF/"/>
<property name="suffix" value=".jsp"/>
</bean>

com.wwzuizz.common.DefaultJstlView

public class DefaultJstlView extends JstlView {  

    @Override
public boolean checkResource(Locale locale) throws Exception {
File file = new File(this.getServletContext().getRealPath("/") + getUrl());
return file.exists();//判断该jsp页面是否存在
}
}

这样子如果不存在就传递给下一个InternalResourceViewResolve;其实我很好奇order是在哪里实现的代码,我带入tomcat源码页也不到是哪里的

这样子就可以做到

<mvc:view-controller path="/" view-name="ta"/>  

ta如果jsp解析不到,就作为html解析

@Nullable
protected View resolveViewName(String viewName, @Nullable Map<String, Object> model,
Locale locale, HttpServletRequest request) throws Exception { if (this.viewResolvers != null) {
for (ViewResolver viewResolver : this.viewResolvers) {
View view = viewResolver.resolveViewName(viewName, locale);
if (view != null) {
return view;
}
}
}
return null;
}

补充:

org.springframework.web.servlet.DispatcherServlet

如下视图解析的时候会for的去找 所以如果不为空就直接返回

  1. <mvc:view-controller path="/" view-name="ta"/>

ta如果jsp解析不到,就作为html解析

补充:

org.springframework.web.servlet.DispatcherServlet

如下视图解析的时候会for的去找 所以如果不为空就直接返回

    1. @Nullable
    2. protected View resolveViewName(String viewName, @Nullable Map<String, Object> model,
    3. Locale locale, HttpServletRequest request) throws Exception {
    4. if (this.viewResolvers != null) {
    5. for (ViewResolver viewResolver : this.viewResolvers) {
    6. View view = viewResolver.resolveViewName(viewName, locale);
    7. if (view != null) {
    8. return view;
    9. }
    10. }
    11. }
    12. return null;
    13. }

最新文章

  1. iOS开发 - OC - 实现本地数据存储的几种方式一
  2. VMware备份研究
  3. Windows Phone 开发环境的搭建
  4. iOS7 UI兼容 导航栏按钮边框 UINavigationItem left and right padding
  5. jstl是自动就有的吗,不是的Unknown tag (c:if).
  6. JSP_EL使用
  7. Java中super的用法并与this的区别(转载)
  8. 第 13 章 装饰模式【Decorator Pattern】
  9. Poj 2528-Mayor&#39;s posters 线段切割
  10. Cocos2d-x中常用粒子编辑器ParticleDesigner测试例子
  11. 【转】[WCF REST] 帮助页面与自动消息格式(JSON/XML)选择
  12. 一个人的旅行(floyd+dijskra+SPFA+Bellman)
  13. Android:AysncTask异步加载
  14. 七牛云存储C#例用小例子 C#笔记
  15. nodejs01--什么是nodejs,nodejs的基本使用
  16. CSS之文本
  17. QPainter绘制遇到的小问题
  18. 学习用Node.js和Elasticsearch构建搜索引擎(1):了解并运行Elasticsearch
  19. [OpenCV-Python] OpenCV 中的图像处理 部分 IV (五)
  20. 关于latex编译中文不显示问题的解决方法。

热门文章

  1. C# 篇基础知识3——面向对象编程
  2. python实现PCA算法原理
  3. SciPy 安装
  4. wx.previewimage预览返回会触发onshow的处理方法
  5. HTML学习第七天(二)
  6. MinGW 安装与简单实例
  7. Mongoose使用
  8. thread.start和threadstart.invoke的区别
  9. flutter安装中的一些方法
  10. leetcode617 Merge Two Binary Trees