Java Spring Boot 項目中嵌入前端靜態資源:完整教程與實戰案例

言簡意賅的講解Java Spring Boot 中嵌入前端項目的靜態資源解決的痛點

之前給大家講解了如何部署一個前端項目,但大家還是好奇如何部署一個前后端一體項目。將前端構建后的靜態資源嵌入 Java Spring Boot 后端項目,是現代全棧開發中一種流行的實踐方式。本文將詳細講解這樣做的好處,并通過代碼示例和實踐演示,幫助你輕松實現這一目標。最后,我們還會探討如何優化靜態資源訪問路徑,使用戶體驗更加友好。


一、在 Spring Boot 中嵌入靜態資源的好處

1.1 好處概述
  1. 簡化交付流程
    前端打包生成的靜態資源與后端結合為一個單獨的可運行文件(如 jarwar),客戶只需運行一個文件即可啟動整個系統,無需分別部署前端和后端服務。

  2. 獨立開發,協作靈活
    在開發階段,前后端仍可以分為兩個獨立團隊,分別開發和調試。前端完成開發后,通過構建工具(如 Webpack、Vite)生成靜態資源文件,后端只需加載這些文件即可。

  3. 部署維護方便
    只需部署一個 Spring Boot 服務,無需額外配置 Nginx 或其他靜態資源服務器,降低部署復雜度,減少維護成本。


二、實現步驟與代碼示例

2.1 項目目錄結構規劃

為了更好地管理嵌入的前端靜態資源,建議使用如下的項目目錄結構:

project-root/
├── src/
│   ├── main/
│   │   ├── java/
│   │   ├── resources/
│   │   │   ├── static/           # 存放前端打包后的靜態資源
│   │   │   │   ├── index.html
│   │   │   │   ├── css/
│   │   │   │   ├── js/
│   │   │   │   ├── images/
│   │   │   └── application.properties
│   │   └── Application.java
├── frontend/                     # 前端項目目錄(開發階段)
│   ├── src/
│   ├── public/
│   ├── package.json
│   └── vite.config.js
└── pom.xml
2.2 前端構建與資源存放
  1. 前端項目打包
    假設你的前端使用 Vite 或 Webpack 構建,運行如下命令生成構建文件:

    npm run build
    

    生成的文件通常位于 dist/ 目錄下,其中包括 index.html 和相關靜態資源文件(如 css/js/ 文件夾)。
    spingboot前端項目打包

  2. 拷貝靜態資源到后端項目
    dist/ 中的所有文件復制到 Spring Boot 項目的 src/main/resources/static/ 目錄下。
    Springboot中包含靜態資源
    注意: src/main/resources/static/ 是 Spring Boot 的默認靜態資源目錄,放置在此的文件可以直接通過瀏覽器訪問。


2.3 后端代碼示例
package com.example.demo;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}

重要提示:如果你只需要靜態資源,而不打算使用 Spring MVC 來攔截路徑,請確保 src/main/resources/static/ 中的文件名和路徑完全一致。Spring Boot 會自動將這些文件直接暴露為靜態資源。


2.4 訪問測試

完成上述步驟后,運行 Spring Boot 項目并訪問以下 URL:

  • http://localhost:8080/index.html
  • http://localhost:8080/css/style.css
  • http://localhost:8080/js/app.js

你會發現靜態資源可以正常加載。但這里存在一個問題:URL 必須以 .html 結尾,這不夠美觀且容易暴露文件類型。


三、優化靜態資源訪問路徑

為了去掉 .html 后綴,提供更優雅的訪問方式,我們可以通過以下兩種方式解決:

3.1 使用 Nginx 配置 URL 重寫

如果最終的部署環境中使用了Nginx,可以通過配置重寫規則來去掉 .html 后綴。例如:

server {listen 80;server_name yourdomain.com;root /path/to/static/files;location / {try_files $uri $uri/ $uri.html =404;}
}

上述規則會優先匹配文件路徑,若文件路徑不存在,則嘗試追加 .html 后綴。


3.2 使用 Spring MVC 實現 URL 重寫

如果沒有使用 Nginx,可以通過 Spring MVC 自定義控制器來實現 URL 重寫。

添加控制器代碼
package com.example.demo;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;@Controller
public class WebController {@GetMapping("/{path:[^\.]*}") // 匹配路徑中不包含"."的請求public String forwardToIndex() {return "forward:/index.html"; // 轉發到 index.html}
}

