基于SpringBoot啟動類靜態(tài)資源路徑問題
SpringBoot啟動類靜態(tài)資源路徑
SpringBoot核心配置類
SpringBoot核心JAR包--》spring-boot-autoconfigure-2.2.6.RELEASE.jar
其下面有--》org.springframework.boot.autoconfigure.web
其中有類--》ResourceProperties
類中這樣定義默認靜態(tài)資源訪問:
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = { "classpath:/META-INF/resources/",
"classpath:/resources/", "classpath:/static/", "classpath:/public/" };
分別是一下四個靜態(tài)資源路徑
- /META-INF/resources/
- /resources/
- /static/
- /public/
靜態(tài)資源都是再classpath中,那么問題來了,IDEA中的classpath在哪里呢 ?我們來看

點擊進入項目的結(jié)構(gòu)設(shè)計中--》首先在打開的項目窗口打開File->Project Structure...,得到如下圖所示的項目結(jié)構(gòu):

Source Folders表示的都是代碼源文件目錄,生成的class文件會輸出到target->classess文件夾中,但是里面的源文件不會復(fù)制到target->classes文件夾中,Test Source Folders表示的都是測試代碼源文件目錄,生成的class文件同樣會輸出到target->classess文件夾中,并且里面的源文件不會復(fù)制到target->classes文件夾中。
而Recource Folders表示的都是資源文件目錄,這些目錄里面的文件會在代碼編譯運行被直接復(fù)制到target->classess文件夾中。target->classes即為classpath,任何我們需要在classpath前綴中獲取的資源都必須在target->classes文件夾中找到,否則將出現(xiàn)java.io.FileNotFoundException的錯誤信息。
如果想添加一些自己的目錄到Source Folders、Resource Folders這樣的目錄分類里來實現(xiàn)編譯過后正確地文件輸出,則可以點擊需要設(shè)置的文件夾,再在文件結(jié)構(gòu)窗口上方的Make as:后面選擇正確的目錄類型即可。
所以我們的項目靜態(tài)資源的文件夾訪問就是以這里的Resource Folder為基準,舉個例子:
classpath:/static/指的就是:src/main/resources/static
所以SpringBoot的默認index.xml可以放在路徑為src/main/resources/static的文件夾下,這樣項目一啟動index.html就自動加載了。

我們將src設(shè)置成了Resource Folders,接下來我們在src下創(chuàng)建/META-INF/resources/路徑:

我們啟動項目(這個時候是沒有建立任何類,啟動類啟動加載默認的index)

成功展示index.html的內(nèi)容,沒有問題。其他幾個路徑都是沒有問題的,
這里有一個問題就是這幾個路徑的人順序問題。我們封閉建立這樣四個路徑,分別設(shè)置不同的內(nèi)容:

啟動后輸出的還是HelloWorld,現(xiàn)在我們刪掉/META-INF/resources/的index.html再看看:

成功輸出。其他的就不再試了,明確的是它的默認加載順序是按照源碼里的順序來的。分別是:
- /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)遍歷存放這幾個路徑,按照順序加載。
靜態(tài)文件存放位置設(shè)置
默認配置
SpringBoot把類路徑下的/static,/public,/resources和META-INF/resources文件下的靜態(tài)文件映射為/,可以通過http://localhost:8080/訪問
SpringBoot默認了靜態(tài)文件的位置src/main/resources下的static目錄,如下:
static目錄需要自己創(chuàng)建。HTML也可以放在里面
src/main/resources
|_static
|_js
|_img
|_demo.png
|_css
在html代碼中使用一下代碼即可訪問圖片
<img src="img/demo.png">
自定義位置
添加一個目錄位置
src/main/resources
|_myImg
|_demo.png
|_static
|_js
|_img
|_css
添加一個@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中的是訪問路徑,可以修改為其他的字符串
//addResourceLocations中的是實際路徑
registry.addResourceHandler("/myImg/**").addResourceLocations("classpath:/myImg/");
super.addResourceHandlers(registry);
}
}
在html代碼中使用一下代碼即可訪問圖片
<img src="/myImg/demo.png">
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring中的攔截器HandlerInterceptor詳細解析
這篇文章主要介紹了Spring中的攔截器HandlerInterceptor詳細解析,HandlerInterceptor 是 Spring 框架提供的一個攔截器接口,用于在請求處理過程中攔截和處理請求,需要的朋友可以參考下2024-01-01
Springboot jar運行時如何將jar內(nèi)的文件拷貝到文件系統(tǒng)中
因為執(zhí)行需要,需要把jar內(nèi)templates文件夾下的的文件夾及文件加壓到宿主機器的某個路徑下,以便執(zhí)行對應(yīng)的腳本文件,這篇文章主要介紹了Springboot jar運行時如何將jar內(nèi)的文件拷貝到文件系統(tǒng)中,需要的朋友可以參考下2024-06-06
spring中在xml配置中加載properties文件的步驟
這篇文章主要介紹了在spring中如何在xml配置中加載properties文件,本文分步驟給大家介紹在XML配置中加載properties文件的方法,需要的朋友可以參考下2023-07-07
Spring Boot FeignClient 如何捕獲業(yè)務(wù)異常信息
這篇文章主要介紹了Spring Boot FeignClient 如何捕獲業(yè)務(wù)異常信息的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
SpringCloud實現(xiàn)服務(wù)調(diào)用feign與熔斷hystrix和網(wǎng)關(guān)gateway詳細分析
這篇文章主要介紹了SpringCloud實現(xiàn)服務(wù)調(diào)用feign與熔斷hystrix和網(wǎng)關(guān)gateway,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-04-04
通過idea創(chuàng)建Spring Boot項目并配置啟動過程圖解
這篇文章主要介紹了通過idea創(chuàng)建Spring Boot項目并配置啟動過程圖解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-11-11
Sentinel結(jié)合Nacos實現(xiàn)數(shù)據(jù)持久化過程詳解
這篇文章主要介紹了Sentinel結(jié)合Nacos實現(xiàn)數(shù)據(jù)持久化過程,要持久化的原因是因為每次啟動Sentinel都會使之前配置的規(guī)則就清空了,這樣每次都要再去設(shè)定規(guī)則顯得非常的麻煩,感興趣想要詳細了解可以參考下文2023-05-05

