它的作用是在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. }

springmvc的InternalResourceViewResolver自我理解的更多相关文章

  1. Thread线程join方法自我理解

    Thread线程join方法自我理解 thread.join():等待thread线程运行终止,指的是main-thread(main线程)必须等待thread线程运行结束,才能继续thread.jo ...

  2. SpringMVC:学习笔记(1)——理解MVC及快速入门

    SprigMVC-理解MVC及快速入门 说明: 传统MVC-->JSPModel2-->Front Controller + Application Controller + Page C ...

  3. Spring SpringMVC myBatis(简称SSM)理解

    1对Spring的理解 (1)spring是什么? spring是Java SE(Java 标准版本)/Java EE(Java 企业版本)开发应用框架. (2)spring的作用 (a)spring ...

  4. 面试高频题:说一说对Spring和SpringMvc父子容器的理解?

    引言 以前写了几篇关于SpringBoot的文章<面试高频题:springBoot自动装配的原理你能说出来吗>.<保姆级教程,手把手教你实现一个SpringBoot的starter& ...

  5. 关于C#的委托(delegate)的自我理解

    首先描述一个事情,一个老师饿了,他要去买东西填饱肚子,然后他发现他的学生“小李”在玩,没学习,于是就委托“小李”去帮他买吃的. 根据这件事我们来分析: 首先得有个老师(老师饿了是他的方法,老师买东西也 ...

  6. 谈谈springMVC和Strut2的理解

    关于struts2框架原理 执行流程 struts2框架的核心是一个过滤器,我们编写的action类都继承ActionSupport的接口(顶层是一个过滤器filter),用户发送请求,经过核心过滤器 ...

  7. android 的生命周期自我理解

    android的active的生命周期,经过网站的blog学习,加上自己的理解总结如下: 第1种:全新的启动应用程序顺序 onCreate--->onStart---->onResume ...

  8. Java内部类的自我理解

    本文借鉴网络上多位大牛的博客和文章.感谢各位不知名人士的分享. 一.什么事内部类? 内部类是指在一个外部类的内部再定义一个类.内部类作为外部类的成员,而且依附于外部类而存在的.内部类能够为静态,可用p ...

  9. 关于 String 自我理解

    String 的一些认识: String对象是不可变,所以使用 final 修饰 字符串拼接,合理利用 StringBuilder(线程非安全),StringBuffer 线程安全 常用方法就不详细介 ...

随机推荐

  1. 题解 UVA10298 【Power Strings】

    此题我写的是后缀数组SA解法,如果不会后缀数组的可以跳过本篇blog了. 参考文献:罗穗骞 2009集训队后缀数组论文 前记 最近学后缀数组,肝了不少题,也分出了后缀数组的几个题型,看这题没有后缀数组 ...

  2. 宏碁发布两款全A平台笔记本:良心价

    导读 8月3日消息,在全球数码互动娱乐盛会ChinaJoy上,宏碁推出全新两款全A平台笔记本——暗影骑士4 锐龙版酷冷游戏本和蜂鸟Swift3锐龙版金属轻薄本. 此次发布的宏碁暗影骑士4 锐龙版笔记本 ...

  3. day01-Python运维开发基础

    还是用思维导图来一遍,印象更深!

  4. C++面试常见问题——17类模板的使用

    类模板的使用 注意在每次类模板函数时都需要声明一个类模板 #include<iostream> using namespace std; template <class T,int ...

  5. Console-terminal-tty-shell-kernel

    Console-terminal-tty-shell-kernel 1. 先看图表     1.1 简表     1.2 shell与内核的示意图     1.3 Console-terminal-t ...

  6. 010.Oracle数据库 , ORDER BY 按升序降序排序

    /*Oracle数据库查询日期在两者之间*/ SELECT DISTINCT ATA FROM LM_FAULT WHERE ( OCCUR_DATE BETWEEN to_date( '2017-0 ...

  7. 使用WinDbg分析蓝屏dump原因

    大多数人或许都经历过系统蓝屏问题,然而大多数人不清楚该怎么处理蓝屏问题,这里主要对系统蓝屏做一些解释,同时介绍下蓝屏问题分析工具WinDbg分析蓝屏问题的一般步骤. 微软官方对蓝屏的定义是,当系统遇到 ...

  8. [题解] LuoguP2764 最小路径覆盖问题

    传送门 好久没做网络流方面的题发现自己啥都不会了qwq 题意:给一张有向图,让你用最少的简单路径覆盖所有的点. 考虑这样一个东西,刚开始,我们有\(n\)条路径,每条路径就是单一的一个点,那么我们的目 ...

  9. C++Socket通信(客户端和服务器)

    win32控制台版 获取本机IP: cmd:       ipconfig/all 我写的是一个服务器和客户端点对点的信息传递(实现相互的可以适当更改代码): 服务器发送给客户端的是一个结构体数据 t ...

  10. 【docker】docker持续集成CI/持续部署CD

    持续集成(CI) 持续集成(Continuous integration)是一种流行的软件开发实践.集成是指开发将自己本地的代码提交到git等远端仓库上,那么持续集成就是每天多次提交,提早提交代码. ...