八,SpringBoot Web 開發訪問靜態資源(附+詳細源碼剖析) @目錄八,SpringBoot Web 開發訪問靜態資源(附+詳細源碼剖析)1. 基本介紹2. 快速入門2.1 準備工作3. 改變靜態資源訪問首碼,定義為我們自己想要的4. 改變Spring Boot當中的預設的靜態資源路徑(實 ...
八,SpringBoot Web 開發訪問靜態資源(附+詳細源碼剖析)
@
目錄- 八,SpringBoot Web 開發訪問靜態資源(附+詳細源碼剖析)
- 1. 基本介紹
- 2. 快速入門
- 3. 改變靜態資源訪問首碼,定義為我們自己想要的
- 4. 改變Spring Boot當中的預設的靜態資源路徑(實現自定義靜態資源路徑)
- 5. 靜態資源訪問註意事項和細節
- 6. 總結:
- 7. 最後:
1. 基本介紹
SpringBoot 中對於靜態資源的訪問:
- 只要將靜態資源放在類路徑下: /static, /public, /resources, /META-INF/resources 就可以被直接訪問-對應文件(這是 Spring Boot 的預設設置好的 )。關於這一點,我們從 WebProperties.java 這個類的源碼上可以找到,對應的配置屬性。
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = new String[]{"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"};
註意:classpath:/resources/ 表示伺服器就會在 resources 路徑下找,你在瀏覽器當中輸入的url地址的時候,不可以輸入 resources 目錄,因為伺服器就是會在 classpath:/resources/ 找的,而如果你寫了resources在瀏覽器上的話,你想表達的就是:讓瀏覽器從resources/resouces的路徑下找,這是找不到的報404錯誤
註意:classpath:/resources/ 表示伺服器就會在 resources路徑下找,你在瀏覽器當中輸入的url地址的時候,不可以輸入 resources 目錄,因為伺服器就是會在 classpath:/resources/ 找的,而如果你寫了resources 在瀏覽器上的話,你想表達的就是:讓瀏覽器從resources/resouces的路徑下找,這是找不到的報404錯誤
- 常見靜態資源: js,css,圖片(.jpg,.png,.gif,.bmp,.svg) ,字體文件(Fonts)等
- 訪問方式: 預設:項目根路徑/+靜態資源名 比如: http://localhost:8080/hi.html 。關於這一點,我們可以從 WebMvcProperties.java 類當中找到答案。
2. 快速入門
2.1 準備工作
在 pom .xml 文件中導入相關的 jar 依賴。如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.rainbowsea</groupId>
<artifactId>springboot_static_configuration</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 導入SpringBoot 父工程-規定寫法-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.3</version>
</parent>
<!-- 導入web項目場景啟動器:會自動導入和web開發相關的jar包所有依賴【庫/jar】-->
<!-- 後面還會在說明spring-boot-starter-web 到底引入哪些相關依賴-->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
編寫啟動程式:
package com.rainbowsea.springboot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication // 標誌啟動場景
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}
從上面的基本介紹 當中,我們知道了,Spring Boot 預設靜態資源的訪問路徑有4 個,我們這裡就測試這四個路徑是否可以直接訪問 。
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = new String[]{"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"};
註意:classpath 表示的是類路徑,就是如圖下麵的: resources
目錄,簡單的說就是 classpath ===(等同於)resources
。
下麵:我們分別在 resources 類路徑下,創建對應的Spring Boot 預設的四個目錄。如下圖:
同時我們在這四個目錄下,放入幾張圖片,用於訪問測試。
啟動程式運行測試:
打開瀏覽器進行直接訪問靜態資源文件:
註意:
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = new String[]{"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"}; 註意:classpath:/resources/ 表示伺服器就會在 resources 路徑下找,你在瀏覽器當中輸入的url地址的時候,不可以輸入 resources 目錄,因為伺服器就是會在 classpath:/resources/ 找的,而如果你寫了resources在瀏覽器上的話,你想表達的就是:讓瀏覽器從resources/resouces的路徑下找,這是找不到的報404錯誤
resources/static 是Spring Bopt的預設靜態路徑,預設就是以“resources/static” 作為根路徑訪問的,所以,不需要再額外的加上 static 在瀏覽器上,如果你加了,那麼你實際訪問的是:resources/static/static這個路徑,這個路徑是不存在資源的,所以報錯無法找到。
3. 改變靜態資源訪問首碼,定義為我們自己想要的
改變靜態資源訪問首碼,比如我們希望 http://locahost:8080/rainbowsea/* 下的請求路徑,去請求靜態資源,應用場景:靜態資源訪問首碼和控制器請求路徑衝突。
我們這裡需要用到 yaml
語法的內容,關於 yaml 語法想要瞭解的,大家可以移步至:✏️✏️✏️ 七,Spring Boot 當中的 yaml 語法使用-CSDN博客
首先,我們在 resources
類路徑下創建一個名為 application.yaml
的文件。
編寫如下內容:
spring:
mvc:
static-path-pattern: /rainbowsea/**
運行測試:
被我們改為了我們自己的
/rainbowsea/**
註意:後面的/**
不可以省略 。不然無法訪問的。
4. 改變Spring Boot當中的預設的靜態資源路徑(實現自定義靜態資源路徑)
Spring Boot 也是支持我們自定義靜態資源路徑,提高了靈活性。
改變預設的靜態資源路徑,比如:我們自己在類路徑下增加 test 目錄,作為靜態資源路徑,並完成測試。
同樣要想改變 Spring Boot 當中的預設靜態資源,這裡我們還是使用 yaml 語法進行。在 resources
類路徑下創建一個名為 application.yaml
的文件。
yaml 編寫如下:
spring:
web:
resources:
# 修改/指定 靜態資源的訪問路徑/位置
static-locations: ["classpath:/test/"] # 仿寫
# 註意:儘量在最左邊開始寫,才有更多的提示
在 resources 類路徑下,創建一個 test目錄,同時在該目錄下,放入一個名為 5.jpg
的圖片,訪問測試。
打開瀏覽器訪問測試:
本質上: static-locations修改的是 WebProperties類當中staticlocations屬性的值(也就是 springboot
的預設靜態路徑)。
所以這裡我們修改了 Spring Boot 的預設靜態資源路徑,之前的放置在Spring Boot 預設的靜態路徑下的資源就無法被訪問到了。
想要:保留原來Spring Boot 的預設靜態資源路徑,只需要把原來的Spring Boot 預設的路徑添加上就可以了。
運行測試:
5. 靜態資源訪問註意事項和細節
- 註意:直接放在 resources 類的根路徑下,是訪問不到的。因為我們從 WebProperties 類源碼上,就知道了,Spring Boot的預設靜態資源路徑,就只有四個,而 resources 類路徑是不屬於這四個當中的。
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = new String[]{"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"};
運行測試:我們在 resources 類路徑下,放入 6.jpg 圖片,試試,可不可以被直接訪問。
打開瀏覽器訪問測試:
- 當預設請求的路徑的資源的名字和 Controller 控制器請求處理的路徑一樣,衝突的時候。**優先看Controller能不能處理;不能,處理的請求交給靜態資源處理,如果靜態資源也找不到則相應點資源,則報:404找不到的,頁面。
靜態資源被訪問原理:靜態映射是 /** , 也就是對所有請求攔截,請求進來,先看Controller能不能處理,不能處理的請求交給靜態資源處理,如果靜態資源找不到則相應 404頁面
package com.rainbowsea.springboot.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController // @Controller + @ResponseBody
public class HiController {
@RequestMapping("1.jpg") // Controller 控制處理的請求的路徑和靜態資源的名字衝突
public String hi(){
return "hi";
}
}
6. 總結:
- 理解Spring Boot 靜態資源放在類路徑下: /static, /public, /resources, /META-INF/resources 就可以被直接訪問-對應文件(這是 Spring Boot 的預設設置好的 )。關於這一點,我們從 WebProperties.java 這個類的源碼上可以找到,對應的配置屬性。
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = new String[]{"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"};
註意:classpath:/resources/ 表示伺服器就會在 resources 路徑下找,你在瀏覽器當中輸入的url地址的時候,不可以輸入 resources 目錄,因為伺服器就是會在 classpath:/resources/ 找的,而如果你寫了resources在瀏覽器上的話,你想表達的就是:讓瀏覽器從resources/resouces的路徑下找,這是找不到的報404錯誤
- 訪問方式: 預設:項目根路徑/+靜態資源名 比如: http://localhost:8080/hi.html 。關於這一點,我們可以從 WebMvcProperties.java 類當中找到答案。
- 改變靜態資源訪問首碼,比如我們希望 http://locahost:8080/rainbowsea/* 下的請求路徑,去請求靜態資源,應用場景:靜態資源訪問首碼和控制器請求路徑衝突。
- 改變Spring Boot當中的預設的靜態資源路徑(實現自定義靜態資源路徑)。
- 註意:直接放在 resources 類的根路徑下,是訪問不到的。因為我們從 WebProperties 類源碼上,就知道了,Spring Boot的預設靜態資源路徑,就只有四個,而 resources 類路徑是不屬於這四個當中的。
7. 最後:
“在這個最後的篇章中,我要表達我對每一位讀者的感激之情。你們的關註和回覆是我創作的動力源泉,我從你們身上吸取了無盡的靈感與勇氣。我會將你們的鼓勵留在心底,繼續在其他的領域奮鬥。感謝你們,我們總會在某個時刻再次相遇。”