官术网_书友最值得收藏!

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/目錄下的資源。

主站蜘蛛池模板: 名山县| 浦县| 光泽县| 水城县| 铁岭县| 水富县| 武威市| 铜陵市| 三原县| 邢台市| 岢岚县| 黎城县| 浦江县| 桑植县| 石阡县| 昂仁县| 平塘县| 县级市| 元氏县| 宜章县| 苍山县| 正阳县| 横山县| 绥江县| 威信县| 东丽区| 宁强县| 黄山市| 石林| 灵武市| 梅州市| 永新县| 平顶山市| 罗源县| 江源县| 治多县| 阳朔县| 宜春市| 万山特区| 临泉县| 阿拉善右旗|