Spring Boot中的靜態資源文件



部分內容原文地址:

江南一點雨:Spring Boot 中的靜態資源到底要放在哪裏?



1.SSM中的配置

通過 <mvc:resources /> 節點來配置不攔截靜態資源,如下:

<mvc:resources mapping="/js/**" location="/js/"/>
<mvc:resources mapping="/css/**" location="/css/"/>
<mvc:resources mapping="/html/**" location="/html/"/>

由於這是一種Ant風格的路徑匹配符,/** 表示可以匹配任意層級的路徑,因此上面的代碼也可以像下面這樣簡寫:

<mvc:resources mapping="/**" location="/"/>

這種配置是在 XML 中的配置,SpringMVC 的配置除了在XML中配置,也可以在 Java 代碼中配置,如果在Java代碼中配置的話,我們只需要自定義一個類,繼承自WebMvcConfigurationSupport即可:

@Configuration
@ComponentScan(basePackages = "org.sang.javassm")
public class SpringMVCConfig extends WebMvcConfigurationSupport {
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**").addResourceLocations("/");
    }
}

重寫 WebMvcConfigurationSupport 類中的addResourceHandlers方法,在該方法中配置靜態資源位置即可。

2.Spring Boot 中的配置

Spring Boot 項目,默認都會存在 resources/static 目錄。

2.1 整體規劃

在 Spring Boot 中,默認情況下,一共有5個位置可以放靜態資源,五個路徑分別是如下5個:

  1. classpath:/META-INF/resources/
  2. classpath:/resources/
  3. classpath:/static/
  4. classpath:/public/
  5. /

前四個目錄好理解,分別對應了resources目錄下不同的目錄,第5個 / 是啥意思呢?我們知道,在 Spring Boot 項目中,默認是沒有 webapp 這個目錄的,當然我們也可以自己添加(例如在需要使用JSP的時候),這裏第5個 / 其實就是表示 webapp 目錄中的靜態資源也不被攔截。如果同一個文件分別出現在五個目錄下,那麼優先級也是按照上面列出的順序。

不過,雖然有5個存儲目錄,除了第5個用的比較少之外,其他四個,系統默認創建了 classpath:/static/ , 正常情況下,我們只需要將我們的靜態資源放到這個目錄下即可,也不需要額外去創建其他靜態資源目錄,例如我在 classpath:/static/ 目錄下放了一張名爲1.png 的圖片,那麼我的訪問路徑是:

http://localhost:8080/1.png

請求地址中並不需要 static,如果加上了static反而多此一舉會報404錯誤。很多人會覺得奇怪,爲什麼不需要添加 static呢?資源明明放在 static 目錄下。其實這個效果很好實現,例如在SSM配置中,我們的靜態資源攔截配置如果是下面這樣:

<mvc:resources mapping="/**" location="/static/"/>

如果我們是這樣配置的話,請求地址如果是 http://localhost:8080/1.png 實際上系統會去 /static/1.png 目錄下查找相關的文件。

2.2 源碼解讀

在 WebMvcAutoConfiguration 類中看到了 SpringMVC 自動化配置的相關的內容,找到了靜態資源攔截的配置,如下:
在這裏插入圖片描述
可以看到這裏靜態資源的定義和我們前面提到的Java配置SSM中的配置非常相似,其中,this.mvcProperties.getStaticPathPattern() 方法對應的值是 “/**”,this.resourceProperties.getStaticLocations()方法返回了四個位置,分別是:”classpath:/META-INF/resources/“, “classpath:/resources/“,”classpath:/static/“, “classpath:/public/“,然後在getResourceLocations方法中,又添加了“/”,因此這裏返回值一共有5個。其中,/表示webapp目錄,即webapp中的靜態文件也可以直接訪問。靜態資源的匹配路徑按照定義路徑優先級依次降低。因此這裏的配置和我們前面提到的如出一轍。這樣大夥就知道了爲什麼Spring Boot 中支持5個靜態資源位置,同時也明白了爲什麼靜態資源請求路徑中不需要/static,因爲在路徑映射中已經自動的添加上了/static了。

2.3 自定義配置

當然,這個是系統默認配置,如果我們並不想將資源放在系統默認的這五個位置上,也可以自定義靜態資源位置和映射,自定義的方式也有兩種,可以通過 application.properties 來定義,也可以在 Java 代碼中來定義。

2.3.1 application.properties

在配置文件中定義的方式比較簡單,如下:

spring.resources.static-locations=classpath:/
spring.mvc.static-path-pattern=/**

第一行配置表示定義資源位置,第二行配置表示定義請求 URL 規則。以上文的配置爲例,如果我們這樣定義了,表示可以將靜態資源放在 resources目錄下的任意地方,我們訪問的時候當然也需要寫完整的路徑,例如在resources/static目錄下有一張名爲1.png 的圖片,那麼訪問路徑就是 http://localhost:8080/static/1.png ,注意此時的static不能省略。

2.3.2 Java代碼定義

在Spring Boot中我們也可以通過 Java代碼來自定義,方式和 Java 配置的 SSM 比較類似,如下:

@Configuration
public class WebMVCConfig implements WebMvcConfigurer {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**").addResourceLocations("classpath:/aaa/");
    }
}
發佈了399 篇原創文章 · 獲贊 225 · 訪問量 33萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章