1. 概述

Thymeleaf 是一个流行的 Java 模板引擎,与 Spring 框架兼容,用于生成 HTML 视图。Web 应用程序的主要功能之一是渲染图像。

Spring Boot 对 Java 文件和资源文件的组织结构进行了优化,使得在 HTML 文件中定义图片路径变得简单。

在这篇教程中,我们将设置一个简单的 Spring Boot 项目,并从 resources 文件夹中提供图像。同时,我们还将了解如何在使用 Thymeleaf 时避免定义图片路径。

2. 项目设置

首先,通过在 pom.xml 中添加 spring-boot-starter-webspring-boot-starter-thymeleaf 来启动一个简单的 Spring Boot 项目:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>3.2.1</version>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
    <version>3.2.1</version>
</dependency>

在接下来的部分,我们将学习如何在带有 Thymeleaf 的 Spring Boot 应用程序中显示图像。

3. 在 Thymeleaf 模板中显示图像

要在 Thymeleaf 中显示图像,我们需要遵循标准的目录结构,即为 HTML 文件创建一个 templates 目录,为像图片这样的静态资源创建一个 static 目录。

3.1. 设置目录

Spring Boot 默认为我们配置了目录结构。它将 Java 源文件与静态资源和模板分开,并自动创建一个资源目录,我们可以在此添加静态文件和模板。

当使用 Thymeleaf 启动 Spring Boot 应用时,通常会在 resources 目录下创建 templatesstatic 目录。

Thymeleaf 的 HTML 模板文件应放在 templates 目录中,而静态资源如 JavaScript、CSS、图片等应放在 static 目录中。

首先,我们在 static 文件夹中创建一个 images 目录。接着,在 images 目录下添加一个名为 cat.jpg 的图片文件:

现在可以从视图文件中引用 cat.jpg 文件。

3.2. 在 Thymeleaf 中引用图像

首先,我们在 templates 目录下创建一个名为 index.html 的新文件,编写简单的 HTML 代码来从 static 文件夹中显示图像:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Baeldung Pet Store</title>
    </head>
    <body>
        <h6>Pet Store</h6>
        <img th:src="@{images/cat.jpg}" alt="cat">
    </body>
</html>

值得注意的是,我们在 HTML 代码中添加了一个 Thymeleaf 的 th:src 属性,指定图像的相对路径。

定义图像路径的方式对于成功显示图像至关重要。Spring 预设会从 resource 文件夹提供静态资源。因此,我们在引用图像和其他静态文件时可以省略 resourcestatic 路径部分。

此外,我们也可以不创建子目录直接将图片添加到静态文件夹:

cat.jpg 文件复制到静态文件夹:

在这种情况下,只需要指定图像名称及其扩展名即可:

// ...
<h6>Pet Store</h6>
<img th:src="@{cat.jpg}" alt="">
// ...

然而,为了保持文件的整洁,建议为静态文件创建子目录。

最后,让我们创建一个控制器类并添加一个路由到 index 页面:

@Controller
public class DisplayController {
    @RequestMapping("/")
    public String home(){
        return "index";
    }
}

在这里,我们将 / 路径映射到 index 视图模板,这样当我们加载应用程序时就可以显示图像:

由于相对路径允许 Spring 自动在静态资源文件夹中找到图像文件,所以图像能够正确显示,无需指定完整的绝对路径。

3.3. 避免失败

简而言之,如果在图像路径中包含 resourcestatic 关键字,图像将无法加载:

// ...
<img th:src="@{../static/images/cat.jpg}" alt="" width="100px">
// ...

上述代码中指定了包含 static 文件夹的图像路径。由于 Spring Boot 已预设检查静态文件夹,这会导致错误的路径,无法找到图像。

因此,我们在声明路径时应避免包含 resourcestatic 关键字。Spring 会在默认情况下检查这些文件夹来解析图像路径。

4. 总结

在这篇文章中,我们学习了如何使用 th:src 属性在 Thymeleaf 模板中显示图像。同时,我们也了解了如何通过避免在路径声明中使用 resourcesstatic 关键字来正确指定图像路径。

如往常一样,示例代码可以在 GitHub 上找到。