基於SpringBoot啟動類靜態資源路徑問題
SpringBoot啟動類靜態資源路徑
SpringBoot核心配置類
SpringBoot核心JAR包–》spring-boot-autoconfigure-2.2.6.RELEASE.jar
其下面有–》org.springframework.boot.autoconfigure.web
其中有類–》ResourceProperties
類中這樣定義默認靜態資源訪問:
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = { "classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/" };
分別是一下四個靜態資源路徑
- /META-INF/resources/
- /resources/
- /static/
- /public/
靜態資源都是再classpath中,那麼問題來瞭,IDEA中的classpath在哪裡呢 ?我們來看
點擊進入項目的結構設計中–》首先在打開的項目窗口打開File->Project Structure…,得到如下圖所示的項目結構:
Source Folders表示的都是代碼源文件目錄,生成的class文件會輸出到target->classess文件夾中,但是裡面的源文件不會復制到target->classes文件夾中,Test Source Folders表示的都是測試代碼源文件目錄,生成的class文件同樣會輸出到target->classess文件夾中,並且裡面的源文件不會復制到target->classes文件夾中。
而Recource Folders表示的都是資源文件目錄,這些目錄裡面的文件會在代碼編譯運行被直接復制到target->classess文件夾中。target->classes即為classpath,任何我們需要在classpath前綴中獲取的資源都必須在target->classes文件夾中找到,否則將出現java.io.FileNotFoundException的錯誤信息。
如果想添加一些自己的目錄到Source Folders、Resource Folders這樣的目錄分類裡來實現編譯過後正確地文件輸出,則可以點擊需要設置的文件夾,再在文件結構窗口上方的Make as:後面選擇正確的目錄類型即可。
所以我們的項目靜態資源的文件夾訪問就是以這裡的Resource Folder為基準,舉個例子:
classpath:/static/指的就是:src/main/resources/static
所以SpringBoot的默認index.xml可以放在路徑為src/main/resources/static的文件夾下,這樣項目一啟動index.html就自動加載瞭。
我們將src設置成瞭Resource Folders,接下來我們在src下創建/META-INF/resources/路徑:
我們啟動項目(這個時候是沒有建立任何類,啟動類啟動加載默認的index)
成功展示index.html的內容,沒有問題。其他幾個路徑都是沒有問題的,
這裡有一個問題就是這幾個路徑的人順序問題。我們封閉建立這樣四個路徑,分別設置不同的內容:
啟動後輸出的還是HelloWorld,現在我們刪掉/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; } //循環遍歷存放這幾個路徑,按照順序加載。
靜態文件存放位置設置
默認配置
SpringBoot把類路徑下的/static,/public,/resources和META-INF/resources文件下的靜態文件映射為/,可以通過http://localhost:8080/訪問
SpringBoot默認瞭靜態文件的位置src/main/resources下的static目錄,如下:
static目錄需要自己創建。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">
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- None Found