网站首页 > 技术文章 正文
在我们开发Web应用的时候,会用到大量的js、css、image、html等静态资源资源。
静态资源映射
默认情况下,我们只需要将静态资源放在一下几个目录中就可以直接通过url在浏览器中访问了。
- /META-INF/resources/
- /resources/
- /static/
- /public/
如果这四个目录中有相同的静态资源文件,那么优先访问哪个目录下面的资源啊?
静态资源的默认访问优先级:/META-INF/resources/>/resources/>/static/>/public/
在四个目录中都放一个static.html的文件,每个html文件中都说明自己所在的目录,访问结果如下:
SpringBoot关于静态资源的访问涉及到了application.properties中的两个属性:
# 默认值为 /* spring.mvc.static-path-pattern= #这里设置静态资源匹配的url-pattern # 默认值为 classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/ spring.resources.static-locations= #这里设置要指向的路径,多个使用英文逗号隔开,在前面的优先级高
此时,我们豁然开朗,知道默认情况下静态资源为什么放在/META-INF/resources/、/resources/、/static/、/public/这四个目录了,还有这四个目录访问的优先级是怎么来的了。
修改静态资源映射的方法:
- 我们可以修改这两个属性来改变静态资源的映射,比如我们的所有静态资源都在mystatic目录中,并且我们希望访问静态资源的的url都带有/mystatic/这个目录前缀:
spring.mvc.static-path-pattern=/mystatic/* spring.resources.static-locations= classpath:mystatic/
在resources资源目录中创建一个mystatic目录,在该目录下面创建一个static.html文件,访问结果如下:
- 继承WebMvcConfigurerAdapter类,并且重写addResourceHandlers方法就行,该操作与上面的方法得到的效果是一样的
注意:还可以设置外部磁盘目录,设置方式不变,格式如下:file:d/mystatic/。
WebJars
WebJars将前端资源(css,js,image,html等等)打包到jar中,然后使用基于JVM的包管理器(比如 Maven、Gradle 等)管理前端依赖的方案。SpringBoot中也可以通过WebJars来访问静态资源。
SpringBoot默认将/webjars/**映射到 classpath:/META-INF/resources/webjars/。
- /webjars/**:表示/webjars/目录下的所有文件,及存在其目录下的jar包中的所有文件。
所以默认情况下我们需要访问WebJars中的资源,需要将其jar包放到classpath:/META-INF/resources/webjars/目录中。
我们来使用一下WebJars:
- 在pom.xml中引入jquery的WebJars,默认会被放在classpath:/META-INF/resources/webjars/目录中
<dependency> <groupId>org.webjars</groupId> <artifactId>jquery</artifactId> <version>2.1.1</version> </dependency>
- 在前端webjars.html页面中引入jquery
<script src="/webjars/jquery/2.1.1/jquery.js"></script>
- 访问页面webjars.html,查看源码,可以链接到jquery.js的内容
版本号统一管理
如果我们有很多页面都是用了WebJars中的资源,而我们现在要升级WebJars的版本,岂不是要在每个页面中都改动一下,这样很麻烦啊,有没有简单的方法啊。此时,我们可以进行版本号统一管理。
- 在pom.xml中引入jquery的WebJars的基础上添加:
<dependency> <groupId>org.webjars</groupId> <artifactId>webjars-locator</artifactId> </dependency>
- 添加版本号统一管理的控制器
- 在页面中引入jquery的方式如下:
<script src="/webjarslocator/jquery/jquery.js"></script>
静态资源版本管理
当我们资源内容发生变化时,由于浏览器缓存,用户本地的静态资源还是旧的资源,为了防止这种情况导致的问题,我们可能会手动在请求url的时候加个版本号或者其他方式。
<script type="text/javascript" src="/lavor.js?v=1.1"></script>
SpringMVC提供了两种方式可以帮助我们很容易地解决这类问题。
MD5方式
- 修改application.properties配置文件
spring.resources.chain.strategy.content.enabled=true spring.resources.chain.strategy.content.paths=/**
- 添加@ControllerAdvice注解,返回ResourceUrlProvider的对象,这样所有通过控制器返回的模板页面(jsp,thymeleaf,freeemarker等)就都可以在页面中使用该对象了
- 在控制器返回的模板页面中,添加以下信息,我们这里的返回页面时jsp页面,lavor.js是webapp目录下面的js脚本文件。
<script src="${urls.getForLookupPath('/lavor.js') }"></script>
- 通过浏览器访问控制器的请求url,查看页面源代码
<script src="/lavor-fdfa0502716d517c6cad4f2536aa02a1.js"></script>
请求/lavor-fdfa0502716d517c6cad4f2536aa02a1.js,我们MD5配置的paths=/**,所以SpringMVC会尝试url中是否包含-,如果包含会去掉后面这部分,然后去映射的目录(如webapp根目录,上面提到的四大静态映射目录)查找/lavor.js文件,如果能找到就返回。
版本号方式
- 修改application.properties配置文件,注意MD5方式中的是content,这里是fixed
spring.resources.chain.strategy.fixed.enabled=true #版本号处理的路径 spring.resources.chain.strategy.fixed.paths=/** # 版本号,可以为所处理路径中的资源加上/v1.1目录前缀 spring.resources.chain.strategy.fixed.version=v1.1
- 添加@ControllerAdvice注解,返回ResourceUrlProvider的对象,这样所有通过控制器返回的模板页面(jsp,thymeleaf,freeemarker等)就都可以在页面中使用该对象了
- 在控制器返回的模板页面中,添加以下信息,我们这里的返回页面时jsp页面,lavor.js是webapp目录下面的js脚本文件.
<script src="${urls.getForLookupPath('/lavor.js') }"></script>
- 通过浏览器访问控制器的请求url,查看页面源代码
<script src="/v1.1/lavor.js"></script>
请求/v1.1/lavor.js,会查看v1.1是不是版本号,如果是就去掉前缀目录,直接查找/lavor.js。
注意:我们发现如果添加了webapp目录,那么该目录也可以存放静态资源,并且默认情况下访问优先级比/META-INF/resources/还要高。
猜你喜欢
- 2024-10-21 Spring Boot中添加Thymeleaf模板 springboot 添加filter
- 2024-10-21 Spring Boot 的静态资源处理 springboot静态资源配置
- 2024-10-21 Spring Boot 系列@ControllerAdvice 拦截异常并统一处理
- 2024-10-21 Spring Boot 入门教程 | 图文讲解
- 2024-10-21 牛刀小试——五分钟入门Spring Boot
- 2024-10-21 我教你初识SpringBoot——写HelloWorld
- 2024-10-21 每日分享- springboot 微服务项目如何集成 html
- 2024-10-21 11:SpringBoot整合JavaMail实现邮件发送功能
- 2024-10-21 SpringBoot中异步请求和异步调用(看这一篇就够了)
- 2024-10-21 Spring Boot 2.x基础教程:使用 ECharts 绘制各种华丽的数据图表
你 发表评论:
欢迎- 11-18软考系统分析师知识点十六:系统实现与测试
- 11-18第16篇 软件工程(四)过程管理与测试管理
- 11-18编程|实例(分书问题)了解数据结构、算法(穷举、递归、回溯)
- 11-18算法-减治法
- 11-18笑疯了!巴基斯坦首金!没有技巧全是蛮力!解说:真远啊!笑死!
- 11-18搜索算法之深度优先、广度优先、约束条件、限界函数及相应算法
- 11-18游戏中的优化指的的是什么?
- 11-18算法-分治法
- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)