溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

SpringBoot中實(shí)現(xiàn)配置Web靜態(tài)資源路徑的方法

發(fā)布時(shí)間:2020-11-03 15:56:48 來(lái)源:億速云 閱讀:245 作者:Leah 欄目:開(kāi)發(fā)技術(shù)

SpringBoot中實(shí)現(xiàn)配置Web靜態(tài)資源路徑的方法?相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。

正文:

準(zhǔn)備工作:通過(guò)Idea創(chuàng)建一個(gè)SpringBoot-web項(xiàng)目,此過(guò)程不做贅述,創(chuàng)建完成后項(xiàng)目結(jié)構(gòu)如下圖:

SpringBoot中實(shí)現(xiàn)配置Web靜態(tài)資源路徑的方法

1- 創(chuàng)建一個(gè)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("進(jìn)入controller中的demo方法!");
    /*注意:這里返回值有后綴名,如何省略后綴名后面有介紹*/
    return "myPage.html";
  }
}

2- 在 web-practice\src\main\resources\templates\路徑下創(chuàng)建html頁(yè)面,取名“myPage”,代碼如下:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
  <h2>Welcome to myPage!</h2>
</body>
</html>

此時(shí)運(yùn)行項(xiàng)目,會(huì)發(fā)現(xiàn)報(bào)404問(wèn)題,同時(shí)查看Idea控制臺(tái),打印顯示進(jìn)入controller方法。

SpringBoot中實(shí)現(xiàn)配置Web靜態(tài)資源路徑的方法

3- spring.resources.static-location登場(chǎng)

打開(kāi)application.yml文件,進(jìn)行如下配置(默認(rèn)項(xiàng)目中配置文件為application.properties,修改后綴名即可,因我個(gè)人喜歡使用yml文件),重新運(yùn)行項(xiàng)目并訪問(wèn)地址:localhost:8080/demo 會(huì)發(fā)現(xiàn)頁(yè)面跳轉(zhuǎn)成功。

spring:
 resources:
  static-locations: classpath:templates/

原因分析:spring.resources.static-location參數(shù)指定了Spring Boot-web項(xiàng)目中靜態(tài)文件存放地址,該參數(shù)默認(rèn)設(shè)置為:classpath:/static,classpath:/public,classpath:/resources,classpath:/META-INF/resources,servlet context:/,可以發(fā)現(xiàn)這些地址中并沒(méi)有/templates這個(gè)地址。當(dāng)配置文件中配置此項(xiàng)后,默認(rèn)配置失效,使用自定義設(shè)置。這里涉及到兩個(gè)概念:

(1)classpath:  通俗來(lái)講classpath對(duì)應(yīng)的項(xiàng)目中:web-practice\src\main\resources 文件目錄。如:“classpath: templates/” 即是將resources目錄下的templates文件夾設(shè)置為靜態(tài)文件目錄。更深一步講classpath路徑為:文件編譯后在target/classes目錄下的文件。

(2) 靜態(tài)文件目錄:通俗理解為存放包括 :.html;.jsp;CSS;js;圖片;文本文件等類型文件的目錄。這些文件都可以通過(guò)瀏覽器url進(jìn)行訪問(wèn)。同時(shí)controller中轉(zhuǎn)發(fā)的文件目錄也必須被設(shè)置為靜態(tài)文件目錄,這就是增加了該參數(shù)以后就可以正常訪問(wèn)的原因。

4-  spring.mvc.view.prefix/suffix登場(chǎng) 

現(xiàn)在頁(yè)面已經(jīng)可以正常轉(zhuǎn)發(fā),我們有了新的想法,我希望在templates文件夾中創(chuàng)建一個(gè)html文件夾用于專門(mén)存放頁(yè)面文件,另外在每次使用controller進(jìn)行轉(zhuǎn)發(fā)是都要標(biāo)明后綴名.html,這很麻煩,有沒(méi)有統(tǒng)一處理的方案,答案當(dāng)然是有!

修改后項(xiàng)目結(jié)構(gòu)如下:

SpringBoot中實(shí)現(xiàn)配置Web靜態(tài)資源路徑的方法

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("進(jìn)入controller中的demo方法!");
    //如果不在appliation.yml文件中添加前后綴信息,此處返回語(yǔ)句為
    //return "html/myPage.html"
    return "myPage";
  }
}

application.yml文件修改如下:

