SpringBoot-web开发(一): 静态资源的导入(源码分析)
目录
- 方式一:通过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开发
而言,我们常常需要导入一些静态资源,然而像js
、css
、images
等静态资源版本管理是比较混乱的
比如
Jquery
、Bootstrap
、Vue.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结构
开始使用前,我们看下
Jquery
的webjars
,了解下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目录,不存在自己新建
resources
、static
、public
目录位置在项目中的位置如下图所示
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开发(一): 静态资源的导入(源码分析)相关推荐
- SpringBoot-web开发(二): 页面和图标定制(源码分析)
[SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) 目录 一.首页 1. 源码分析 2. 访问首页测试 二.动态页面 1. 动态资源目录t ...
- 插件式换肤框架搭建 - 资源加载源码分析
资源加载源码分析 1.首先我们来看一下ImageView是如何加载资源的: public ImageView(Context context, @Nullable AttributeSet attrs ...
- 基于比原链开发Dapp(四)-bufferserver源码分析
##简介 本章内容主要直接分析bufferserver源码,也就是比原链官方Dapp-demo的后端接口,里面包含了UTXO的托管逻辑.账单逻辑等,还会介绍一些改进的源码内容. [储蓄分红合 ...
- Spring Boot(3) Web开发(1)静态资源处理
Spring Boot(3) Web开发(1)静态资源处理 基于spring boot 2.4.3版本 1.静态资源访问 1.1 静态资源目录 把静态资源放在类路径下的以下目录:/static; /p ...
- Springboot快速开发-书本信息管理系统(项目源码)
[我后续会发一个资源包,里面是所有代码,数据库表设计也有,大学生可以直接用,导入数据库运行,再导入后端项目和前端项目,再去网页运行就好了,效果图下面有] 1.考核要求: 数据库:MYSQL5.7+ 后 ...
- Springboot+vue开发的图书借阅管理系统项目源码下载-P0029
前言 图书借阅管理系统项目是基于SpringBoot+Vue技术开发而来,功能相对比较简单,分为两个角色即管理员和学生用户,核心业务功能就是图书的发布.借阅与归还,相比于一些复杂的系统,该项目具备简单 ...
- EOS智能合约开发(二十三)nodeos调用mongo_db_plugin源码分析
前几篇文章,我们已经深入了解了mongodb,我们从mongodb安装配置,history_plugin与mongo_db_plugin区别做了深入探讨.今天我们从源码角度分析,nodeos是如何调用 ...
- solr dataimport 数据导入源码分析(二)
上文说由DataImporter类进一步处理,DataImporter类的简要代码如下 /******************************************************* ...
- springboot环境变量(environment)加载源码分析
代码入口 //SpringApplication run 环境变量初始化入口 prepareEnvironment(listeners, bootstrapContext, applicationAr ...
最新文章
- [Cake] 1. CI中的Cake
- IDEA跟Eclipse险些打一架。Maven:都住手,我来一统天下
- python使用选择结构鉴别合法日期
- mysql日常错误信息解决方法:InnoDB: and force InnoDB to continue crash recovery here.
- 架构探险笔记5-使框架具备AOP特性(下)
- Java 对象引用以及对象赋值
- 职场人必备的几个PPT进阶小技巧
- android提交项目到svn,Android Studio 配置SVN,通过Share project提交项目和实现忽略文件...
- redlock java_Redlock分布式锁
- mac同步linux文件夹在哪里设置,Linux和Mac上的一些特殊文件将不再同步
- 安卓设置原生alert设置圆角_安卓手机设置充电提示音全新最全教程
- 【Linux】完美解决 nginx 的权限问题( Permission denied)
- leetcode python3 简单题141. Linked List Cycle
- 世界杯座位选择顺序总数
- 简单网页布局的html代码网站,一个简单的网页布局代码
- DS-5 Streamline
- 中国石油大学《大学语文》在线考试
- 怎么用计算机直接截图,电脑截图快捷键怎么使用,电脑怎么快捷键截图
- 减小动态库大小及隐藏符号
- Onboard SDK文档