目錄
- 方式一:WebJars
- 1. 什么是webjars?
- 2. webjars的使用
- 3. webjars結構
- 4. 決議原始碼
- 5. 測驗訪問
- 方式二:staticPathPattern
- 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靜態檔案

方式二:staticPathPattern
在
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

發現了這個路徑就是/**:也就是我們通過/**這個格式訪問,都可以訪問到靜態資源,那么這個路徑對應的真實路徑是什么呢?
點擊代碼中的getStaticLocations(),可以看到四個路徑

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

2. 測驗訪問
比如我們在public目錄下放一個靜態檔案1.js
hello

然后我們啟動主程式訪問locaohost:8080/1.js,成功訪問了靜態資源

總結: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/**
一般不建議這么做,設定了上述的方式二就失效了(除非顯式定義為/**)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/112537.html
標籤:其他
