基于SpringBoot啟動(dòng)類靜態(tài)資源路徑問(wèn)題
SpringBoot啟動(dòng)類靜態(tài)資源路徑
SpringBoot核心配置類
SpringBoot核心JAR包--》spring-boot-autoconfigure-2.2.6.RELEASE.jar
其下面有--》org.springframework.boot.autoconfigure.web
其中有類--》ResourceProperties
類中這樣定義默認(rèn)靜態(tài)資源訪問(wèn):
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = { "classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/" };
分別是一下四個(gè)靜態(tài)資源路徑
- /META-INF/resources/
- /resources/
- /static/
- /public/
靜態(tài)資源都是再classpath中,那么問(wèn)題來(lái)了,IDEA中的classpath在哪里呢 ?我們來(lái)看
點(diǎn)擊進(jìn)入項(xiàng)目的結(jié)構(gòu)設(shè)計(jì)中--》首先在打開的項(xiàng)目窗口打開File->Project Structure...,得到如下圖所示的項(xiàng)目結(jié)構(gòu):
Source Folders表示的都是代碼源文件目錄,生成的class文件會(huì)輸出到target->classess文件夾中,但是里面的源文件不會(huì)復(fù)制到target->classes文件夾中,Test Source Folders表示的都是測(cè)試代碼源文件目錄,生成的class文件同樣會(huì)輸出到target->classess文件夾中,并且里面的源文件不會(huì)復(fù)制到target->classes文件夾中。
而Recource Folders表示的都是資源文件目錄,這些目錄里面的文件會(huì)在代碼編譯運(yùn)行被直接復(fù)制到target->classess文件夾中。target->classes即為classpath,任何我們需要在classpath前綴中獲取的資源都必須在target->classes文件夾中找到,否則將出現(xiàn)java.io.FileNotFoundException的錯(cuò)誤信息。
如果想添加一些自己的目錄到Source Folders、Resource Folders這樣的目錄分類里來(lái)實(shí)現(xiàn)編譯過(guò)后正確地文件輸出,則可以點(diǎn)擊需要設(shè)置的文件夾,再在文件結(jié)構(gòu)窗口上方的Make as:后面選擇正確的目錄類型即可。
所以我們的項(xiàng)目靜態(tài)資源的文件夾訪問(wèn)就是以這里的Resource Folder為基準(zhǔn),舉個(gè)例子:
classpath:/static/指的就是:src/main/resources/static
所以SpringBoot的默認(rèn)index.xml可以放在路徑為src/main/resources/static的文件夾下,這樣項(xiàng)目一啟動(dòng)index.html就自動(dòng)加載了。
我們將src設(shè)置成了Resource Folders,接下來(lái)我們?cè)趕rc下創(chuàng)建/META-INF/resources/路徑:
我們啟動(dòng)項(xiàng)目(這個(gè)時(shí)候是沒(méi)有建立任何類,啟動(dòng)類啟動(dòng)加載默認(rèn)的index)
成功展示index.html的內(nèi)容,沒(méi)有問(wèn)題。其他幾個(gè)路徑都是沒(méi)有問(wèn)題的,
這里有一個(gè)問(wèn)題就是這幾個(gè)路徑的人順序問(wèn)題。我們封閉建立這樣四個(gè)路徑,分別設(shè)置不同的內(nèi)容:
啟動(dòng)后輸出的還是HelloWorld,現(xiàn)在我們刪掉/META-INF/resources/的index.html再看看:
成功輸出。其他的就不再試了,明確的是它的默認(rèn)加載順序是按照源碼里的順序來(lái)的。分別是:
- /META-INF/resources/
- /resources/
- /static/
- /public/
private String[] appendSlashIfNecessary(String[] staticLocations) { String[] normalized = new String[staticLocations.length]; for (int i = 0; i < staticLocations.length; i++) { String location = staticLocations[i]; normalized[i] = location.endsWith("/") ? location : location + "/"; } return normalized; } //循環(huán)遍歷存放這幾個(gè)路徑,按照順序加載。
靜態(tài)文件存放位置設(shè)置
默認(rèn)配置
SpringBoot把類路徑下的/static,/public,/resources和META-INF/resources文件下的靜態(tài)文件映射為/,可以通過(guò)http://localhost:8080/訪問(wèn)
SpringBoot默認(rèn)了靜態(tài)文件的位置src/main/resources下的static目錄,如下:
static目錄需要自己創(chuàng)建。HTML也可以放在里面
src/main/resources |_static |_js |_img |_demo.png |_css
在html代碼中使用一下代碼即可訪問(wèn)圖片
<img src="img/demo.png">
自定義位置
添加一個(gè)目錄位置
src/main/resources |_myImg |_demo.png |_static |_js |_img |_css
添加一個(gè)@Configuration注解的配置類
import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; /** * 自定義的圖片路徑 * @author pzr * */ @Configuration public class MyImageAddr extends WebMvcConfigurerAdapter { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { //addResourceHandler中的是訪問(wèn)路徑,可以修改為其他的字符串 //addResourceLocations中的是實(shí)際路徑 registry.addResourceHandler("/myImg/**").addResourceLocations("classpath:/myImg/"); super.addResourceHandlers(registry); } }
在html代碼中使用一下代碼即可訪問(wèn)圖片
<img src="/myImg/demo.png">
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
基于ElasticSearch Analyzer的使用規(guī)則詳解
這篇文章主要介紹了基于ElasticSearch Analyzer的使用規(guī)則,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07Activiti7通過(guò)代碼動(dòng)態(tài)生成工作流實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了Activiti7通過(guò)代碼動(dòng)態(tài)生成工作流實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11Spring Bean的實(shí)例化之屬性注入源碼剖析過(guò)程
本篇文章主要就是分析Spring源碼剖析-Bean的實(shí)例化-屬性注入的相關(guān)知識(shí),通過(guò)本文學(xué)習(xí)AbstractAutowireCapableBeanFactory#populateBean 方法的主要功能就是屬性填充,感興趣的朋友跟隨小編一起看看吧2021-06-06mybatis Example Criteria like 模糊查詢問(wèn)題
這篇文章主要介紹了mybatis Example Criteria like 模糊查詢問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02Java 實(shí)現(xiàn)FTP服務(wù)實(shí)例詳解
這篇文章主要介紹了Java 實(shí)現(xiàn)FTP服務(wù)實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-04-04