- Spring Boot+Vue全棧開發實戰
- 王松
- 820字
- 2020-06-30 17:14:46
4.2 靜態資源訪問
在Spring MVC中,對于靜態資源都需要開發者手動配置靜態資源過濾。Spring Boot中對此也提供了自動化配置,可以簡化靜態資源過濾配置。
4.2.1 默認策略
Spring Boot中對于Spring MVC的自動化配置都在WebMvcAutoConfiguration類中,因此對于默認的靜態資源過濾策略可以從這個類中一窺究竟。
在WebMvcAutoConfiguration類中有一個靜態內部類WebMvcAutoConfigurationAdapter,實現了4.1節提到的WebMvcConfigurer接口。WebMvcConfigurer接口中有一個方法addResourceHandlers,是用來配置靜態資源過濾的。方法在WebMvcAutoConfigurationAdapter類中得到了實現,部分核心代碼如下:

Spring Boot在這里進行了默認的靜態資源過濾配置,其中staticPathPattern默認定義在WebMvcProperties中,定義內容如下:

this.resourceProperties.getStaticLocations()獲取到的默認靜態資源位置定義在ResourceProperties中,代碼如下:

在getResourceLocations方法中,對這4個靜態資源位置做了擴充,代碼如下:

其中,SERVLET_LOCATIONS的定義是一個{ "/" }。
綜上可以看到,Spring Boot默認會過濾所有的靜態資源,而靜態資源的位置一共有5個,分別是"classpath:/META-INF/resources/"、"classpath:/resources/"、"classpath:/static/"、"classpath:/public/"以及"/",也就是說,開發者可以將靜態資源放到這5個位置中的任意一個。注意,按照定義的順序,5個靜態資源位置的優先級依次降低。但是一般情況下,Spring Boot項目不需要webapp目錄,所以第5個"/"可以暫不考慮。
在一個新創建的Spring Boot項目中,添加了spring-boot-starter-web依賴之后,在resources目錄下分別創建4個目錄,4個目錄中放入同名的靜態資源(如圖4-4所示,數字表示不同位置資源的優先級)。

圖4-4
此時,在瀏覽器中輸入“http://localhost:8080/p1.png”即可看到classpath:/META-INF/resources/目錄下的p1.png,如果將classpath:/META-INF/resources/目錄下的p1.png刪除,就會訪問到classpath:/resources/目錄下的p1.png,以此類推。
如果開發者使用IntelliJ IDEA創建Spring Boot項目,就會默認創建出classpath:/static/目錄,靜態資源一般放在這個目錄下即可。
4.2.2 自定義策略
如果默認的靜態資源過濾策略不能滿足開發需求,也可以自定義靜態資源過濾策略,自定義靜態資源過濾策略有以下兩種方式:
1. 在配置文件中定義
可以在application.properties中直接定義過濾規則和靜態資源位置,代碼如下:

過濾規則為/static/**,靜態資源位置為classpath:/static/。
重新啟動項目,在瀏覽器中輸入“http://localhost:8080/static/p1.png”,即可看到classpath:/static/目錄下的資源。
2. Java編碼定義
也可以通過Java編碼方式來定義,此時只需要實現WebMvcConfigurer接口即可,然后實現該接口的addResourceHandlers方法,代碼如下:

重新啟動項目,在瀏覽器中輸入“http://localhost:8080/static/p1.png”,即可看到classpath:/static/目錄下的資源。
- JavaScript修煉之道
- CockroachDB權威指南
- Rust實戰
- PyTorch自動駕駛視覺感知算法實戰
- Programming ArcGIS 10.1 with Python Cookbook
- C語言程序設計
- Unity 2018 Shaders and Effects Cookbook
- Vue.js 2 Web Development Projects
- PHP編程基礎與實踐教程
- 運維前線:一線運維專家的運維方法、技巧與實踐
- Zabbix Performance Tuning
- JavaScript+jQuery網頁特效設計任務驅動教程
- Mastering Elixir
- 算法設計與分析:基于C++編程語言的描述
- 零基礎C#學習筆記