Springboot包含前端項目controller

功能說明
  • 該控制器會將所有不包含文件后綴的請求(如 /about/contact)轉發到 index.html
  • 這樣,訪問 http://localhost:8080http://localhost:8080/about 時,都會加載前端的 index.html

四、總結

通過將前端構建后的靜態資源嵌入到 Spring Boot 項目中,可以顯著簡化交付和部署流程。為了提升用戶體驗,可以通過配置 Nginx 或 Spring MVC 實現 URL 優化。以下是整個流程的核心步驟總結:

  1. 前后端獨立開發,前端打包輸出靜態資源文件。
  2. 將構建好的文件復制到 Spring Boot 的 src/main/resources/static/ 目錄下。
  3. 運行后端項目,確保靜態資源可以正常訪問。
  4. 通過 Nginx 或 Spring MVC 優化路徑訪問。

按照本文的指導,你可以輕松實現一個既美觀又高效的全棧項目交付方案。


通過上述內容,你就已經基本理解了這個方法,基礎用法我也都有展示。如果你能融會貫通,我相信你會很強

Best
Wenhao (楠博萬)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/63803.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/63803.shtml
英文地址,請注明出處:http://en.pswp.cn/web/63803.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

R200推理

一、環境搭建 1.下載鏡像 wget https://bj.bcebos.com/klx- public/kdk/project/anyinfer_x86_output/20240316/anyinfer_x86_v5.tar.gz wget https://bj.bcebos.com/klxpublic/kdk/project/anyinfer_x86_output/20240316/anyinfer_x86_v5.tar.gz tar -zxvf a…

RabbitMQ中的Topic模式

在現代分布式系統中,消息隊列(Message Queue)是實現異步通信、解耦系統組件的重要工具。RabbitMQ 是一個廣泛使用的開源消息代理,支持多種消息傳遞模式,其中 Topic 模式 是一種靈活且強大的模式,允許生產者…

可編輯99PPT | 智能工廠整體規劃方案及實施細部方案

薦言分享:智能工廠是利用物聯網、大數據、人工智能等先進技術,實現生產過程自動化、智能化和柔性化的現代工廠。本整體規劃方案旨在通過整合信息技術、自動化技術、人工智能技術和物聯網技術,構建一個高效、靈活、綠色、可持續的生產環境&…

Day13 用Excel表體驗梯度下降法

Day13 用Excel表體驗梯度下降法 用所學公式創建Excel表 用Excel表體驗梯度下降法 詳見本Day文章頂部附帶資源里的Excel表《梯度下降法》,可以對照表里的單元格公式進行理解,還可以多嘗試幾次不同的學習率 η \eta η來感受,只需要更改學習率…

YOLOv8改進,YOLOv8引入Hyper-YOLO的MANet混合聚合網絡+HyperC2Net網絡

摘要 理論介紹 MANet 的目標是通過多種卷積操作的協同作用,提高特征提取能力,并加強梯度流動,從而提升模型在不同層次的特征表示和語義深度。MANet 結合了三種卷積變體,通過混合使用它們來提高視覺特征的多樣性和信息流動性。 HyperC2Net 的主要目標是通過超圖結構對多層次…

Nautilus源碼編譯傻瓜式教程二

Nautilus源碼編譯傻瓜式教程一 Nautilus編譯 依賴項文件 接上文,點擊小錘子進行編譯后出現如下的錯誤提示 看這個報錯,未找到文件或目錄,再看前面的git地址是github就知道肯定是下載有問題,查找下Nautilus項目,發現在nautilus/build-aux/flatpak/org.gnome.Nautilus.json文件…

Java中使用四葉天動態代理IP構建ip代理池,實現httpClient和Jsoup代理ip爬蟲

在本次爬蟲項目中,關于應用IP代理池方面,具體完成以下功能: 從指定API地址提取IP到ip池中(一次提取的IP數量可以自定義更改) 每次開始爬蟲前(多條爬蟲線程并發執行),從ip池中獲取一…

CEF127 編譯指南 MacOS 篇 - 拉取 CEF 源碼(五)

1. 引言 在完成了所有必要工具的安裝和配置后,我們進入到獲取 CEF 源碼的階段。對于 macOS 平臺,CEF 的源碼獲取過程需要特別注意不同芯片架構(Intel 和 Apple Silicon)的區別以及版本管理。本文將詳細介紹如何在 macOS 系統上獲…