spring:
 resources:
  static-locations: classpath:templates/
 mvc:
  view:
   prefix: html/
   suffix: .html

 再次運(yùn)行項(xiàng)目即可。通過(guò)測(cè)試得知prefix/suffix是在controller返回語(yǔ)句前后添加前后綴信息。

5- 配置多個(gè)靜態(tài)文件路徑:當(dāng)我們?cè)陧?yè)面中添加圖片,并且將圖片存放在resources/static/pic路徑下,如下圖所示:

SpringBoot中實(shí)現(xiàn)配置Web靜態(tài)資源路徑的方法

修改myPage.html如下:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
  <h2>Welcome to myPage!</h2>
  <img src="/pic/pig.jpg" height="1920" width="1080"/></body>
</html>

 之后重啟項(xiàng)目,會(huì)發(fā)現(xiàn)圖片并沒(méi)有成功加載!如下:

SpringBoot中實(shí)現(xiàn)配置Web靜態(tài)資源路徑的方法

原因是之前我們配置的靜態(tài)文件目錄只包含classpath:templates/,static目錄還不是合法的存儲(chǔ)靜態(tài)文件目錄,我們只需要在后面追加上static目錄即可。修改application.yml文件如下:

spring:
 resources:
  static-locations: classpath:templates/,classpath:static/
 mvc:
  view:
   prefix: html/
   suffix: .html

修改后重啟項(xiàng)目刷新頁(yè)面,一切正常!

6- 關(guān)于spring.mvc.view.static-path-pattern

該參數(shù)用來(lái)規(guī)定訪問(wèn)靜態(tài)文件的路徑格式,該參數(shù)默認(rèn)值為:“/**” 表示所有路徑,現(xiàn)將該參數(shù)修改為:“/static/**” 觀察現(xiàn)象

spring:
 resources:
  static-locations: classpath:templates/,classpath:static/
 mvc:
  view:
   prefix: html/
   suffix: .html
  static-path-pattern: /static/**

重啟項(xiàng)目,發(fā)現(xiàn)頁(yè)面不能加載404錯(cuò)誤!

要解決該問(wèn)題需要修改兩個(gè)地方:

(1) 修改spring.mvc.view.prefix參數(shù)值為:static/html/  ;該修改為了controller轉(zhuǎn)發(fā)時(shí)可以找到文件路徑;

(2)修改myPage頁(yè)面的圖片地址如下:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
  <h2>Welcome to myPage!</h2>
  <img src="/static/pic/pig.jpg" height="1920" width="1080"/></body>
</html>

原因分析:static-path-pattern規(guī)定的時(shí)訪問(wèn)靜態(tài)頁(yè)面的路徑類型,這里規(guī)定訪問(wèn)靜態(tài)頁(yè)面必須為:localhost:8080/static/***的方式才能訪問(wèn)到靜態(tài)資源。static-path-pattern并不是規(guī)定實(shí)際的靜態(tài)文件訪問(wèn)路徑,而是規(guī)定了一種url標(biāo)記,只有遵循該標(biāo)記的規(guī)則才能訪問(wèn)靜態(tài)文件。

擴(kuò)展:

1- spring.resources.static-locations參數(shù)除了規(guī)定classpath:路徑下的文件目錄為靜態(tài)文件目錄,還可以規(guī)定項(xiàng)目以外的位置,如設(shè)置:E:/test文件夾目錄為靜態(tài)文件存儲(chǔ)目錄,如下:

spring:
 resources:
  static-locations: classpath:templates/,classpath:static/,file:E:/test

2- 頁(yè)面訪問(wèn)過(guò)程如下:

瀏覽器發(fā)送請(qǐng)求,先匹配SpringMVC中RequestMapping列表,匹配到后根據(jù)controller返回值定位靜態(tài)資源目錄,并返回給客戶;如果RequestMapping中未匹配到,則判斷是不是靜態(tài)文件目錄,如果是的話直接到靜態(tài)文件目錄對(duì)應(yīng)路徑下查詢文件,查詢到返回,未查詢到不返回。

3- static-location配置的目錄列表都被視為根目錄,如果兩個(gè)目錄中相同文件目錄下存儲(chǔ)了同名同類型文件,返回在static-locations配置靠前的根目錄下的內(nèi)容。

4- static-path-pattern參數(shù)規(guī)定了靜態(tài)文件存儲(chǔ)路徑,在controller的RequestMapping中應(yīng)該避免設(shè)置該路徑相同的訪問(wèn)路徑。

看完上述內(nèi)容,你們掌握SpringBoot中實(shí)現(xiàn)配置Web靜態(tài)資源路徑的方法的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI