八,SpringBoot Web 開發訪問靜態資源(附+詳細源碼剖析)

来源:https://www.cnblogs.com/TheMagicalRainbowSea/p/18402909
-Advertisement-
Play Games

八,SpringBoot Web 開發訪問靜態資源(附+詳細源碼剖析) @目錄八,SpringBoot Web 開發訪問靜態資源(附+詳細源碼剖析)1. 基本介紹2. 快速入門2.1 準備工作3. 改變靜態資源訪問首碼,定義為我們自己想要的4. 改變Spring Boot當中的預設的靜態資源路徑(實 ...


八,SpringBoot Web 開發訪問靜態資源(附+詳細源碼剖析)

@

目錄


1. 基本介紹

SpringBoot 中對於靜態資源的訪問:

  1. 只要將靜態資源放在類路徑下: /static, /public, /resources, /META-INF/resources 就可以被直接訪問-對應文件(這是 Spring Boot 的預設設置好的 )。關於這一點,我們從 WebProperties.java 這個類的源碼上可以找到,對應的配置屬性。

在這裡插入圖片描述

private static final String[] CLASSPATH_RESOURCE_LOCATIONS = new String[]{"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"};
註意:classpath:/resources/ 表示伺服器就會在 resources 路徑下找,你在瀏覽器當中輸入的url地址的時候,不可以輸入 resources 目錄,因為伺服器就是會在 classpath:/resources/ 找的,而如果你寫了resources在瀏覽器上的話,你想表達的就是:讓瀏覽器從resources/resouces的路徑下找,這是找不到的報404錯誤

註意:classpath:/resources/ 表示伺服器就會在 resources路徑下找,你在瀏覽器當中輸入的url地址的時候,不可以輸入 resources 目錄,因為伺服器就是會在 classpath:/resources/ 找的,而如果你寫了resources 在瀏覽器上的話,你想表達的就是:讓瀏覽器從resources/resouces的路徑下找,這是找不到的報404錯誤

  1. 常見靜態資源: js,css,圖片(.jpg,.png,.gif,.bmp,.svg) ,字體文件(Fonts)等
  2. 訪問方式: 預設:項目根路徑/+靜態資源名 比如: http://localhost:8080/hi.html 。關於這一點,我們可以從 WebMvcProperties.java 類當中找到答案。

在這裡插入圖片描述

2. 快速入門

2.1 準備工作

在 pom .xml 文件中導入相關的 jar 依賴。如下

在這裡插入圖片描述

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.rainbowsea</groupId>
    <artifactId>springboot_static_configuration</artifactId>
    <version>1.0-SNAPSHOT</version>


    <!--    導入SpringBoot 父工程-規定寫法-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.3</version>
    </parent>

    <!--    導入web項目場景啟動器:會自動導入和web開發相關的jar包所有依賴【庫/jar】-->
    <!--    後面還會在說明spring-boot-starter-web 到底引入哪些相關依賴-->
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

</project>

編寫啟動程式:

在這裡插入圖片描述

package com.rainbowsea.springboot;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication  // 標誌啟動場景
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class,args);
    }
}


從上面的基本介紹 當中,我們知道了,Spring Boot 預設靜態資源的訪問路徑有4 個,我們這裡就測試這四個路徑是否可以直接訪問

private static final String[] CLASSPATH_RESOURCE_LOCATIONS = new String[]{"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"};

註意:classpath 表示的是類路徑,就是如圖下麵的: resources 目錄,簡單的說就是 classpath ===(等同於)resources

在這裡插入圖片描述

下麵:我們分別在 resources 類路徑下,創建對應的Spring Boot 預設的四個目錄。如下圖:
在這裡插入圖片描述

同時我們在這四個目錄下,放入幾張圖片,用於訪問測試。

在這裡插入圖片描述

啟動程式運行測試:

在這裡插入圖片描述

打開瀏覽器進行直接訪問靜態資源文件:

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

註意:

private static final String[] CLASSPATH_RESOURCE_LOCATIONS = new String[]{"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"};
註意:classpath:/resources/ 表示伺服器就會在 resources 路徑下找,你在瀏覽器當中輸入的url地址的時候,不可以輸入 resources 目錄,因為伺服器就是會在 classpath:/resources/ 找的,而如果你寫了resources在瀏覽器上的話,你想表達的就是:讓瀏覽器從resources/resouces的路徑下找,這是找不到的報404錯誤

在這裡插入圖片描述