梳理你的思路(從OOP到架構設計)_設計模式Factory Method模式

目錄 1、Factory Method模式 2、范例&#xff1a; Android FM(工廠)模式 3、Android里處處可見的FM模式的應用 1、Factory Method模式 誰來創建<T>的對象呢?例如&#xff0c; 剛才的Template Method模式內含一個EIT造形&#xff0c;那麼&#xff0c; 請問&#xff…

tauri桌面應用開發入門

簡介 tauri是一款基于web的桌面應用前端框架 因為使用webviews渲染,而不是像electron自帶一個瀏覽器內核,所以打包之后的空間更小,十幾mb 前端界面使用web,可以采取流行的框架,入react,vue等 前端后臺采用rust,彌補前端無法直接訪問操作系統,常用于訪問本地文件系統 官方中…

selenium 報錯 invalid argument: invalid locator

環境&#xff1a; Python3.12.2 selenium4.0 報錯信息&#xff1a; invalid argument: invalid locator 錯誤分析&#xff1a; selenium語法錯誤,find_element方法少寫By.XPATH參數 錯誤語法如下&#xff1a; driver.find_element(//div[id"myid"]) 解決辦…

ESP8266 WiFi模塊入門:搭建網絡與測試實踐

在物聯網&#xff08;IoT&#xff09;應用中&#xff0c;設備聯網是核心功能之一。而ESP8266串口WiFi ESP-01模塊是一款低成本、功能強大的UART-WiFi透傳模塊&#xff0c;廣泛應用于智能家居、工業控制等領域。本篇文章將從基礎出發&#xff0c;講解如何使用ESP8266模塊進行WiF…

框架問題學習

1、gin 1.1、gin框架路由是怎么處理的 在 Gin 中&#xff0c;路由是通過 gin.Default() 或 gin.New() 創建的 *gin.Engine 對象來管理的。gin.Default() 是 gin.New() 的一個封裝&#xff0c;它在創建路由對象時會自動添加一個默認的中間件&#xff08;如日志記錄、恢復中間件…

Java模擬Mqtt客戶端連接Mqtt Broker

Java模擬Mqtt客戶端基本流程 引入Paho MQTT客戶端庫 <dependency><groupId>org.eclipse.paho</groupId><artifactId>org.eclipse.paho.mqttv5.client</artifactId><version>1.2.5</version> </dependency>設置mqtt配置數據 …

電子電氣架構 --- 隊列刷寫場景及刷寫上位機淺析

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 所謂雞湯,要么蠱惑你認命,要么慫恿你拼命,但都是回避問題的根源,以現象替代邏輯,以情緒代替思考,把消極接受現實的懦弱,偽裝成樂觀面對不幸的…

springboot根據租戶id動態指定數據源

代碼地址 碼云地址springboot根據租戶id動態指定數據源: springboot根據租戶id指定動態數據源,結合mybatismysql多數源下的事務管理 創建3個數據庫和對應的表 sql腳本在下圖位置 代碼的執行順序 先設置主數據庫的數據源配置目標數據源和默認數據源有了主庫的數據源&#xff…

C++簡明教程(文章要求學過一點C語言)(3)

一、編程工具大揭秘——IDE 當我們準備踏入 C 編程的奇妙世界時&#xff0c;首先要認識一個重要的“魔法盒子”——集成開發環境&#xff08;IDE&#xff09;。IDE 就像是一個全能的編程工作室&#xff0c;它把我們寫代碼所需要的各種工具都整合到了一起&#xff0c;讓編程這件…

達夢官方工具 SQLark數據遷移(oracle->達夢數據庫)

應國產化需求需要,需將系統中涉及的各中間件替換成國產中間件,此文介紹了從Oracle遷移數據至達夢dm8的步驟,該文在windos環境下已驗證測試過 1 SQLark介紹 SQLark是一款專為信創應用開發者設計的數據庫開發和管理工具。它支持快速查詢、創建和管理多種類型的數據庫系統&#xf…

【JAVA】JAVA接口公共返回體ResponseData封裝

一、JAVA接口公共返回體ResponseData封裝&#xff0c;使用泛型的經典 例子 public class ResponseData<T> implements Serializable { /** * */ private static final long serialVersionUID 7098362967623367826L; /** * 響應狀態碼 */ …

AlipayHK支付寶HK接入-商戶收款(PHP)

一打開支付寶國際版 二、點開商戶服務 三、下載源碼