它的作用是在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. 如何利用TableView显示自定义nib中创建的UITableViewCell或子类?

    1.创建nib文件 cell.xib 2.在nib中拖一个UITableView出来,设置其reuse Identifier,再根据cell UI需要拖出view摆放好 3.创建ViewControl ...

  2. 学习进度-10 python爬虫

    学习爬虫的第一个案例是小说爬虫. 小说爬虫首先是解析小说页面源代码,在页面源代码中可以看到小说每章节的内容链接 爬虫的代码: import requests import re url = 'http ...

  3. 014-查看PHP的环境变量

    <?php print("你正在用文件的名字为: "); print(__FILE__); print(" <BR>\n"); print(& ...

  4. 009-PHP循环输出数组成员

    <?php $Cities[] = "<B>北京</B>"; //等同于$Cities[0] = "北京" $Cities[] = ...

  5. yum 安装 tomcat

    前言对于一个新安装的 centos 系统来说,是没有 tomcat 服务器的.用下面的命令可以查看 tomcat 服务的状态. systemctl status tomcat.service//或者 ...

  6. 使用Indy解决Could not load SSL Library错误

    测试平台:DelphiXE7 + Indy 10.6.0.5169 + Win7 64bit 步骤: 1. SSL下载版本:openssl-1.0.1j-i386-win32 可去http://yun ...

  7. 阿里云安装配置nginx

    一.简介 Nginx是一款轻量级的网页服务器.反向代理服务器.相较于Apache.lighttpd具有占有内存少,稳定性高等优势.它最常的用途是提供反向代理服务. 二 .安装 1.准备工作 Nginx ...

  8. H5页面,百度地图点击事件

    需求:用户点击地图的时候获取地址街道,编码等详细信息. 然后看百度API文档,看到了click事件,关键时候还是需要看文档的. 实现 这样子虽然在浏览器的手机模拟器下是没有问题的 但是放在机器上测试的 ...

  9. Bookshelf 2 简单DFS

    链接:https://ac.nowcoder.com/acm/contest/993/C来源:牛客网 题目描述 Farmer John recently bought another bookshel ...

  10. Golang的基础数据类型-整型

    Golang的基础数据类型-整型 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.整型概述 Go语言的整数类型一共有10个. int: 默认是有符号(signed)整形,占用空间 ...