SpringBoot默认的五个静态资源位置&&自定义静态资源位置&&WebMvcCofigurer源码解析

2023-10-27

我们在SSM中的SpringMVC中配置静态资源过滤

<mvc:resources mapping="/js/**" location="/js/"/>
<mvc:resources mapping="/css/**" location="/css/"/>
<mvc:resources mapping="/html/**" location="/html/"/>

这是指定了在哪些目录下不进行拦截,和配置了映射。这是一种Ant风格的路径匹配,/**
也可以在web.xml中配置表示任意目录。如果想要都可以访问,可以这样配置

<mvc:resources mapping="/**" location="/"/>

当然,除了在xml配置文件中,我们还可以web.xml配置。
在SpringBoot中我们不使用配置文件以及在web.xml中配置,我们使用java代码的方式,也可以进行设置静态资源过滤。

@Configuration
@ComponentScan(basePackages = "com.zsl.javassm")
public class SpringMVCConfig extends WebMvcConfigurationSupport {
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**").addResourceLocations("/static/");
    }
}


我们可以看出,这个配置类是继承了WebMvcConfigurationSupport,覆写了addResourceHandlers方法,在addResourceHandlers中,指定了static目录下可以直接访问。
addResourceHandler(“/**”)//定义请求 URL 规则;
addResourceLocations(“/static/”)//定义资源位置;

我们知道,在我们新建项目后, 会有个resources/static 目录,在默认的时候,把静态资源文件放在这个目录下,就可以直接访问。

其实一共有5个位置可以放静态资源,
**

  1. classpath:/META-INF/resources/
  2. classpath:/resources/
  3. classpath:/static/
  4. classpath:/public/
  5. /
    **
    在这里插入图片描述

这里第5个 / 其实就是表示 webapp 目录中的静态资源也不被拦截。如果同一个文件分别出现在五个目录下,那么优先级也是按照上面列出的顺序。

添加webapp目录
点击IDEA右上角的Project Structure
在这里插入图片描述

先点击下图中的+号,再点击Web
在这里插入图片描述

修改Web模板的位置
在这里插入图片描述在这里插入图片描述在这里插入图片描述

自定义文件的位置
除了上面5个默认的位置,我们还可以自定义文件的位置。
2种方式,1是在配置文件进行配置;2是用java代码来进行配置。
1.在application.properties

1.	spring.resources.static-locations=classpath:/zsl/
2.	spring.mvc.static-path-pattern=/**

spring.resources.static-locations是表示定义资源位置;
spring.mvc.static-path-pattern是定义请求 URL 规则;

如果向上面那样进行配置,那么我们访问resources/zsl目录下的资源文件,比如01.html,就可以使用http://localhost:8080/01.html

2.java代码

1.	@Configuration
2.	public class WebMVCConfig implements WebMvcConfigurer {
3.	    @Override
4.	    public void addResourceHandlers(ResourceHandlerRegistry registry) {
5.	        registry.addResourceHandler("/**").addResourceLocations("classpath:/zsl/");
6.	    }
7.	}

这个配置类是继承了WebMvcConfigurationSupport,覆写了addResourceHandlers方法,在addResourceHandlers中,指定了zsl目录下可以直接访问。

WebMvcConfigurationSupport源码解析
在这里插入图片描述

可以看到,在WebMvcAutoConfiguration中,有一个静态内部类WebMvcAutoConfigurationAdapter,它实现了WebMvcConfigurer这个接口,

我们找到addResourceHandlers这个方法,

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
   if (!this.resourceProperties.isAddMappings()) {
      logger.debug("Default resource handling disabled");
      return;
   }
   Duration cachePeriod = this.resourceProperties.getCache().getPeriod();
   CacheControl cacheControl = this.resourceProperties.getCache().getCachecontrol().toHttpCacheControl();
   if (!registry.hasMappingForPattern("/webjars/**")) {
      customizeResourceHandlerRegistration(registry.addResourceHandler("/webjars/**")
            .addResourceLocations("classpath:/META-INF/resources/webjars/")
            .setCachePeriod(getSeconds(cachePeriod)).setCacheControl(cacheControl));
   }
   String staticPathPattern = this.mvcProperties.getStaticPathPattern();
   if (!registry.hasMappingForPattern(staticPathPattern)) {
      customizeResourceHandlerRegistration(registry.addResourceHandler(staticPathPattern)
            .addResourceLocations(getResourceLocations(this.resourceProperties.getStaticLocations()))
            .setCachePeriod(getSeconds(cachePeriod)).setCacheControl(cacheControl));
   }
}

在这里插入图片描述
我们先来看看this.mvcProperties.getStaticPathPattern();
在这里插入图片描述
可以看到this.mvcProperties.getStaticPathPattern() 方法对应的值是 “/**”;
我们来看看this.resourceProperties.getStaticLocations();

这里把相关代码放一起了,方便我们看

public String[] getStaticLocations() {
   return this.staticLocations;
}

private String[] staticLocations = CLASSPATH_RESOURCE_LOCATIONS;

private static final String[] CLASSPATH_RESOURCE_LOCATIONS = { "classpath:/META-INF/resources/",
      "classpath:/resources/", "classpath:/static/", "classpath:/public/" };

可以看到this.resourceProperties.getStaticLocations()返回了四个位置,分别是:"classpath:/META-INF/resources/", "classpath:/resources/","classpath:/static/", "classpath:/public/";
我们再来看看getResourceLocations

在这里插入图片描述
在这里插入图片描述

好了,这回5个默认位置我给你找齐了。

registry.addResourceHandler(staticPathPattern); //定义请求 URL 规则;

addResourceLocations(getResourceLocations(this.resourceProperties.getStaticLocations()));//定义资源位置;

所以说我们要使用java代码自定义静态资源文件位置,我们只需要使用配置类来继承这个WebMvcConfigurer,使用覆写
addResourceHandlers(ResourceHandlerRegistry registry)

在这里插入图片描述
在这里插入图片描述

使用

addResourceHandler("/**")//定义请求 URL 规则;
addResourceLocations("/static/")//定义资源位置;

就可以了.
细心的人会发现,
使用自定义的配置类继承WebMvcConfigurationSupport和WebMvcCofigurer都可以实现自定义静态资源位置。那么

WebMvcConfigurerAdapter和WebMvcConfigurationSupport的区别

WebMvcConfigurerAdapter只是对WebMvcCofigurer的空实现,而WebMvcConfigurationSupport的实现的方法更全面

但是继承WebMvcConfigurationSupport会发现Spring Boot的WebMvc自动配置失效(WebMvcAutoConfiguration自动化配置),导致无法视图解析器无法解析并返回到对应的视图。

该怎么选择了?
WebMvcConfigurationSupport–>不需要返回逻辑视图,可以选择继承此类
WebMvcCofigurer–>返回逻辑视图,可以选择实现此方法,重写addInterceptor方法

关于WebMvcConfigurationSupport的源码解析,我们下篇再讲

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot默认的五个静态资源位置&&自定义静态资源位置&&WebMvcCofigurer源码解析 的相关文章

随机推荐

  • Java安装配置教程,2023年最新版,全部版本看这一篇就够了!!

    JDK新手无脑安装配置教程 JDK下载网址 ps 如果你的JDK版本在官网没有找到 可以通过第三方资源进行下载 下载安装配置教程是通用的 官方链接 gt https www oracle com java technologies java
  • 关于ViewGroup$ViewLocationHolder$mRoot的内存泄漏

    今儿遇到个场景 在Android P API 28 中 在退出了含有RecyclerView的RelativeLayout中 LeakCanary报了这么一个内存泄漏 1 定位问题 1 1 定位源码 在AndroidP中ViewGroup内
  • 初探计算机网络代理

    初探计算机网络代理 文章目录 初探计算机网络代理 什么是计算机网络代理 代理的类型有哪些 正向代理 反向代理 正向代理的实现原理是什么 普通代理 隧道代理 SOCKS 协议 反向代理的实现原理是什么 都有哪些代理产品 TL DR 这篇文章介
  • CH8-多线程

    案例8 1 龟兔赛跑 案例介绍 1 任务描述 众所周知的 龟兔赛跑 故事 兔子因为太过自信 比赛中途休息而导致乌龟赢得了比赛 本案例要求编写一个程序模拟龟兔赛跑 乌龟的速度为1米 1500毫秒 兔子的速度为5米 500毫秒 等兔子跑到第70
  • Prometheus在kubernetes集群的搭建教程

    Prometheus在kubernetes集群的搭建 一 Prometheus介绍 1 Prometheus简介 2 Prometheus介绍 3 Prometheus与市面的监控系统区别 4 Prometheus特点 5 Promethe
  • 21.QT-QTreeWidget,QTabWidget

    QTreeWidget树形列表 设置标签相关函数 void QTreeWidget setHeaderItem QTreeWidgetItem item void QTreeWidget setHeaderLabel constQStrin
  • 论文笔记:NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis

    目录 文章摘要 1 Neural Radiance Field Scene Representation 基于神经辐射场的场景表示 2 Volume Rendering with Radiance Fields 基于辐射场的体素渲染 2 1
  • 奇异值分解 (SVD)原理及python实现

    奇异值分解 Singular Value Decomposition SVD 是一种矩阵分解 Matrix Decomposition 的方法 除此之外 矩阵分解还有很多方法 例如特征分解 Eigendecomposition LU分解 L
  • Linux Kernel编译流程 (二)

    1 vmlinux 研究vmlinux文件的产生 zImage和Image产生 Linux Kernel 4 18 20 Source Insight 3 5 Ubuntu 18 04 arm linux gnueabi xxx 1 1 f
  • 油盐微服务——服务容错保护Hystrix

    文章目录 引入Hystrix 由于网络问题或者依赖服务自身的问题出现的调用故障或者延迟 如果此时调用方请求不断增加 就会形成任务积压 最终导致自身服务的瘫痪 比如在一个电商网站中 可能会讲系统拆分成为用户 订单 库存 积分 评论等一系列服务
  • svn 撤销已经add的文件

    在svn add了某文件之后 发现某个文件不需要被修改 这时候可以使用revert命令来撤销add操作 svn revert 文件路径 如果需要将之前add的内容都撤销掉的话 一个文件或者一个文件夹来revert就会有点慢 这时候直接使用r
  • 小程序官方tabbar和自定义tabbar

    uniapp官方tabbar 打开项目中的 pages json 文件 在 JSON 对象中添加一个名为 tabBar 的字段 并设置其值为一个对象 在 tabBar 对象中 配置 color 和 selectedColor 字段来定义 T
  • moveToThread的经历

    moveToThread的前后QOBJECT的对象所依赖的线程会发生变化 即对象更该到设置的线程中去 如果对象里有QOBJECT成员 且没有父子关系 则这些成员仍然依赖于创建它的线程
  • python读取键盘输入模块-python 模拟键盘输入

    一 PyUserInput安装 python3 5的PyMouse和PyKeyboard模块都集成到了PyUserInput模块中 在python3 5中 直接安装PyUserInput模块即可 PyUserInput模块安装前需要安装py
  • 2023年第七届航空航天、机械与机电工程国际会议(CAMME 2023)会议日期:2023-2-18 至 2023-2-20

    会议简介 2023年第七届航空航天 机械与机电工程国际会议 CAMME 2023 重要信息 会议网址 www camme org 会议时间 2023年2月18 20日 召开地点 中国广州 截稿时间 2023年12月30日 录用通知 投稿后2
  • LCD显示的一些基本概念

    参考文章 LCD的一些基本概念 添加链接描述 知识点 水平消隐 Hblank 电子枪从左到右画出像素 他每次只能画一条扫描线 画之前要先回到左边并做好画下一条扫面线的准备 这之间有一段时间叫做水平消隐 垂直消隐 VBlank 在画完全部的的
  • 【Java面试题汇总】JVM篇(2023版)

    导航 黑马Java笔记 踩坑汇总 JavaSE JavaWeb SSM SpringBoot 瑞吉外卖 SpringCloud 黑马旅游 谷粒商城 学成在线 牛客面试题 目录 1 说说你了解的JVM内存模型 2 简单说下你对JVM的了解 3
  • 配置Spring数据源c3p0与dbcp

    不管通过何种持久化技术 都必须通过数据连接访问数据库 在Spring中 数据连接是通过数据源获得的 在以往的应用中 数据源一般是Web应用服务器提供的 在Spring中 你不但可以通过JNDI获取应用服务器的数据源 也可以直接在Spring
  • redis HyperLogLog

    1 概述 Redis 在 2 8 9 版本添加了 HyperLogLog 结构 Redis HyperLogLog 是用来做基数统计的算法 HyperLogLog 的优点是 在输入元素的数量或者体积非常非常大时 计算基数所需的空间总是固定
  • SpringBoot默认的五个静态资源位置&&自定义静态资源位置&&WebMvcCofigurer源码解析

    我们在SSM中的SpringMVC中配置静态资源过滤