天天看點

SpringBoot WEB開發

靜态資源導入、首頁設定、總結

本節了解一下 SpringBoot 中 Web 開發的靜态資源導入和首頁設定,對應 SpringBoot-03-Web 項目。

在 Web 開發過程中,我們需要接觸許多的靜态資源,如 CSS、JS、圖檔等;在之前的開發過程中,這些資源都放在 Web 的目錄下,用到的時候按照對應路徑通路即可。不過在 SpringBoot 項目中,沒有了 Web 的目錄,那這些靜态資源該放到哪裡去,又要如何通路呢?

由于是 Web 應用中的配置,是以檢視對應的自動配置類 <code>WebMvcAutoConfiguration</code>,可以看到處理資源的方法 <code>addResourceHandlers</code>

其中,<code>this.resourceProperties.isAddMappings()</code> 的作用為判斷是否在配置檔案中指定了資源的通路路徑,若指定了則此方法不用生效,直接傳回;若未指定則繼續執行方法,去預設的位置查找資源。

WebJars 是前端資源的 Jar 包形式,讓我們可以通過 Jar 包的形式使用前端的架構、元件。

WebJars 網站:https://www.webjars.org/ 。

為什麼要使用 WebJars? 我們在開發 Java web 項目的時候會使用像 Maven,Gradle 等建構工具以實作對 jar 包版本依賴管理,以及項目的自動化管理,但是對于 JS,Css 等前端資源包,我們隻能采用拷貝到 webapp 目錄下的手工方式,這樣做就無法對這些資源進行依賴管理,而且容易導緻檔案混亂、版本不一緻等問題。WebJars 就提供給我們這些前端資源的 jar 包形式,我們就可以進行依賴管理。

如要使用到 JQuery 時,按照之前的做法,我們要去網上下載下傳 JQuery 的 JS 檔案,把它放到 web 目錄下的 statics/js 下(之前用 AJAX 的時候就是這麼幹的);但現在,我們可以采用 WebJars 的方式。

首先在 WebJars 網站中找到 JQuery 的 Maven 坐标,把它放到項目的 pom 檔案中

引入後,在項目的 External Libaries 中就可以看到 org.webjars:jquery:3.6.0 了!

SpringBoot WEB開發

那麼我們要怎麼通路到它呢?在上面的源碼中其實就已經給出了路徑

這行代碼将 <code>/webjars/</code> 下的所有通路都映射為了 <code>classpath:/META-INF/resources/webjars/</code>,即我們隻需要通過 <code>/webjars/</code> 就可以找到類路徑下的 <code>/jquery/3.6.0/jquery.js</code> 檔案了!

運作項目,在浏覽器中輸入 <code>http://localhost:8080/webjars/jquery/3.6.0/jquery.js</code>,确實顯示出了 jquery.js 檔案!

以 WebJars 方式引入的檔案,都符合上圖中的結構,即能通過 <code>classpath:/META-INF/resources/webjars/</code> 路徑通路到,這樣代碼中的設定和外部檔案就聯系起來了!

回到源碼中,這個方法的三句話還有最後一句(雖然很長但确實是一句)

這就有點複雜了(之前版本的源碼倒還好了解一點),不過可以看到擷取靜态路徑 <code>getStaticPathPattern()</code> 方法,點進去

這個方法直接傳回了 <code>staticPathPattern</code>,繼續點

到這就明白了,其實就是預設的靜态資源路徑!這個路徑也可以通過 spring.mvc 去設定,在未設定的情況在,它就是項目下的所有路徑 <code>/**</code>!

然後在 Web 屬性類 WebProperties 中有一個資源類 <code>Resource</code>,它也設定了4個路徑(跳躍的有點大,先看着吧),其中

<code>classpath:/META-INF/resources/</code> 即上面的 WebJars 路徑

<code>classpath:/resources/</code> 即 <code>resources/resources/</code> 路徑

<code>classpath:/static/</code> 為 <code>resources/static/</code> 路徑

<code>classpath:/public/</code> 為 <code>resources/public</code> 路徑

即所有通過 <code>/**</code>(未配置情況下)的通路請求,都會在這四個路徑中尋找靜态資源!

預設的 resource 中隻有 static 一個目錄,這裡把上面的目錄都建立一下,且放入一個測試用的 js 檔案

SpringBoot WEB開發

此時運作項目,通路 <code>http://localhost:8080/public.js</code>、<code>http://localhost:8080/resources.js</code>、<code>http://localhost:8080/static.js</code>,都可以顯示出對應的 js 檔案内容!

注意:如果三個目錄下的檔案有重名的情況,則優先級為 <code>CLASSPATH_RESOURCE_LOCATIONS</code> 數組的順序,可以了解為如果在前面的路徑中找到了就不找後面的了!

和上面一樣,先找到對應的源碼

很長也很複雜,不過隻需要關注裡面的 <code>getWelcomePage()</code> 方法,點進去看看

這三個方法是逐層調用的關系(雖然我也不知道為什麼要這麼幹),不過可以知道,其中的 <code>location</code> 就是上面的三個目錄 <code>resources</code>、<code>static</code>、<code>public</code>,預設的首頁是 <code>index.html</code>。也就是說,如果這三個目錄下存在 <code>index.html</code> 檔案,那麼它就是預設的首頁!示範就省略了,反正也不是什麼難點!

本節主要是從源碼的角度,研究了一下靜态資源導入和首頁設定的問題。其實學習結論很簡單,但從源碼出發思考問題的思想,是不容易學習的????。

繼續閱讀