Java Spring Boot 项目中嵌入前端静态资源:完整教程与实战案例

server/2024/12/19 18:13:07/

言简意赅的讲解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<a class=前端项目打包" />

  2. 拷贝静态资源到后端项目
    dist/ 中的所有文件复制到 Spring Boot 项目的 src/main/resources/static/ 目录下。
    Springboot中包含静态资源
    注意: src/main/resources/static/ 是 Spring Boot 的默认静态资源目录,放置在此的文件可以直接通过浏览器访问。


2.3 后端代码示例

java">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 后缀。例如:

nginx">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 重写。

添加控制器代码
java">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包含<a class=前端项目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.ppmy.cn/server/151503.html

相关文章

长短期记忆神经网络(LSTM)介绍

1、应用现状 长短期记忆神经网络&#xff08;LSTM&#xff09;是一种特殊的循环神经网络(RNN)。原始的RNN在训练中&#xff0c;随着训练时间的加长以及网络层数的增多&#xff0c;很容易出现梯度爆炸或者梯度消失的问题&#xff0c;导致无法处理较长序列数据&#xff0c;从而无…

Zookeeper使用详解

介绍 ZooKeeper是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务&#xff0c;是Google的Chubby一个开源的实现&#xff0c;是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件&#xff0c;提供的功能包括&#xff1a;配置维护、域名服务、分布…

【c++】inline、extern和static

C 中 inline、extern 和 static 的全面使用详解 在C编程中&#xff0c;inline、extern 和 static 是三个重要的关键字&#xff0c;分别用于控制函数和变量的链接性、内联展开以及存储持续性和作用域。本文将通过详尽的表格和丰富的案例&#xff0c;深入探讨这三个关键字的各类…

IOTIQS100芯片, TCP 发送数据+NSOSD,data要是hex16进制转换方法

命令&#xff1a;data以十六进制字符串格式发送的数据。 方法 代码 sprintf(temp, "%02X", data[i]);&#xff1a;将当前字节转换为两位宽的大写十六进制字符&#xff0c;并存储在 temp 中。如果需要小写字母&#xff0c;可以将格式说明符改为 "%02x"。 …

NoSQL大数据存储技术测试(7)键值对数据库Redis和其他NoSQL数据库

单项选择题 第1题 关于Redis的持久化&#xff0c;下列描述错误的是&#xff1a;&#xff08;&#xff09; RDB是以快照的形式&#xff0c;将内存中的数据整体拷贝到硬盘上。 执行RDB存储时会产生阻塞&#xff0c;因此RDB不适合实时备份&#xff0c;而适合定时备份。 AOF是…

【AI日记】24.12.18 kaggle 比赛 2-7

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 工作 参加&#xff1a;kaggle 比赛 Regression with an Insurance Dataset时间&#xff1a;8 小时 读书 书名&#xff1a;富兰克林自传时间&#xff1a;0.5 小时阅读原因&#xff1a;100 美元纸币上的人物 …

堆排序【东北大学oj数据结构9-4】C++

堆排序是一种基于堆的数据结构的排序&#xff0c;是一种快速排序算法&#xff0c;可以在输入数组中实现排序处理&#xff08;内存高效&#xff09;。 堆排序可以实现如下&#xff1a; maxHeapify(A, i) l left(i) r right(i) // select the node which has the m…

MySQL EXPLAIN 详解:一眼看懂查询计划

在日常的数据库开发中&#xff0c;我们经常需要分析 SQL 查询性能&#xff0c;而 EXPLAIN 是 MySQL 提供的利器&#xff0c;可以帮我们快速理解查询计划&#xff0c;优化慢查询。本文将详细解析 EXPLAIN 的输出字段及其含义&#xff0c;并结合实际案例分享优化思路。 一、什么是…