欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring Boot 中的靜態(tài)資源放置位置

 更新時間:2019年04月04日 09:34:42   作者:江南一點(diǎn)雨  
這篇文章主要介紹了Spring Boot 中的靜態(tài)資源到底要存放哪里,很多童鞋對這個問題很糾結(jié),接下來通過本文給大家介紹下,需要的朋友可以參考下

當(dāng)我們使用 SpringMVC 框架時,靜態(tài)資源會被攔截,需要添加額外配置,之前老有小伙伴在微信上問松哥Spring Boot 中的靜態(tài)資源加載問題:“松哥,我的HTML頁面好像沒有樣式?”,今天我就通過一篇文章,來和大伙仔細(xì)聊一聊這個問題。

SSM 中的配置

要講 Spring Boot 中的問題,我們得先回到 SSM 環(huán)境搭建中,一般來說,我們可以通過 <mvc:resources /> 節(jié)點(diǎn)來配置不攔截靜態(tài)資源,如下:

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

由于這是一種Ant風(fēng)格的路徑匹配符,/** 表示可以匹配任意層級的路徑,因此上面的代碼也可以像下面這樣簡寫:
<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方法,在該方法中配置靜態(tài)資源位置即可,這里的含義和上面 xml 配置的含義一致,因此無需多說。

 這是我們傳統(tǒng)的解決方案,在Spring Boot 中,其實(shí)配置方式和這個一脈相承,只是有一些自動化的配置了。

Spring Boot 中的配置

在 Spring Boot 中,如果我們是從 https://start.spring.io 這個網(wǎng)站上創(chuàng)建的項目,或者使用 IntelliJ IDEA 中的 Spring Boot 初始化工具創(chuàng)建的項目,默認(rèn)都會存在 resources/static 目錄,很多小伙伴也知道靜態(tài)資源只要放到這個目錄下,就可以直接訪問,除了這里還有沒有其他可以放靜態(tài)資源的位置呢?為什么放在這里就能直接訪問了呢?這就是本文要討論的問題了。

整體規(guī)劃

首先,在 Spring Boot 中,默認(rèn)情況下,一共有5個位置可以放靜態(tài)資源,五個路徑分別是如下5個:

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

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

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

http://localhost:8080/1.png 

這里大家注意,請求地址中并不需要 static,如果加上了static反而多此一舉會報404錯誤。很多人會覺得奇怪,為什么不需要添加 static呢?資源明明放在 static 目錄下。其實(shí)這個效果很好實(shí)現(xiàn),例如在SSM配置中,我們的靜態(tài)資源攔截配置如果是下面這樣:

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

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

所以我們理所當(dāng)然的猜測,在 Spring Boot 中可能也是類似的配置。

源碼解讀

胡適之先生說:“大膽猜想,小心求證”,我們這里就通過源碼解讀來看看 Spring Boot 中的靜態(tài)資源到底是怎么配置的。

首先我們在 WebMvcAutoConfiguration 類中看到了 SpringMVC 自動化配置的相關(guān)的內(nèi)容,找到了靜態(tài)資源攔截的配置,如下:

可以看到這里靜態(tài)資源的定義和我們前面提到的Java配置SSM中的配置非常相似,其中,this.mvcProperties.getStaticPathPattern() 方法對應(yīng)的值是 “/**”,this.resourceProperties.getStaticLocations()方法返回了四個位置,分別是:"classpath:/META-INF/resources/", "classpath:/resources/","classpath:/static/", "classpath:/public/",然后在getResourceLocations方法中,又添加了“/”,因此這里返回值一共有5個。其中,/表示webapp目錄,即webapp中的靜態(tài)文件也可以直接訪問。靜態(tài)資源的匹配路徑按照定義路徑優(yōu)先級依次降低。因此這里的配置和我們前面提到的如出一轍。這樣大伙就知道了為什么Spring Boot 中支持5個靜態(tài)資源位置,同時也明白了為什么靜態(tài)資源請求路徑中不需要/static,因?yàn)樵诼窂接成渲幸呀?jīng)自動的添加上了/static了。

自定義配置

當(dāng)然,這個是系統(tǒng)默認(rèn)配置,如果我們并不想將資源放在系統(tǒng)默認(rèn)的這五個位置上,也可以自定義靜態(tài)資源位置和映射,自定義的方式也有兩種,可以通過 application.properties 來定義,也可以在 Java 代碼中來定義,下面分別來看。

application.properties

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

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

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

Java 代碼定義

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

@Configuration
public class WebMVCConfig implements WebMvcConfigurer {
  @Override
  public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/**").addResourceLocations("classpath:/aaa/");
  }
}

這里代碼基本和前面一致,比較簡單,不再贅述。

總結(jié)

這里需要提醒大家的是,松哥見到有很多人用了 Thymeleaf 之后,會將靜態(tài)資源也放在 resources/templates 目錄下,注意,templates 目錄并不是靜態(tài)資源目錄,它是一個放頁面模板的位置(你看到的 Thymeleaf 模板雖然后綴為 .html,其實(shí)并不是靜態(tài)資源)。好了,通過上面的講解,相信大家對 Spring Boot 中靜態(tài)資源的位置有一個深刻了解了,應(yīng)該不會再在項目中出錯了吧!

相關(guān)文章

  • Java?-jar參數(shù)設(shè)置小結(jié)

    Java?-jar參數(shù)設(shè)置小結(jié)

    本文主要介紹了Java?-jar參數(shù)設(shè)置小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • 深入理解java中Arrays.sort()的用法

    深入理解java中Arrays.sort()的用法

    這篇文章主要介紹了深入理解java中Arrays.sort()的用法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • 使用Spring Security OAuth2實(shí)現(xiàn)單點(diǎn)登錄

    使用Spring Security OAuth2實(shí)現(xiàn)單點(diǎn)登錄

    在本教程中,我們將討論如何使用Spring Security OAuth和Spring Boot實(shí)現(xiàn)SSO - 單點(diǎn)登錄。感興趣的朋友跟隨小編一起看看吧
    2019-06-06
  • Java中的RASP機(jī)制實(shí)現(xiàn)詳解

    Java中的RASP機(jī)制實(shí)現(xiàn)詳解

    這篇文章主要介紹了Java中的RASP實(shí)現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08
  • Java編程之繼承問題代碼示例

    Java編程之繼承問題代碼示例

    這篇文章主要介紹了Java編程之繼承問題代碼示例,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • 詳細(xì)分析Java內(nèi)存模型

    詳細(xì)分析Java內(nèi)存模型

    Java虛擬機(jī)規(guī)范中定義了Java內(nèi)存模型(Java Memory Model,JMM),用于屏蔽掉各種硬件和操作系統(tǒng)的內(nèi)存訪問差異,以實(shí)現(xiàn)讓Java程序在各種平臺下都能達(dá)到一致的并發(fā)效果,JMM規(guī)范了Java虛擬機(jī)與計算機(jī)內(nèi)存是如何協(xié)同工作的,以及在必須時如何同步的訪問共享變量
    2021-06-06
  • 利用Spring Boot如何開發(fā)REST服務(wù)詳解

    利用Spring Boot如何開發(fā)REST服務(wù)詳解

    這篇文章主要給大家介紹了關(guān)于利用Spring Boot如何開發(fā)REST服務(wù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12
  • Java實(shí)現(xiàn)5種負(fù)載均衡算法(小結(jié))

    Java實(shí)現(xiàn)5種負(fù)載均衡算法(小結(jié))

    負(fù)載均衡是將客戶端請求訪問,通過提前約定好的規(guī)則轉(zhuǎn)發(fā)給各個server,本文主要介紹了Java實(shí)現(xiàn)5種負(fù)載均衡算法,具有一定的參考價值,感興趣的可以了解一下
    2022-06-06
  • 詳解SpringBoot配置devtools實(shí)現(xiàn)熱部署

    詳解SpringBoot配置devtools實(shí)現(xiàn)熱部署

    本篇文章主要介紹了詳解SpringBoot配置devtools實(shí)現(xiàn)熱部署 ,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • java求余的技巧匯總

    java求余的技巧匯總

    這篇文章主要給大家介紹了關(guān)于java求余技巧的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09

最新評論