SpringBoot中配置Web靜態資源路徑的方法
介紹: 本文章主要針對web專案中的兩個問題進行詳細解析介紹:1- 頁面跳轉404,即controller轉發無法跳轉頁面問題;2- 靜態資原始檔路徑問題。
專案工具: Intelij Idea,JDK1.8,SpringBoot 2.1.3
正文:
準備工作:通過Idea建立一個SpringBoot-web專案,此過程不做贅述,建立完成後專案結構如下圖:
1- 建立一個controller程式碼如下:
package com.example.webpractice.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class DemoController { @RequestMapping("demo") public String demo() { System.out.println("進入controller中的demo方法!"); /*注意:這裡返回值有後綴名,如何省略字尾名後面有介紹*/ return "myPage.html"; } }
2- 在 web-practice\src\main\resources\templates\路徑下建立html頁面,取名“myPage”,程式碼如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>Welcome to myPage!</h1> </body> </html>
此時執行專案,會發現報404問題,同時檢視Idea控制檯,列印顯示進入controller方法。
3- spring.resources.static-location登場
開啟application.yml檔案,進行如下配置(預設專案中配置檔案為application.properties,修改後綴名即可,因我個人喜歡使用yml檔案),重新執行專案並訪問地址:localhost:8080/demo 會發現頁面跳轉成功。
spring: resources: static-locations: classpath:templates/
原因分析:spring.resources.static-location引數指定了Spring Boot-web專案中靜態檔案存放地址,該引數預設設定為:classpath:/static,classpath:/public,classpath:/resources,classpath:/META-INF/resources,servlet context:/,可以發現這些地址中並沒有/templates這個地址。當配置檔案中配置此項後,預設配置失效,使用自定義設定。這裡涉及到兩個概念:
(1)classpath: 通俗來講classpath對應的專案中:web-practice\src\main\resources 檔案目錄。如:“classpath: templates/” 即是將resources目錄下的templates資料夾設定為靜態檔案目錄。更深一步講classpath路徑為:檔案編譯後在target/classes目錄下的檔案。
(2) 靜態檔案目錄:通俗理解為存放包括 :.html;.jsp;CSS;js;圖片;文字檔案等型別檔案的目錄。這些檔案都可以通過瀏覽器url進行訪問。同時controller中轉發的檔案目錄也必須被設定為靜態檔案目錄,這就是增加了該引數以後就可以正常訪問的原因。
4- spring.mvc.view.prefix/suffix登場
現在頁面已經可以正常轉發,我們有了新的想法,我希望在templates資料夾中建立一個html資料夾用於專門存放頁面檔案,另外在每次使用controller進行轉發是都要標明後綴名.html,這很麻煩,有沒有統一處理的方案,答案當然是有!
修改後專案結構如下:
controller方法修改如下:
package com.example.webpractice.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class DemoController { @RequestMapping("demo") public String demo() { System.out.println("進入controller中的demo方法!"); //如果不在appliation.yml檔案中新增前後綴資訊,此處返回語句為 //return "html/myPage.html" return "myPage"; } }
application.yml檔案修改如下:
spring: resources: static-locations: classpath:templates/ mvc: view: prefix: html/ suffix: .html
再次執行專案即可。通過測試得知prefix/suffix是在controller返回語句前後新增前後綴資訊。
5- 配置多個靜態檔案路徑:當我們在頁面中新增圖片,並且將圖片存放在resources/static/pic路徑下,如下圖所示:
修改myPage.html如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>Welcome to myPage!</h1> <img src="/pic/pig.jpg" height="1920" width="1080"/></body> </html>
之後重啟專案,會發現圖片並沒有成功載入!如下:
原因是之前我們配置的靜態檔案目錄只包含classpath:templates/,static目錄還不是合法的儲存靜態檔案目錄,我們只需要在後面追加上static目錄即可。修改application.yml檔案如下:
spring: resources: static-locations: classpath:templates/,classpath:static/ mvc: view: prefix: html/ suffix: .html
修改後重啟專案重新整理頁面,一切正常!
6- 關於spring.mvc.view.static-path-pattern
該引數用來規定訪問靜態檔案的路徑格式,該引數預設值為:“/**” 表示所有路徑,現將該引數修改為:“/static/**” 觀察現象
spring: resources: static-locations: classpath:templates/,classpath:static/ mvc: view: prefix: html/ suffix: .html static-path-pattern: /static/**
重啟專案,發現頁面不能載入404錯誤!
要解決該問題需要修改兩個地方:
(1) 修改spring.mvc.view.prefix引數值為:static/html/ ;該修改為了controller轉發時可以找到檔案路徑;
(2)修改myPage頁面的圖片地址如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>Welcome to myPage!</h1> <img src="/static/pic/pig.jpg" height="1920" width="1080"/></body> </html>
原因分析:static-path-pattern規定的時訪問靜態頁面的路徑型別,這裡規定訪問靜態頁面必須為:localhost:8080/static/***的方式才能訪問到靜態資源。static-path-pattern並不是規定實際的靜態檔案訪問路徑,而是規定了一種url標記,只有遵循該標記的規則才能訪問靜態檔案。
擴充套件:
1- spring.resources.static-locations引數除了規定classpath:路徑下的檔案目錄為靜態檔案目錄,還可以規定專案以外的位置,如設定:E:/test資料夾目錄為靜態檔案儲存目錄,如下:
spring: resources: static-locations: classpath:templates/,classpath:static/,file:E:/test
2- 頁面訪問過程如下:
瀏覽器傳送請求,先匹配SpringMVC中RequestMapping列表,匹配到後根據controller返回值定位靜態資源目錄,並返回給客戶;如果RequestMapping中未匹配到,則判斷是不是靜態檔案目錄,如果是的話直接到靜態檔案目錄對應路徑下查詢檔案,查詢到返回,未查詢到不返回。
3- static-location配置的目錄列表都被視為根目錄,如果兩個目錄中相同檔案目錄下儲存了同名同類型檔案,返回在static-locations配置靠前的根目錄下的內容。
4- static-path-pattern引數規定了靜態檔案儲存路徑,在controller的RequestMapping中應該避免設定該路徑相同的訪問路徑。
到此這篇關於SpringBoot中配置Web靜態資源路徑的方法的文章就介紹到這了,更多相關SpringBoot配置Web靜態資源路徑內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!