目录

  • 方式一:通过WebJars
    • 1. 什么是webjars?
    • 2. webjars的使用
    • 3. webjars结构
    • 4. 解析源码
    • 5. 测试访问
  • 方式二:放入静态资源目录
    • 1. 源码分析
    • 2. 测试访问
  • 自定义资源路径
  • 总结

在web开发中,最基本的一项就是导入静态资源,那么在springboot中怎么导入静态资源呢?答案就在源码中,接下来我们来分析分析~

首先在IDEA中连按两次shift键搜索WebMvcAutoConfugure类,这是的webMvc的自动配置类,关于springboot静态资源处理的方法就在其中

我们往下滑,可以找到一个webMvc自动配置适配类WebMvcAutoConfigurationAdapter

其中有个addResourceHandlers方法,这就是我们springboot项目添加处理静态资源的方法

我们接下来分析一下这段代码,我们会首先解析橙色部分代码,再解析蓝色部分代码,分别对应导入静态资源的两种方法!


方式一:通过WebJars

addResourceHandlers方法中,上图标橙色的代码,里面提到了一个webjars的东西,这就是springboot导入静态资源的方式一,这是什么呢?

if (!registry.hasMappingForPattern("/webjars/**")) {customizeResourceHandlerRegistration(registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/").setCachePeriod(getSeconds(cachePeriod)).setCacheControl(cacheControl));
}

1. 什么是webjars?

参考博文:https://www.jianshu.com/p/ca568526f0bd
​ https://blog.coding.net/blog/spring-static-resource-process

通常对于web开发而言,我们常常需要导入一些静态资源,然而像jscssimages等静态资源版本管理是比较混乱的

  • 比如JqueryBootstrapVue.js等各个前端框架所依赖的各自组件的版本都不尽相同

  • 平时我们是将这些Web资源拷贝到Java的目录下,这种通过人工方式拷贝可能会产生版本误差,拷贝版本错误,前端页面就无法正确展示

所以,是否有一种像后端管理jar包一样的解决方案呢?这就引入了今天要介绍WebJars

  • WebJars是以Jar形式为Web项目提供资源文件,然后借助Maven这些依赖库的管理,保证这Web资源版本唯一性
  • Webjars多应用于基于Spring Boot创建微服务项目,需要打包所有资源为可执行的jar

2. webjars的使用

关于WebJars资源,官网:https://www.webjars.org/

我们到该网站上找到自己所需资源,每个资源都有自己的maven坐标,在自己的工程中添加入maven依赖,即可直接使用这些资源了。
比如这里,导入jquery的maven依赖,同时可以在左边查看导入的jquery资源

3. webjars结构

开始使用前,我们看下Jquerywebjars,了解下webjars包的目录结构

META-INF└─maven└─org.webjars└─jquery└─pom.properties└─pom.xml└─resources└─webjars└─jquery└─3.5.1└─(静态文件及源码)

4. 解析源码

对以下代码进行分析:

//如果静态资源符合"/webjars/**"的格式
if (!registry.hasMappingForPattern("/webjars/**")) {//添加资源注册到"/webjars/**"customizeResourceHandlerRegistration(registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/").setCachePeriod(getSeconds(cachePeriod)).setCacheControl(cacheControl));
}

如果静态资源名符合/webjars/**,则映射到classpath:/META-INF/resources/webjars/路径下去寻找,添加资源注册到/webjars/**路径,这两个路径就是一个对应关系:

/webjars/**  --->  classpath:/META-INF/resources/webjars/

以后直接通过该注册路径的格式通过浏览器进行访问,就可以直接访问到静态资源;

而我们Webjars所有资源都符合这个路径结构,所以只需要通过maven的方式引入这个坐标,都是可以找到识别的,这就是我们导入静态资源的方式一

5. 测试访问

接下来我们启动一下,测试能否访问到静态资源,源码中规定了访问格式/webjars/**就对应classpath:/META-INF/resources/webjars/**路径,这里是:

http://localhost:8080/webjars/jquery/3.5.1/jquery.js

就可以看到导入的juery的js静态文件


方式二:放入静态资源目录

addResourceHandlers方法中,上图标蓝色的代码,是springboot导入静态资源的第二个方式

1. 源码分析

接下来我们通过源码分析找到静态资源目录

//获取staticPathPattern
String staticPathPattern = this.mvcProperties.getStaticPathPattern();
//如果静态资源路径符合staticPathPattern的格式
if (!registry.hasMappingForPattern(staticPathPattern)) {customizeResourceHandlerRegistration(registry.addResourceHandler(staticPathPattern).addResourceLocations(getResourceLocations(this.resourceProperties.getStaticLocations())).setCachePeriod(getSeconds(cachePeriod)).setCacheControl(cacheControl));
}

同样,首先获取了staticPathPattern,然后添加资源注册到该路径,那么这个路径是什么呢?

我们点入getStaticPathPattern

再点入staticPathPattern

发现了这个路径就是/**:也就是我们通过/**这个格式的url访问,都可以访问到静态资源,那么这个路径映射到的真实路径是什么呢?

点击代码中的getStaticLocations(),可以看到四个路径

"classpath:/META-INF/resources/":就是上述的webjars
"classpath:/resources/":reources目录下的resources目录,不存在自己新建
"classpath:/static/":resources目录下的static目录
"classpath:/public/":resources目录下的public目录,不存在自己新建

resourcesstaticpublic目录位置在项目中的位置如下图所示

META-INF/resources目录就是导入webjars资源的目录

2. 测试访问

我们在静态目录之一public目录下,新建一个静态1.js文件

hello

然后我们启动主程序进行测试

访问localhost:8080/1.js,成功显示了我们的静态资源

自定义资源路径

addResourceHandlers方法的最开始,有这样一个判断

//如果静态资源已经被自定义
if (!this.resourceProperties.isAddMappings()) {logger.debug("Default resource handling disabled");return;
}

可以在application.properties中自定义静态资源的路径,默认是/**

spring.mvc.static-path-pattern=/zsr/**

一般不建议这么做,设置了上述的方式二就失效了(除非显式定义为/**


总结

SpringBoot有四个静态资源目录,在SpringBoot中导入静态资源,只需要将其放在四个静态资源目录中的任意一个即可!

`classpath:/META-INF/resources/`:webjars资源的目录
`classpath:/resources/`:reources目录下的resources目录,不存在自己新建
`classpath:/static/`:resources目录下的static目录
`classpath:/public/`:resources目录下的public目录,不存在自己新建

归根到底,方式一本质上和方式二是一种方式,通过webjars引入的资源也符合SpringBoot规定的静态资源目录形式;

  • 通过webjars,localhost:8080/webjars/**格式的所有请求,映射到classpath:/META-INF/resources/webjars/(webjars资源结构目录)寻找并显示;
  • 通过放入静态资源目录,localhost:8080/**格式的所有请求,都映射这四个静态资源目录寻找并显示

我们可以进行测试,当有多个同名静态文件存在上述不同目录中时,优先级:resources>static>public

此外,我们还可以自定义静态资源路径,但一般不建议这样做


SpringBoot-web开发(一): 静态资源的导入(源码分析)相关推荐

  1. SpringBoot-web开发(二): 页面和图标定制(源码分析)

    [SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) 目录 一.首页 1. 源码分析 2. 访问首页测试 二.动态页面 1. 动态资源目录t ...

  2. 插件式换肤框架搭建 - 资源加载源码分析

    资源加载源码分析 1.首先我们来看一下ImageView是如何加载资源的: public ImageView(Context context, @Nullable AttributeSet attrs ...

  3. 基于比原链开发Dapp(四)-bufferserver源码分析

    ##简介 ​    本章内容主要直接分析bufferserver源码,也就是比原链官方Dapp-demo的后端接口,里面包含了UTXO的托管逻辑.账单逻辑等,还会介绍一些改进的源码内容. [储蓄分红合 ...

  4. Spring Boot(3) Web开发(1)静态资源处理

    Spring Boot(3) Web开发(1)静态资源处理 基于spring boot 2.4.3版本 1.静态资源访问 1.1 静态资源目录 把静态资源放在类路径下的以下目录:/static; /p ...

  5. Springboot快速开发-书本信息管理系统(项目源码)

    [我后续会发一个资源包,里面是所有代码,数据库表设计也有,大学生可以直接用,导入数据库运行,再导入后端项目和前端项目,再去网页运行就好了,效果图下面有] 1.考核要求: 数据库:MYSQL5.7+ 后 ...

  6. Springboot+vue开发的图书借阅管理系统项目源码下载-P0029

    前言 图书借阅管理系统项目是基于SpringBoot+Vue技术开发而来,功能相对比较简单,分为两个角色即管理员和学生用户,核心业务功能就是图书的发布.借阅与归还,相比于一些复杂的系统,该项目具备简单 ...

  7. EOS智能合约开发(二十三)nodeos调用mongo_db_plugin源码分析

    前几篇文章,我们已经深入了解了mongodb,我们从mongodb安装配置,history_plugin与mongo_db_plugin区别做了深入探讨.今天我们从源码角度分析,nodeos是如何调用 ...

  8. solr dataimport 数据导入源码分析(二)

    上文说由DataImporter类进一步处理,DataImporter类的简要代码如下 /******************************************************* ...

  9. springboot环境变量(environment)加载源码分析

    代码入口 //SpringApplication run 环境变量初始化入口 prepareEnvironment(listeners, bootstrapContext, applicationAr ...

最新文章

  1. [Cake] 1. CI中的Cake
  2. IDEA跟Eclipse险些打一架。Maven:都住手,我来一统天下
  3. python使用选择结构鉴别合法日期
  4. mysql日常错误信息解决方法:InnoDB: and force InnoDB to continue crash recovery here.
  5. 架构探险笔记5-使框架具备AOP特性(下)
  6. Java 对象引用以及对象赋值
  7. 职场人必备的几个PPT进阶小技巧
  8. android提交项目到svn,Android Studio 配置SVN,通过Share project提交项目和实现忽略文件...
  9. redlock java_Redlock分布式锁
  10. mac同步linux文件夹在哪里设置,Linux和Mac上的一些特殊文件将不再同步
  11. 安卓设置原生alert设置圆角_安卓手机设置充电提示音全新最全教程
  12. 【Linux】完美解决 nginx 的权限问题( Permission denied)
  13. leetcode python3 简单题141. Linked List Cycle
  14. 世界杯座位选择顺序总数
  15. 简单网页布局的html代码网站,一个简单的网页布局代码
  16. DS-5 Streamline
  17. 中国石油大学《大学语文》在线考试
  18. 怎么用计算机直接截图,电脑截图快捷键怎么使用,电脑怎么快捷键截图
  19. 减小动态库大小及隐藏符号
  20. Onboard SDK文档

热门文章

  1. 设置select下拉框不可修改的→“四”←种方法
  2. 管理虚拟机的艺术——有备无患
  3. 2022-2028年中国科技馆行业研究及前瞻分析报告
  4. python3+ 解决写入中文乱码的问题
  5. jquery过滤HTML标签方法
  6. Pytorch的网络结构可视化(tensorboardX)(详细)
  7. 神经网络为什么需要多次epoch
  8. CVPR2020行人重识别算法论文解读
  9. 2021年大数据Spark(十二):Spark Core的RDD详解
  10. git命令合并分支代码