SpringBoot對(duì)靜態(tài)資源的映射規(guī)則詳解
什么是SpringBoot靜態(tài)資源映射?
在 Web 應(yīng)用中會(huì)涉及到大量的靜態(tài)資源,例如 JS、CSS 和 HTML 等。我們知道,Spring MVC 導(dǎo)入靜態(tài)資源文件時(shí),需要配置靜態(tài)資源的映射;但在 SpringBoot 中則不再需要進(jìn)行此項(xiàng)配置,因?yàn)?SpringBoot 已經(jīng)默認(rèn)完成了這一工作。
Spring Boot 默認(rèn)為我們提供了 3 種靜態(tài)資源映射規(guī)則:
- WebJars 映射
- 默認(rèn)資源映射
- 靜態(tài)首頁(yè)(歡迎頁(yè))映射
如何實(shí)現(xiàn)SpringBoot靜態(tài)資源映射?
1. webjars:以jar包的方式引入靜態(tài)資源
在傳統(tǒng)的Web應(yīng)用開(kāi)發(fā)中,我們經(jīng)常需要使用眾多的JavaScript和CSS庫(kù),例如jQuery.js和Bootstrap.css。這些Web資源通常被復(fù)制到Java Web項(xiàng)目的`webapp`目錄下進(jìn)行管理。然而,在Spring Boot項(xiàng)目中,應(yīng)用是以JAR包的形式部署的,不存在`webapp`目錄。為了解決這個(gè)問(wèn)題,我們可以通過(guò)Webjars將Web資源封裝成JAR包的形式提供。具體來(lái)說(shuō),就是將Web資源(如JavaScript和CSS文件)打包成一個(gè)JAR文件,并上傳到Maven中央倉(cāng)庫(kù)進(jìn)行集中管理。當(dāng)Spring Boot項(xiàng)目需要引入這些前端資源時(shí),可以在Maven Central頁(yè)面查找所需資源的Maven依賴項(xiàng),并將它們添加到項(xiàng)目中。這樣,Spring Boot項(xiàng)目就可以方便地引入和管理前端資源了。
示例:
將web資源Jquery.js 引入進(jìn)Spring Boot 項(xiàng)目中
(1)首先Maven Central搜索Jquery依賴
(2)復(fù)制Maven版的依賴代碼
(3)引入該依賴
Spring Boot通過(guò)其MVC自動(dòng)配置類`WebMvcAutoConfiguration`為Webjars前端資源設(shè)置了默認(rèn)的映射規(guī)則。根據(jù)源碼分析,Webjars資源的訪問(wèn)路徑被定義為`/webjars/**`。這意味著,任何以`/webjars/**`開(kāi)頭的請(qǐng)求,Spring Boot都會(huì)在`classpath:/META-INF/resources/webjars/`路徑下搜索對(duì)應(yīng)的Webjars資源。
(4)啟動(dòng)Spring Boot 項(xiàng)目,瀏覽器器輸入 http://localhost:8080/webjars/jquery/3.7.1/jquery.js 訪問(wèn) jquery.js 靜態(tài)資源
說(shuō)明訪問(wèn)靜態(tài)資源成功了。上面的這種方式是導(dǎo)入jar包的方式,如果我們要用自己的一些JS、CSS、jQuery文件可不可以呢?答案是可以的,所以就有了我們下面的第二種方式出現(xiàn)。
2. /** 訪問(wèn)當(dāng)前項(xiàng)目的任何資源
默認(rèn)情況下,springboot會(huì)將特定目錄中(如/static
、/public
、/resources
、/META-INF/resources
)的靜態(tài)資源映射到根路徑。
在項(xiàng)目中雙擊shift
或ctrl+N
搜索WebMvcAutoConfiguration.class文件,文件中的addResourceHandlers方法如下:
public void addResourceHandlers(ResourceHandlerRegistry registry) { if (!this.resourceProperties.isAddMappings()) { logger.debug("Default resource handling disabled"); } else { this.addResourceHandler(registry, "/webjars/**", "classpath:/META-INF/resources/webjars/"); this.addResourceHandler(registry, this.mvcProperties.getStaticPathPattern(), (registration) -> { registration.addResourceLocations(this.resourceProperties.getStaticLocations()); if (this.servletContext != null) { ServletContextResource resource = new ServletContextResource(this.servletContext, "/"); registration.addResourceLocations(new Resource[]{resource}); } }); } }
隨后進(jìn)入到getStaticLocations()
方法可以發(fā)現(xiàn)變量 staticLocations 的取值如下,當(dāng)訪問(wèn)項(xiàng)目中任意資源(即"/**")時(shí),Spring Boot 會(huì)默認(rèn)從以下路徑中查找資源文件(優(yōu)先級(jí)依次降低)
"classpath:/META-INF/resources/",
"classpath:/resources/",
"classpath:/static/",
"classpath:/public/"
這些路徑又被稱之為靜態(tài)資源路徑,當(dāng)我們請(qǐng)求某個(gè)靜態(tài)資源(例如:.html文件)時(shí),Spring Boot 會(huì)先查找優(yōu)先級(jí)高的文件夾,然后在查找優(yōu)先級(jí)低的文件夾,直到找到指定的靜態(tài)資源為止。
示例一:
在項(xiàng)目/src/main/resources/static 目錄中創(chuàng)建一個(gè) hello.html文件,代碼如下
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>hello world!</h1> </body> </html>
然后啟動(dòng)Spring Boot 項(xiàng)目,瀏覽器訪問(wèn): http://localhost:8080/hello.html ,結(jié)果如下圖所示:
示例二:
在項(xiàng)目/src/main/resources/static 目錄中存放一張照片,然后啟動(dòng)Spring Boot 項(xiàng)目,瀏覽器訪問(wèn):http://localhost:8080/test.png
即項(xiàng)目運(yùn)行時(shí)會(huì)到上述路徑下尋找靜態(tài)資源,也可以自定義靜態(tài)資源路徑,需在 application.properties 中配置:
spring.resources.static-locations=classpath:/folder1/,classpath:/folder2/
注:一旦自定義了靜態(tài)文件夾的路徑,則默認(rèn)的靜態(tài)資源路徑就會(huì)失效。
3. 靜態(tài)首頁(yè)(歡迎頁(yè))映射
靜態(tài)資源文件夾下的所有index.html 被稱之為靜態(tài)首頁(yè)或者歡迎頁(yè),它們會(huì)被 /** 映射,也就是當(dāng)我們?cè)L問(wèn) "/" 或者 "/index.html" 時(shí),都會(huì)跳轉(zhuǎn)到靜態(tài)首頁(yè)(歡迎頁(yè))
注意:訪問(wèn)靜態(tài)首頁(yè)或者歡迎頁(yè)面時(shí),其查找順序也遵循默認(rèn)靜態(tài)資源的查找順序,即先查找優(yōu)先級(jí)高的目錄,在查找優(yōu)先級(jí)低的目錄,直到找到 index.html 為止。
示例:
1、在項(xiàng)目/src/main/resources/public 目錄下創(chuàng)建一個(gè) index.html 文件,代碼如下:
<html lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>首頁(yè)</title> </head> <h1>歡迎訪問(wèn)首頁(yè)!</h1> </html>
然后啟動(dòng)Spring Boot項(xiàng)目, 瀏覽器訪問(wèn) http://localhost:8080/或者 http://localhost:8080/index.html 結(jié)果如下圖所示:
以上就是SpringBoot對(duì)靜態(tài)資源的映射規(guī)則詳解的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot靜態(tài)資源映射的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java中的StackOverflowError錯(cuò)誤問(wèn)題及解決方法
這篇文章主要介紹了Java中的StackOverflowError錯(cuò)誤,在本文中,我們仔細(xì)研究了StackOverflower錯(cuò)誤,包括Java代碼如何導(dǎo)致它,以及我們?nèi)绾卧\斷和修復(fù)它,需要的朋友可以參考下2022-07-07Java 如何讀取Excel格式xls、xlsx數(shù)據(jù)工具類
這篇文章主要介紹了Java 如何讀取Excel格式xls、xlsx數(shù)據(jù)工具類的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-0930分鐘入門Java8之默認(rèn)方法和靜態(tài)接口方法學(xué)習(xí)
這篇文章主要介紹了30分鐘入門Java8之默認(rèn)方法和靜態(tài)接口方法學(xué)習(xí),詳細(xì)介紹了默認(rèn)方法和接口,有興趣的可以了解一下。2017-04-04Spring + Mybatis 項(xiàng)目實(shí)現(xiàn)動(dòng)態(tài)切換數(shù)據(jù)源實(shí)例詳解
這篇文章主要介紹了Spring + Mybatis 項(xiàng)目實(shí)現(xiàn)動(dòng)態(tài)切換數(shù)據(jù)源的相關(guān)資料,需要的朋友參考下吧2017-04-04Java代碼審計(jì)的一些基礎(chǔ)知識(shí)你知道嗎
這篇文章主要介紹了基于Java的代碼審計(jì)功能的基礎(chǔ)知識(shí),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2021-09-09HttpClient的DnsResolver自定義DNS解析另一種選擇深入研究
這篇文章主要為大家介紹了HttpClient的DnsResolver自定義DNS解析另一種選擇深入研究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10