resources/static 是Spring Bopt的預設靜態路徑,預設就是以“resources/static” 作為根路徑訪問的,所以,不需要再額外的加上 static 在瀏覽器上,如果你加了,那麼你實際訪問的是:resources/static/static這個路徑,這個路徑是不存在資源的,所以報錯無法找到。

3. 改變靜態資源訪問首碼,定義為我們自己想要的

改變靜態資源訪問首碼,比如我們希望 http://locahost:8080/rainbowsea/* 下的請求路徑,去請求靜態資源,應用場景:靜態資源訪問首碼和控制器請求路徑衝突。

我們這裡需要用到 yaml 語法的內容,關於 yaml 語法想要瞭解的,大家可以移步至:✏️✏️✏️ 七,Spring Boot 當中的 yaml 語法使用-CSDN博客

首先,我們在 resources 類路徑下創建一個名為 application.yaml 的文件。

在這裡插入圖片描述

編寫如下內容:

在這裡插入圖片描述

spring:
  mvc:
    static-path-pattern: /rainbowsea/**


運行測試:

在這裡插入圖片描述

被我們改為了我們自己的 /rainbowsea/** 註意:後面的 /** 不可以省略 。不然無法訪問的。

在這裡插入圖片描述


4. 改變Spring Boot當中的預設的靜態資源路徑(實現自定義靜態資源路徑)

Spring Boot 也是支持我們自定義靜態資源路徑,提高了靈活性。

改變預設的靜態資源路徑,比如:我們自己在類路徑下增加 test 目錄,作為靜態資源路徑,並完成測試。

同樣要想改變 Spring Boot 當中的預設靜態資源,這裡我們還是使用 yaml 語法進行。在 resources 類路徑下創建一個名為 application.yaml 的文件。

yaml 編寫如下:

在這裡插入圖片描述

spring:
  web:
    resources:
      # 修改/指定 靜態資源的訪問路徑/位置
      static-locations: ["classpath:/test/"] # 仿寫
# 註意:儘量在最左邊開始寫,才有更多的提示

在這裡插入圖片描述

在 resources 類路徑下,創建一個 test目錄,同時在該目錄下,放入一個名為 5.jpg 的圖片,訪問測試。

在這裡插入圖片描述

打開瀏覽器訪問測試:

在這裡插入圖片描述

本質上: static-locations修改的是 WebProperties類當中staticlocations屬性的值(也就是 springboot

的預設靜態路徑)。

所以這裡我們修改了 Spring Boot 的預設靜態資源路徑,之前的放置在Spring Boot 預設的靜態路徑下的資源就無法被訪問到了。

在這裡插入圖片描述

想要:保留原來Spring Boot 的預設靜態資源路徑,只需要把原來的Spring Boot 預設的路徑添加上就可以了。

在這裡插入圖片描述

運行測試:

在這裡插入圖片描述

5. 靜態資源訪問註意事項和細節

  1. 註意:直接放在 resources 類的根路徑下,是訪問不到的。因為我們從 WebProperties 類源碼上,就知道了,Spring Boot的預設靜態資源路徑,就只有四個,而 resources 類路徑是不屬於這四個當中的。
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = new String[]{"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"};

運行測試:我們在 resources 類路徑下,放入 6.jpg 圖片,試試,可不可以被直接訪問。

在這裡插入圖片描述

打開瀏覽器訪問測試:

在這裡插入圖片描述

  1. 當預設請求的路徑的資源的名字和 Controller 控制器請求處理的路徑一樣,衝突的時候。**優先看Controller能不能處理;不能,處理的請求交給靜態資源處理,如果靜態資源也找不到則相應點資源,則報:404找不到的,頁面。

靜態資源被訪問原理:靜態映射是 /** , 也就是對所有請求攔截,請求進來,先看Controller能不能處理,不能處理的請求交給靜態資源處理,如果靜態資源找不到則相應 404頁面

在這裡插入圖片描述

在這裡插入圖片描述

package com.rainbowsea.springboot.controller;


import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController // @Controller + @ResponseBody
public class HiController {

    @RequestMapping("1.jpg")  // Controller 控制處理的請求的路徑和靜態資源的名字衝突
    public String hi(){
        return "hi";
    }
}

在這裡插入圖片描述


6. 總結:

  1. 理解Spring Boot 靜態資源放在類路徑下: /static, /public, /resources, /META-INF/resources 就可以被直接訪問-對應文件(這是 Spring Boot 的預設設置好的 )。關於這一點,我們從 WebProperties.java 這個類的源碼上可以找到,對應的配置屬性。
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = new String[]{"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"};
註意:classpath:/resources/ 表示伺服器就會在 resources 路徑下找,你在瀏覽器當中輸入的url地址的時候,不可以輸入 resources 目錄,因為伺服器就是會在 classpath:/resources/ 找的,而如果你寫了resources在瀏覽器上的話,你想表達的就是:讓瀏覽器從resources/resouces的路徑下找,這是找不到的報404錯誤
  1. 訪問方式: 預設:項目根路徑/+靜態資源名 比如: http://localhost:8080/hi.html 。關於這一點,我們可以從 WebMvcProperties.java 類當中找到答案。
  2. 改變靜態資源訪問首碼,比如我們希望 http://locahost:8080/rainbowsea/* 下的請求路徑,去請求靜態資源,應用場景:靜態資源訪問首碼和控制器請求路徑衝突。

在這裡插入圖片描述

  1. 改變Spring Boot當中的預設的靜態資源路徑(實現自定義靜態資源路徑)。

在這裡插入圖片描述

  1. 註意:直接放在 resources 類的根路徑下,是訪問不到的。因為我們從 WebProperties 類源碼上,就知道了,Spring Boot的預設靜態資源路徑,就只有四個,而 resources 類路徑是不屬於這四個當中的。

7. 最後:

“在這個最後的篇章中,我要表達我對每一位讀者的感激之情。你們的關註和回覆是我創作的動力源泉,我從你們身上吸取了無盡的靈感與勇氣。我會將你們的鼓勵留在心底,繼續在其他的領域奮鬥。感謝你們,我們總會在某個時刻再次相遇。”

在這裡插入圖片描述


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 預設配置,應用配置到可擴展配置 。 配置文件的體現方式是 XML 文件或者是 Properties 文 件 。現在 springboot 框架的配置框架數據參數的提現方式是 yml 文件和註解參數 。配置文 件是應用程式參數化解耦的一種方式。程式員項目組開發好應用程式的框架之後,遺留下來 的項目參數 ...
  • leetCode刷題筆記(9.2-9.9) 48.旋轉圖像(9.3) 1)圖像即二維數組,圖像的旋轉本質上是二維數組的旋轉變換 2)二維數組從外層來看,是若幹個子數組的集合,子數組內部維護各自的元素,即若幹個row里是row.length個column 3)由此可理解下麵幾個關於二維數組的函數: 創 ...
  • 跨平臺系列 cross-plateform 跨平臺應用程式-01-概覽 cross-plateform 跨平臺應用程式-02-有哪些主流技術棧? cross-plateform 跨平臺應用程式-03-如果只選擇一個框架,應該選擇哪一個? cross-plateform 跨平臺應用程式-04-Reac ...
  • 日常使用的移動手機或者是電腦等其它電子產品都是每天在產生不同的數據。數據安全性的 保證需要有很多的電腦程式設計的運行程式進行有效保證。電子產品是硬體設備,硬體設 備就像機器機械一樣是可以看得見摸得著的具體物件設施。物質和能量,源頭物料可以通過 不同的設計工廠設計師加工進行生產設計,開發形成不同的可 ...
  • Django 一、Django介紹 1.1 簡介 Django是python語言中的一個web框架,Python語言中主流的web框架有Django、Tornado、Flask 等多種。Django相較與其它WEB框架,其優勢為:大而全,框架本身集成了ORM、模型綁定、模板引擎、緩存、Session ...
  • 數據傳輸的過程首先要建立網路連接 。數據傳輸單元為數據包 DATA PRAGRAM. 電腦數 據網路的互通互聯物理硬體和軟體程式的管理。區域網絡是美國國防部連接不同電腦器設 備的一種方式 。光纜傳輸數據的速度更慢 。海底光纖的架設, 2000 年左右使得全球互聯網 時代惠國惠民。電腦信息技術起 ...
  • Python 速查表中文版 本手冊是 Python cheat sheet 的中文翻譯版。原作者:Arianne Colton and Sean Chen([email protected]) 編譯:ucasFL 目錄 常規 數值類類型 數據結構 函數 控制流 面向對象編程 ...
  • 寫在前面 Spring的核心思想就是容器,當容器refresh的時候,外部看上去風平浪靜,其實內部則是一片驚濤駭浪,汪洋一片。Springboot更是封裝了Spring,遵循約定大於配置,加上自動裝配的機制。很多時候我們只要引用了一個依賴,幾乎是零配置就能完成一個功能的裝配。 由spring提供的、 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...