引言:为什么选择 Thymeleaf?

Thymeleaf 是一个现代化的服务器端 Java 模板引擎,专为 Web 开发而设计。与 JSP 不同,Thymeleaf 模板是纯 HTML 文件,可以直接在浏览器中预览,无需后端服务器支持。这种"自然模板"特性让前端开发和后端开发可以无缝协作。Spring Boot 官方推荐使用 Thymeleaf 作为视图技术,它提供了:

  • 简洁优雅的语法

  • 强大的表达式语言

  • 与 Spring 生态的完美集成

  • 丰富的布局功能

  • 开箱即用的国际化支持

本文将带你从零开始,全面掌握 Spring Boot 中 Thymeleaf 的使用。

一、环境搭建

1. 创建 Spring Boot 项目

使用 Spring Initializr (https://start.spring.io/) 创建项目,选择以下依赖:

  • Spring Web

  • Thymeleaf

2. Maven 依赖

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency>
</dependencies>

3. 目录结构

src
├── main
│   ├── java
│   │   └── com
│   │       └── example
│   │           └── demo
│   │               ├── controller
│   │               ├── model
│   │               └── DemoApplication.java
│   └── resources
│       ├── static   # 静态资源(CSS, JS, 图片)
│       ├── templates # Thymeleaf 模板
│       └── application.properties

二、基础配置

application.properties 配置

# Thymeleaf 配置
spring.thymeleaf.cache=false # 开发时关闭缓存
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
spring.thymeleaf.mode=HTML
spring.thymeleaf.encoding=UTF-8# 静态资源路径
spring.resources.static-locations=classpath:/static/

三、第一个 Thymeleaf 页面

1. 创建控制器

@Controller
public class HomeController {@GetMapping("/")public String home(Model model) {model.addAttribute("message", "Hello, Thymeleaf!");model.addAttribute("currentDate", new Date());return "home"; // 对应 templates/home.html}
}

2. 创建模板文件 (templates/home.html)

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>Thymeleaf 入门</title>
</head>
<body><h1 th:text="${message}">默认标题</h1><p>当前时间:<span th:text="${#dates.format(currentDate, 'yyyy-MM-dd HH:mm:ss')}"></span></p><!-- 使用 Thymeleaf 表达式 --><div th:if="${not #strings.isEmpty(message)}"><p>消息长度:<span th:text="${#strings.length(message)}"></span></p></div><!-- 链接表达式 --><a th:href="@{/about}">关于我们</a>
</body>
</html>

3. 运行并访问

启动应用后访问 http://localhost:8080,你将看到:

  1. "Hello, Thymeleaf!" 标题

  2. 格式化的当前时间

  3. 消息长度计算

  4. 指向关于页面的链接

四、Thymeleaf 核心语法

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

用于访问模型中的数据:

<p th:text="${user.name}">用户名</p>
<p th:text="${user.age > 18 ? '成年' : '未成年'}">年龄状态</p>

2. 选择表达式 (*{...})

与 th:object 配合使用:

<div th:object="${user}"><p>姓名: <span th:text="*{name}"></span></p><p>邮箱: <span th:text="*{email}"></span></p>
</div>

3. 消息表达式 (#{...})

用于国际化:

<p th:text="#{welcome.message}">欢迎信息</p>

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

生成正确的 URL:

<a th:href="@{/users/{id}/profile(id=${userId})}">用户资料</a>
<img th:src="@{/images/logo.png}">

5. 片段表达式 (~{...})

包含模板片段:

<div th:insert="~{fragments/header :: header}"></div>

五、常用功能详解

1. 条件判断

<div th:if="${user.isAdmin}"><button>管理面板</button>
</div><div th:unless="${user.active}"><p class="warning">账户未激活</p>
</div><div th:switch="${user.role}"><p th:case="'admin'">管理员</p><p th:case="'user'">普通用户</p><p th:case="*">未知角色</p>
</div>

2. 循环遍历

<table><tr th:each="user, iterStat : ${users}"><td th:text="${iterStat.index + 1}">序号</td><td th:text="${user.name}">姓名</td><td th:text="${user.email}">邮箱</td><td><span th:if="${user.active}" th:text="激活"></span><span th:unless="${user.active}" th:text="未激活"></span></td></tr>
</table>

3. 表单处理

<form th:action="@{/users}" th:object="${user}" method="post"><input type="text" th:field="*{name}" placeholder="姓名"><input type="email" th:field="*{email}" placeholder="邮箱"><button type="submit">保存</button><!-- 显示字段错误 --><div th:if="${#fields.hasErrors('name')}" th:errors="*{name}" class="error"></div>
</form>

4. 布局模板

layout.html (布局文件)

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head><title th:text="${title}">默认标题</title><th:block th:replace="fragments/head :: head"></th:block>
</head>
<body><header th:replace="fragments/header :: header"></header><main><!-- 内容区域 --><div th:replace="${view}"></div></main><footer th:replace="fragments/footer :: footer"></footer>
</body>
</html>

home.html (具体页面)

<!DOCTYPE html>
<html th:replace="~{layout :: layout(~{::title}, ~{::main})}">
<head><title>首页</title>
</head>
<body><main><h1>欢迎来到首页</h1><p>这是主要内容区域</p></main>
</body>
</html>

六、实用技巧与最佳实践

1. 工具对象

Thymeleaf 提供了一系列实用工具:

  • #dates:日期格式化

  • #strings:字符串操作

  • #numbers:数字格式化

  • #lists:集合操作

  • #arrays:数组操作

  • #objects:对象操作

    <p th:text="${#dates.format(user.birthday, 'yyyy年MM月dd日')}"></p>
    <p th:text="${#strings.capitalize(user.name)}"></p>
    <p th:text="${#lists.size(user.roles)}"></p>

2. 内联表达式

使用 [[...]] 或 [(...)] 在 HTML 属性中内联表达式:

<script th:inline="javascript">var userId = [[${user.id}]];var userName = /*[[${user.name}]]*/ '默认名称';
</script><p data-user-id="${user.id}">用户ID: [[${user.id}]]</p>

3. 模板缓存管理

开发环境关闭缓存,生产环境开启缓存:

# application-dev.properties
spring.thymeleaf.cache=false# application-prod.properties
spring.thymeleaf.cache=true

4. 自定义方言

创建自定义 Thymeleaf 处理器:

public class AlertDialect extends AbstractProcessorDialect {public AlertDialect() {super("Alert Dialect", "alert", 1000);}@Overridepublic Set<IProcessor> getProcessors(String dialectPrefix) {return Set.of(new AlertTagProcessor(dialectPrefix));}
}public class AlertTagProcessor extends AbstractElementTagProcessor {// 实现自定义标签处理逻辑
}

注册方言:

@Configuration
public class ThymeleafConfig {@Beanpublic AlertDialect alertDialect() {return new AlertDialect();}
}

七、常见问题解决

1. 静态资源加载问题

确保路径正确:

<!-- 正确方式 -->
<link th:href="@{/css/style.css}" rel="stylesheet"><!-- 错误方式 -->
<link href="/css/style.css" rel="stylesheet">

2. 表单绑定失败

确保表单对象和字段名匹配:

// Controller
@PostMapping("/save")
public String saveUser(@ModelAttribute("userForm") User user) {// ...
}
<!-- 模板 -->
<form th:object="${userForm}"><input th:field="*{name}">
</form>

3. 国际化支持

配置消息源:

# application.properties
spring.messages.basename=messages

创建 messages.properties:

welcome.message=欢迎您, {0}!

在模板中使用:

<p th:text="#{welcome.message(${user.name})}"></p>

八、进阶学习资源

  1. 官方文档

    • Thymeleaf 官方文档

    • Spring Boot Thymeleaf 文档

  2. 推荐书籍

    • "Thymeleaf: Practical Natural Templates" by José Samper

    • "Spring Boot in Action" by Craig Walls

  3. 实战项目

    • GitHub 搜索 "spring-boot-thymeleaf-example"

    • Spring 官方示例项目

总结

Thymeleaf 作为 Spring Boot 的官方推荐模板引擎,提供了强大的功能和优雅的语法。通过本文的学习,你应该能够:

  1. 搭建 Spring Boot + Thymeleaf 开发环境

  2. 使用基础表达式和常用功能

  3. 实现复杂的页面布局

  4. 处理表单和验证

  5. 解决常见开发问题

Thymeleaf 的"自然模板"特性使其成为现代 Web 开发的理想选择,它让前后端协作更加高效。现在就开始在你的项目中尝试使用 Thymeleaf 吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/95828.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/95828.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/95828.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pytest介绍(python测试框架)(@pytest.mark.parametrize、@pytest.fixtures)

文章目录**1. 核心特点**- **简洁易用**&#xff1a;无需复杂的配置&#xff0c;只需编写简单的函数或类即可进行测试。- **丰富的断言**&#xff1a;直接使用 Python 内置的 assert 语句&#xff0c;失败时提供详细的错误信息。- **自动发现测试**&#xff1a;通过约定的命名规…

[Python 基础课程]继承

在 Python 的面向对象编程&#xff08;OOP&#xff09;中&#xff0c;继承&#xff08;Inheritance&#xff09; 是一种重要的机制&#xff0c;它允许一个类&#xff08;称为子类或派生类&#xff09;从另一个类&#xff08;称为父类、基类或超类&#xff09;中继承属性和方法。…

QT之设计器组件功能(8大类55个组件)

组件名称 功能描述关键属性1. Layouts&#xff08;布局组件&#xff09;(1) Vertical Layout&#xff08;垂直布局&#xff09;将子控件按垂直方向依次排列layoutSpacing&#xff1a;控件之间的间距layoutMargin&#xff1a;布局边缘的边距layoutStretch&#xff1a;设置各控件…

java中list的api详细使用

在Java中&#xff0c;List是集合框架中最常用的接口之一&#xff0c;继承自Collection&#xff0c;代表有序、可重复的元素集合&#xff08;允许null元素&#xff09;。其核心实现类有ArrayList&#xff08;数组实现&#xff0c;随机访问高效&#xff09;、LinkedList&#xff…

Azure AI Search 探索总结

Azure AI Search 原名 Azure Cognitive Service&#xff0c;是Azure中用来给AI项目构建知识库的组件。知识库本质和数据库很像&#xff0c;但是内部的存储结构和检索算法不一样。比如并不是知识库的每一列都可以用来过滤、检索或group by&#xff0c;而是要根据实际情况配置。A…

高效解决 pip install 报错 SSLError: EOF occurred in violation of protocol

高效解决 pip install 报错 SSLError: EOF occurred in violation of protocol 标签&#xff1a; Python, pip, SSLError, Clash, 网络代理, 问题解决 一、问题描述 在Python开发中&#xff0c;pip 是我们最亲密的伙伴。然而&#xff0c;当你身处需要科学上网的环境&#xff0c…

CSS 核心知识点全解析:从基础到实战应用

大家好&#xff01;今天这篇文章将系统总结 CSS 的核心知识点&#xff0c;从最基础的样式引入到复杂的选择器应用&#xff0c;再到盒子模型、文本处理等实战技巧&#xff0c;全程结合代码示例&#xff0c;让你轻松掌握 CSS 的精髓。一、CSS 是什么&#xff1f;为什么需要它&…

ClickHouse的学习与了解

什么是ClickHouse&#xff1f; ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。 在传统的行式数据库系统中&#xff0c;数据按如下顺序存储&#xff1a;RowWatchIDJavaEnableTitleGoodEventEventTime#0893543506621Investor Relations12016/5/18 5:19#1903295…

安卓11 12系统修改定制化_____修改系统 解锁system分区 去除data加密 自由删减系统应用

在定制化系统中。修改系统分区 解锁system。让用户可以自由删减应用。这个在定制化服务中比较常见。对于此项修改服务。需要我们了解基础的分区常识以及常用的几种基础修改步骤。 通过博文了解💝💝💝 1💝💝💝-----修改rom 解锁 system 分区有什么意义 2💝💝…

JetPack系列教程(八):PDF库——让Android应用也能优雅“翻页”

JetPack系列教程&#xff08;八&#xff09;&#xff1a;PDF库——让Android应用也能优雅“翻页” 在Android开发的世界里&#xff0c;加载PDF文件一直是个让人又爱又恨的“小妖精”。爱它&#xff0c;因为PDF是文档界的“万能钥匙”&#xff1b;恨它&#xff0c;因为原生Andr…

Three.js三大组件:场景(Scene)、相机(Camera)、渲染器(Renderer)

上一篇中我们学习了第一个Three.js场景"Hello World"。这一篇就来学习three.js的核心组件。 此图来源&#xff08;Three.js中文网&#xff09; three.js的核心由三大组件构成&#xff1a;场景(Scene)、相机(Camera)和渲染器(Renderer)。下面我将详细介绍这三大件的作…

AI幻觉终结之后:GPT-5开启的“可靠性”新赛道与开发者生存指南

摘要&#xff1a; Sam Altman关于GPT-5将基本终结幻觉的宣告&#xff0c;不仅仅是一次技术升级&#xff0c;它标志着一个“万物皆可AI&#xff0c;但万事皆需验证”的混乱时代的结束。本文将从一个全新的战略视角出发&#xff0c;探讨当“可靠性”取代“创造性”成为AI竞赛的核…

ubuntu远程桌面很卡怎么解决?

服务端方案 完成XRDP的性能优化配置&#xff1a; 1. 首先检查当前的xrdp.ini文件 grep -n "tcp_send_buffer_bytes" /etc/xrdp/xrdp.ini2. 编辑xrdp.ini文件&#xff0c;修改TCP发送缓冲区大小 sudo sed -i s/#tcp_send_buffer_bytes32768/tcp_send_buffer_bytes4194…

[Linux] Linux系统负载监控 Linux服务管理

目录 Linux系统负载监控 系统负载介绍 查看系统负载 负载解读 top 命令 Linux服务管理 systemd 介绍 系统启动管理进程 基本概念 systemd 架构 unit 类型 查看 unit 列表信息 查看单个 unit 信息 控制系统服务 systemctl 命令 unit 配置文件 例&#xff1a;开发…

vector 手动实现 及遇到的各种细节问题

之前对vector的一些功能使用了一下 接下来手动实现一下vector vector的实现和string还是有不小区别的 有很多地方都有细节的问题不同于string的成员变量一个指针一个size一个capacity的成员变量 vector里面存的是三个迭代器iterator 这的迭代器其实就是模版T的指针 这样就…

OpenStack Neutron中的L2 Agent与L3 Agent:新手友好指南

引言&#xff1a;云网络的幕后英雄 在当今的云计算世界中&#xff0c;OpenStack作为开源云平台的佼佼者&#xff0c;为成千上万的企业提供了灵活、可扩展的基础设施服务。而在OpenStack的众多组件中&#xff0c;Neutron&#xff08;网络服务&#xff09;扮演着至关重要的角色—…

【自用】JavaSE--特殊文件Properties与XML、日志技术

特殊文件概述使用特殊文件可以存储多个有关系的数据&#xff0c;作为系统的配置信息属性文件类似于键值对&#xff0c;一一对应存储数据(比如用户名与密码)XML文件存储多个用户的多个属性更适合&#xff0c;适合存储更复杂的数据Properties注&#xff1a;这个属性文件的后缀即使…

中本聪思想与Web3的困境:从理论到现实的跨越

一、中本聪思想的核心精髓中本聪通过比特币白皮书提出的核心思想&#xff0c;可归纳为三大支柱&#xff1a;去中心化货币体系目标&#xff1a;摆脱中央机构控制&#xff0c;避免通货膨胀和政治干预&#xff08;如2008年金融危机暴露的中心化风险&#xff09;。实现路径&#xf…

Centos 用户管理

一.创建用户 在 root账户 或 sudo 权限下 1. 创建用户 useradd xiaoyangzi2.为该用户设置密码或修改密码 passwd xiaoyangzi3. 将用户加入wheel用户组 在 CentOS 中&#xff0c;属于 wheel 组的用户默认可以使用 sudo 权限。 查看所属用户组: groups xiaoyangzi将 xiaoyangzi 加…

C++枚举算法习题

1. 3的倍数枚举&#xff08;基础&#xff09;题目&#xff1a;在之间有10和50多少个数是3的倍数&#xff1f;列举这些数。 解析&#xff1a;枚举10到50之间的数&#xff0c;判断是否能被3整除。优化&#xff1a;计算第一个≥10的3的倍数&#xff08;1234&#xff09;&#xff0…