八,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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...