菲洛嘉青春动能素135HA FILLMED® NCTF 135HA LED指示灯的常见故障分析 智微智能 Elkhartlake K075终端,零售产业新选择 天空蓝拓客管理系统详细介绍版 muso公链项目 天使计划 是什么?[秘] 独家揭秘最前沿的家装“黑科技”——掌赋 天博体育欧洲杯特辑,东道主法兰西的失意2016 亚马逊的送货侦察员 学习听起来像挡泥板 Google Comics Factory使ML变得容易 笑着说-男性或女性 Amazon Rekognition中更好的人脸检测 关于Spaun的真相-大脑模拟 两个聊天机器人彼此聊天-有趣又怪异 GANPaint:将AI用于艺术 WCF和WF给予社区 从耳朵到脸 所有神经网络的深层缺陷 蠕虫在尾巴上平衡杆子 Kickstarter上的OpenCV AI套件 TensorFlow-Google的开源AI和计算引擎 众包取代新闻工作者 Google的DeepMind学会玩街机游戏 哑机器人V智能机器人 .NET与.NET 5融为一体 Google的深度学习-语音识别 LInQer将.NET LINQ移植到Javascript 机器人TED演讲-新的图灵测试? GAN的发明者加入苹果 您的智能手机会监视您键入的内容 人工智能帮助改善国际象棋 Zalando Flair NLP库已更新 TensorFlow 1.5包含移动版本 AlphaGo输了一场比赛-比分3-1 虚拟机器学习峰会 Microsoft开源AI调试工具 SharePoint走向移动 F#4.0发出文化变革的信号 克里斯蒂拍卖AI艺术品 人工智能如何区分 Facebook在蒙特利尔的新AI实验室 Mozilla想要您的声音 微软使用极深的神经网络赢得ImageNet 建立AI合作伙伴关系 .NET Core 3-Microsoft几乎回到了起点 神经网络-更好的销售商? Google使用AI查找您的住所 虹膜-适用于Android的Siri证明苹果没有优势 TensorFlow 2提供更快的模型训练 深度学习研究人员将为Google工作
您的位置:首页 >开发 >

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


目录

方式一:WebJars1. 什么是webjars?2. webjars的使用3. webjars结构4. 解析源码5. 测试访问方式二:staticPathPattern1. 源码分析2. 测试访问自定义资源路径

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

首先在IDEA中连按两次shift键搜索WebMvcAutoConfugure类,这是的webMvc的自动配置类,关于springboot静态资源处理的方法就在其中 image-20200921192255315 我们往下滑,可以找到一个webMvc自动配置适配类WebMvcAutoConfigurationAdapter image-20200921192234170 其中有个addResourceHandlers方法,这就是我们springboot项目添加处理静态资源的方法

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


方式一: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/ image-20200921121150290 我们到该网站上找到自己所需资源,每个资源都有自己的maven坐标,在自己的工程中添加入maven依赖,即可直接使用这些资源了。 比如这里,导入jquery的maven依赖,同时可以在左边查看导入的jquery资源 image-20200921121830938

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的方式引入这个坐标,都是可以找到识别的,这就是我们导入静态资源的方式一 image-20200921122039544

5. 测试访问

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

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

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


方式二:staticPathPattern

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

1. 源码分析

//获取staticPathPatternString 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 image-20200921194643300 再点入staticPathPattern image-20200921194714793 发现了这个路径就是/**:也就是我们通过/**这个格式访问,都可以访问到静态资源,那么这个路径对应的真实路径是什么呢?

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

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

image-20200921200824407

2. 测试访问

比如我们在public目录下放一个静态文件1.js

hello

image-20200921203423657 然后我们启动主程序访问locaohost:8080/1.js,成功访问了静态资源 image-20200921203451706 总结:localhost:8080下的所有请求的静态资源路径,都会去那四个目录找,就是四个存放静态资源的目录

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


自定义资源路径

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

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

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

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

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

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。