Spring Boot 整合 Thymeleaf 生成 HTML 页面教学

Thymeleaf 是一款优秀的服务器端 Java 模板引擎,能与 Spring Boot 无缝整合,快速生成动态 HTML 页面。本教学从环境搭建到项目实战,带你逐步掌握 Thymeleaf 核心用法。

一、环境搭建

1. 技术栈要求

  • JDK:1.8 及以上
  • Spring Boot:2.x 或 3.x(本教学以 2.7.x 为例)
  • 开发工具:IntelliJ IDEA(或 Eclipse)

2. 创建 Spring Boot 项目

方式一:通过 Spring Initializr(推荐)
  1. 打开 Spring Initializr 官网。
  1. 配置项目信息:
    • Group:自定义包名(如 com.example)
    • Artifact:项目名(如 thymeleaf-demo)
    • 依赖选择:Web -> Spring Web、Template Engines -> Thymeleaf
  1. 点击 "Generate" 下载项目压缩包,解压后用 IDE 打开。
方式二:Maven 手动配置

在项目的 pom.xml 文件中添加以下依赖:

复制代码
<dependencies>

<!-- Spring Web 依赖 -->

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-web</artifactId>

</dependency>

<!-- Thymeleaf 依赖 -->

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-thymeleaf</artifactId>

</dependency>

</dependencies>

3. 项目目录结构

项目核心目录结构如下,重点关注关键目录:

复制代码
thymeleaf-demo/

├── src/

│ ├── main/

│ │ ├── java/

│ │ │ └── com/

│ │ │ └── example/

│ │ │ ├── controller/ # 控制器目录

│ │ │ ├── entity/ # 实体类目录

│ │ │ └── ThymeleafDemoApplication.java # 项目启动类

│ │ └── resources/

│ │ ├── templates/ # Thymeleaf 模板文件目录(默认)

│ │ └── application.properties # 配置文件

└── pom.xml # Maven 依赖配置文件

4. 基础配置(application.properties)

在 resources 目录下的 application.properties 文件中添加 Thymeleaf 配置,方便开发调试:

复制代码
spring.thymeleaf.encoding=UTF-8

# 开发环境关闭缓存(修改页面无需重启项目)

spring.thymeleaf.cache=false

# 模板文件前缀(默认就是 classpath:/templates/,可省略)

spring.thymeleaf.prefix=classpath:/templates/

# 模板文件后缀(默认就是 .html,可省略)

spring.thymeleaf.suffix=.html

二、核心语法详解

1. 变量表达式(${})

用于获取控制器传递到页面的数据,是 Thymeleaf 最基础的语法。

  • 控制器中通过 model.addAttribute("变量名", 变量值) 传递数据。
  • 页面中通过 ${变量名} 获取数据,结合 th:text 标签渲染到页面,示例:

    默认欢迎语

2. 链接表达式(@{})

用于生成动态链接,避免硬编码路径问题,支持带参数传递。

  • 无参数链接:<a th:href="@{/user-list}">查看用户列表</a>
  • 带参数链接:<a th:href="@{/user-detail(id=${user.id})}">查看详情</a>,生成的链接类似 /user-detail?id=1

3. 循环遍历(th:each)

用于遍历集合数据(如 List),常用来渲染列表、表格等。

  • 语法:th:each="单个元素, 状态变量 : ${集合}"
  • 状态变量常用属性:count(从 1 开始的序号)、index(从 0 开始的索引)
  • 示例:
复制代码
  <tr th:each="user, stat : ${userList}">

  <td th:text="${stat.count}">序号</td>

  <td th:text="${user.name}">姓名</td>

  </tr>

三、项目实战(三大核心页面)

1. 实体类创建(User.java)

在 entity 目录下创建 User 实体类,存储用户数据:

java 复制代码
package com.example.thymeleafdemo.entity;

public class User {

private Integer id;

private String name;

private Integer age;

private String email;

// 构造方法

public User(Integer id, String name, Integer age, String email) {

this.id = id;

this.name = name;

this.age = age;

this.email = email;

}

// Getter 方法(Thymeleaf 需通过 Getter 获取属性值)

public Integer getId() { return id; }

public String getName() { return name; }

public Integer getAge() { return age; }

public String getEmail() { return email; }

}

2. 控制器创建

(1)首页控制器(IndexController.java)

在 controller 目录下创建,处理首页请求并传递基础数据:

java 复制代码
package com.example.thymeleafdemo.controller;

import org.springframework.stereotype.Controller;

import org.springframework.ui.Model;

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

@Controller

public class IndexController {

@GetMapping("/")

public String index(Model model) {

model.addAttribute("pageTitle", "首页");

model.addAttribute("welcomeMsg", "欢迎使用 Thymeleaf 页面!");

return "index"; // 对应 templates 目录下的 index.html

}

}
(2)用户控制器(UserController.java)

处理用户列表和用户详情页请求:

java 复制代码
package com.example.thymeleafdemo.controller;

import com.example.thymeleafdemo.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

import java.util.Arrays;
import java.util.List;

