Spring Boot 接入 HTML 找不到 JS 文件的解决方案

在使用 Spring Boot 开发 Web 应用时,开发者常常会遇到一些问题,最常见的之一便是 HTML 页面无法加载 JS 文件。本文将为您详细介绍这一问题的产生原因,并提供相应的解决方案。此外,我们还将通过代码示例和图示来帮助您理解。

一、问题描述

在 Spring Boot 应用中,通常我们会将静态文件(如 HTML、CSS 和 JS 文件)放置于 src/main/resources/staticsrc/main/resources/public 目录中。然而,有时在访问 HTML 页面时,JS 文件会显示无法被加载,这时浏览器的开发者工具通常会显示类似于 404 Not Found 的错误信息。

1.1 错误示例

假设我们的项目结构如下:

src
└── main
    └── resources
        ├── static
        │   ├── js
        │   │   └── app.js
        │   └── index.html
        └── application.properties

index.html 文件中引入 JS 文件的代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Spring Boot Example</title>
    <script src="js/app.js"></script>
</head>
<body>
    Hello, Spring Boot!
</body>
</html>

当我们启动 Spring Boot 应用并访问 http://localhost:8080/index.html 时,可能会发现浏览器的控制台显示 404 错误,表示 app.js 文件未能找到。

二、产生原因

2.1 相对路径问题

以上错误通常是因为相对路径不正确导致的。在 HTML 文件中引入资源时,如果使用相对路径,路径将基于当前文档的位置进行解析。只有在根目录下才能正确访问到 static/js/app.js 文件。

2.2 Maven 配置问题

有时,配置问题也会导致静态资源无法找到。需要仔细检查 pom.xml 是否正确配置。

三、解决方案

3.1 使用绝对路径

一种常见的解决方案是使用绝对路径。修改 index.html 中的 JS 引入路径如下:

<script src="/js/app.js"></script>

这种方式确保了无论当前页面在哪里,都能正确访问到 static 目录下的资源。

3.2 配置 Spring Boot

Spring Boot 默认会扫描 staticpublic 目录,确保它们能够正常工作。不过,我们可以在 application.properties 中添加配置,以确保静态资源的访问没有问题:

spring.web.resources.static-locations=classpath:/static/

3.3 Maven 资源插件配置

确保在 pom.xml 中添加了以下资源配置,确保 Maven 能正确帮助我们处理静态资源:

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>static/**</include>
            </includes>
        </resource>
    </resources>
</build>

四、代码示例

以下是完整的 index.html 文件内容与 Java 控制器示例代码:

4.1 index.html 文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Spring Boot Example</title>
    <script src="/js/app.js"></script>
</head>
<body>
    Hello, Spring Boot!
    <script>
        // 这里可以测试 JS 是否加载成功
        console.log("JS Loaded Successfully");
    </script>
</body>
</html>

4.2 控制器示例

创建一个简单的控制器来返回 HTML 页面:

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HomeController {
    
    @GetMapping("/index.html")
    public String index() {
        return "index";
    }
}

五、图示说明

5.1 旅行图

以下是一个简单的旅行图,展示用户访问页面的旅程:

journey
    title 用户访问 Spring Boot 应用的旅程
    section 访问应用
      用户打开浏览器: 5: 用户
      输入 URL: 5: 用户
      发送请求: 4: 用户
    section 加载页面
      接收响应: 5: Spring Boot
      渲染 HTML: 4: 浏览器
    section 加载静态资源
      请求 JS 文件: 4: 浏览器
      返回 JS 响应: 4: Spring Boot

5.2 关系图

接下来是一个简单的 ER 图,展示控制器与 HTML 的关系:

erDiagram
    CONTROLLER {
        string id
        string name
    }
    HTML {
        string id
        string title
    }
    CONTROLLER ||--|| HTML : returns

结尾

本文介绍了 Spring Boot 中接入 HTML 时 JS 文件找不到的常见原因及解决方案。通过使用绝对路径解决资源加载失败的问题,配合正确的 Maven 配置,可以有效避免此类问题的出现。希望本文的分析和示例代码能帮助您更好地理解 Spring Boot 项目中的静态资源管理。如果您在开发中遇到其他问题,欢迎在评论区留言讨论!