@Controller
public class UserController {
    // 处理用户列表请求
    @GetMapping("/user-list")
    public String userList(Model model) {
        // 模拟用户数据
        List<User> userList = Arrays.asList(
                new User(1, "张三", 22, "zhangsan@test.com"),
                new User(2, "李四", 25, "lisi@test.com")
        );
        model.addAttribute("userList", userList);
        model.addAttribute("pageTitle", "用户列表");
        return "userList";
    }

    // 处理用户详情请求
    @GetMapping("/user-detail")
    public String userDetail(Integer id, Model model) {
        // 模拟根据 ID 查询用户(实际项目中替换为数据库查询)
        User user = new User(id, "张三", 22, "zhangsan@test.com");
        model.addAttribute("user", user);
        model.addAttribute("pageTitle", "用户详情");
        return "userDetail";
    }
}

3. 模板页面创建

(1)首页(index.html)

在 templates 目录下创建,展示欢迎语并提供跳转链接:

html 复制代码
<!DOCTYPE html>

<html xmlns:th="http://www.thymeleaf.org">

<head>

<meta charset="UTF-8">

<title th:text="${pageTitle}">首页</title>

</head>

<body>

<h1 th:text="${welcomeMsg}">欢迎信息</h1>

<a th:href="@{/user-list}">查看用户列表</a>

</body>

</html>
(2)用户列表页(userList.html)

渲染用户列表表格,提供查看详情和返回首页链接:

html 复制代码
<!DOCTYPE html>

<html xmlns:th="http://www.thymeleaf.org">

<head>

<meta charset="UTF-8">

<title th:text="${pageTitle}">用户列表</title>

<style>

table { border-collapse: collapse; width: 60%; margin: 20px 0; }

th, td { border: 1px solid #ddd; padding: 8px; text-align: center; }

</style>

</head>

<body>

<h1 th:text="${pageTitle}">用户列表</h1>

<table>

<tr>

<th>序号</th>

<th>ID</th>

<th>姓名</th>

<th>年龄</th>

<th>操作</th>

</tr>

<tr th:each="user, stat : ${userList}">

<td th:text="${stat.count}">1</td>

<td th:text="${user.id}">1</td>

<td th:text="${user.name}">张三</td>

<td th:text="${user.age}">22</td>

<td><a th:href="@{/user-detail(id=${user.id})}">查看详情</a></td>

</tr>

</table>

<a th:href="@{/}">返回首页</a>

</body>

</html>
(3)用户详情页(userDetail.html)

展示单个用户的详细信息:

html 复制代码
<!DOCTYPE html>

<html xmlns:th="http://www.thymeleaf.org">

<head>

<meta charset="UTF-8">

<title th:text="${pageTitle}">用户详情</title>

</head>

<body>

<h1 th:text="${pageTitle}">用户详情</h1>

<div>

<p><span>ID:</span><span th:text="${user.id}">1</span></p>

<p><span>姓名:</span><span th:text="${user.name}">张三</span></p>

<p><span>年龄:</span><span th:text="${user.age}">22</span></p>

<p><span>邮箱:</span><span th:text="${user.email}">zhangsan@test.com</span></p>

</div>

<a th:href="@{/user-list}">返回用户列表</a>

</body>

</html>

四、项目运行与测试

  1. 找到项目启动类 ThymeleafDemoApplication.java,点击运行按钮启动项目。
  1. 打开浏览器,输入 http://localhost:8080 访问首页,可看到欢迎语和 "查看用户列表" 链接。
  1. 点击 "查看用户列表",进入用户列表页,能看到用户数据表格和 "查看详情" 链接。
  1. 点击任意 "查看详情" 链接,进入用户详情页,查看该用户的详细信息,也可通过 "返回用户列表" 回到列表页。

五、关键总结

  1. 数据传递流程:控制器通过 Model 传递数据 → 模板页面用 ${变量名} 获取数据 → 结合 th:text 等标签渲染。
  1. 页面跳转逻辑:通过 th:href="@{路径}" 实现页面间跳转,带参数时在路径后加 (参数名=参数值)。
  1. 核心优势:开发环境无缓存,修改页面实时生效;语法简洁,与 HTML 标签自然融合,易于理解和维护。
相关推荐
CsharpDev-奶豆哥3 小时前
jq获取html字符串中的图片逐个修改并覆盖原html的解决方案
前端·html
神仙别闹5 小时前
基于Java(Spring Boot)+MySQL实现电商网站
java·spring boot·mysql
hacker_LeeFei6 小时前
Springboot连接多数据源(MySQL&Oracle)
spring boot·mysql·oracle
诗句藏于尽头6 小时前
音乐播放器-单html文件
前端·html
Never_Satisfied7 小时前
在JavaScript / HTML中,Chrome报错此服务器无法证实它就是xxxxx - 它的安全证书没有指定主题备用名称
javascript·chrome·html
Roye_ack18 小时前
【项目实战 Day12】springboot + vue 苍穹外卖系统(Apache POI + 工作台模块 + Excel表格导出 完结)
java·spring boot·后端·excel·苍穹外卖
qq_54702617918 小时前
SpringBoot+Redis实现电商秒杀方案
spring boot·redis·后端
程序猿DD19 小时前
如何在 Spring Boot 应用中配置多个 Spring AI 的 LLM 客户端
spring boot·llm·spring ai