[Java实战]Spring Boot 整合 Thymeleaf (十)
[Java实战]Spring Boot 整合 Thymeleaf (十)
引言
在 Java Web 开发领域,Thymeleaf 以其自然模板、无缝 Spring 集成和强大的表达式引擎脱颖而出,成为 Spring Boot 官方推荐的模板引擎。本文将深度解析 Spring Boot 与 Thymeleaf 的整合技巧,涵盖基础配置、实战案例、性能优化与开发陷阱规避,助你快速构建高效、优雅的视图层。
一、Thymeleaf 核心优势与架构解析
1. 为什么选择 Thymeleaf?
特性 | 说明 |
---|---|
自然模板 | 直接在浏览器中预览,无需后端渲染,提升前后端协作效率 |
Spring 深度集成 | 支持 Spring EL 表达式,轻松访问 Spring MVC 模型数据 |
模块化设计 | 支持布局方言(Layout Dialect),实现页面复用 |
安全性 | 自动转义 HTML 内容,防止 XSS 攻击 |
2. Thymeleaf 核心组件
二、Spring Boot 整合 Thymeleaf 全流程
1. 环境准备
- JDK 1.8+(推荐使用 LTS 版本)
- Spring Boot 2.x(本文基于 2.1.8)
- Maven/Gradle(本文使用 Maven)
2. 添加依赖
<!-- Thymeleaf 核心依赖 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency><!-- 可选:Thymeleaf 布局方言(页面复用) -->
<dependency><groupId>nz.net.ultraq.thymeleaf</groupId><artifactId>thymeleaf-layout-dialect</artifactId><version>3.2.1</version>
</dependency>
3. 基础配置(application.yml)
spring:thymeleaf:mode: HTML # 模板模式encoding: UTF-8 # 文件编码cache: false # 开发关闭缓存prefix: classpath:/templates/ # 模板路径suffix: .html # 文件后缀servlet:content-type: text/html# 启用布局方言additional-packages: nz.net.ultraq.thymeleaf.layoutdialect
三、Thymeleaf 实战案例
案例 1:基础数据渲染
Controller
@Controller
public class UserController {@GetMapping ("/user")public String userInfo(Model model) {User u = new User();u.setAge(25);u.setEmail("alice@example.com");u.setName("Alice");model.addAttribute("user", u);return "user";}
}
模板(user.html)
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head><title>用户详情</title>
</head>
<body><h1 th:text="${user.name}">默认名称</h1><p>年龄: <span th:text="${user.age}">0</span></p><p th:if="${user.email != null}" th:text="'邮箱: ' + ${user.email}"></p>
</body>
</html>
案例 2:表单处理(含验证)
表单模板(form.html)
<form th:action="@{/submit}" th:object="${user}" method="post"><input type="text" th:field="*{name}" placeholder="姓名"><span th:if="${#fields.hasErrors('name')}" th:errors="*{name}"></span><input type="number" th:field="*{age}" placeholder="年龄"><span th:if="${#fields.hasErrors('age')}" th:errors="*{age}"></span><button type="submit">提交</button>
</form>
Controller 校验逻辑
@PostMapping("/submit")
public String submitForm(@Valid @ModelAttribute("user") User user, BindingResult result) {if (result.hasErrors()) {return "form";}return "redirect:/success";
}
四、高阶技巧与性能优化
1. 布局复用(Layout Dialect)
定义布局模板(layout.html)
<!DOCTYPE html>
<html xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">
<head><title layout:title-pattern="$CONTENT_TITLE - 系统名称">默认标题</title>
</head>
<body><header>...</header><div layout:fragment="content"></div><footer>...</footer>
</body>
</html>
子页面继承布局(home.html)
<html layout:decorate="~{layout}">
<head><title>首页</title>
</head>
<body><div layout:fragment="content"><h1>欢迎页面内容</h1></div>
</body>
</html>
2. 缓存优化(生产环境)
spring:thymeleaf:cache: true # 生产环境开启缓存# 模板解析缓存配置cache-manager:max-size: 100ttl: 3600
3. 自定义方言扩展
public class MyDialect extends AbstractProcessorDialect {// 实现自定义标签逻辑
}@Configuration
public class ThymeleafConfig {@Beanpublic MyDialect myDialect() {return new MyDialect();}
}
五、常见问题与解决方案
1. 模板解析失败(404)
- 检查点:
- 模板文件是否位于
src/main/resources/templates
- 文件名是否与 Controller 返回的视图名一致
- 是否缺少
<!DOCTYPE html>
声明
- 模板文件是否位于
2. 表达式不生效
- 排查步骤:
- 确保
html
标签添加命名空间:xmlns:th="http://www.thymeleaf.org"
- 检查表达式语法:
${...}
用于变量,*{...}
用于表单对象 - 启用调试模式:
spring.thymeleaf.cache=false
- 确保
3. 静态资源加载失败
- 正确引用方式:
<link th:href="@{/css/style.css}" rel="stylesheet"> <script th:src="@{/js/app.js}"></script>
- 确保资源位置:
src/main/resources/static/css/style.css
六、总结
Spring Boot 与 Thymeleaf 的组合为现代 Web 开发提供了高效、安全、易维护的解决方案。通过本文,您已掌握:
- 快速整合:从依赖配置到基础数据渲染
- 实战进阶:表单验证、布局复用、自定义扩展
- 性能调优:缓存策略与生产环境最佳实践
- 问题排查:常见错误的诊断与修复
扩展思考:如何结合 Thymeleaf 与前端框架(如 Vue.js)实现渐进式开发?欢迎评论区探讨!
附录
- Thymeleaf 官方文档
- Spring Boot 模板引擎指南
希望本教程对您有帮助,请点赞❤️收藏⭐关注支持!欢迎在评论区留言交流技术细节!
相关文章:

[Java实战]Spring Boot 整合 Thymeleaf (十)
[Java实战]Spring Boot 整合 Thymeleaf (十) 引言 在 Java Web 开发领域,Thymeleaf 以其自然模板、无缝 Spring 集成和强大的表达式引擎脱颖而出,成为 Spring Boot 官方推荐的模板引擎。本文将深度解析 Spring Boot 与 Thymelea…...
NGINX 开源与社区动态:从基石到浪潮,持续演进的生态力量
NGINX 之所以能够成为全球应用最为广泛的 Web 服务器和反向代理软件之一,其成功的核心驱动力无疑是开源。开放的源代码、活跃的社区参与以及透明的开发过程,共同铸就了 NGINX 的辉煌。然而,正如所有大型开源项目一样,NGINX 的开源之路也并非一帆风顺,其社区动态也时常涌现…...

监控易一体化运维:网络流量分析的智慧引擎
在数字化时代,企业运营与网络紧密相连,网络性能的优劣直接影响企业的发展步伐。网络流量管理在企业网络运维中占据非常关键的地位。监控易一体化运维管理软件,凭借其强大的网络流量分析功能,为企业网络的稳定高效运行提供了有力保…...

IDEA+git将分支合并到主分支、IDEA合并分支
文章目录 一、合并分支二、可能遇到的问题2.1、代码冲突 开发过程中我们可能在开发分支(dev)中进行开发,等上线后将代码合并到主分支(master)中,本文讲解如何在IDEA中将dev分支的代码合并到master分支中。 一、合并分支 功能说明:将dev分支的…...
QML学习01(设置宽度、高度、坐标点、标题,信号与槽,键盘事件)
QML学习 1、前言2、QML3、QML和QWidget的区别3、QtQuick下的Windows应用4、总结 1、前言 记录一下QML学习的过程,方便自己日后回顾,也可以给有需要的人提供帮助。 2、QML QML是 Qt 框架中的一种声明式编程语言,专门用于快速设计和开发用户…...

uniapp+vue3中自动导入ref等依赖
前言: 在我们使用uni-appvue3创建项目,开发的过程中,老是需要导入我们的ref、onshow等,那么能不能自动导入,不用我们每个页面都写呢?是没问题的,这里让他的小帮手来帮你减轻负担:他就…...

【.net core】.net core 6.0添加WCF服务引用
在 .NET Core 6.0 (.NET 6) 中,调用 WCF 服务 是完全支持的,只要服务使用的是 basicHttpBinding 或类似 HTTP 协议的绑定(如 wsHttpBinding,但不推荐) .NET Core不支持 net.tcp,只能用http形式。 .net core调用WCF服务…...
React学习———Redux 、 React Redux和react-persist
Redux Redux是一个流行的JavaScript状态管理库,通常用于React等前端框架结合使用。Redux 的设计思想是让应用的状态变得可预测、可追踪、易于调试和测试。 Redux的核心l理念 单一数据源:整个应用的状态被存储在一个唯一的Store对象中,所有…...

小结: js 在浏览器执行原理
浏览器多进程与多线程 现代浏览器的标签环境隔离主要通过多进程架构和多线程机制实现,以确保安全、性能和稳定性。以下是浏览器实现标签环境隔离的多进程和多线程交互架构的详细解析: ------------------- ------------------- -----------…...

【实战篇】低代码报表开发——平台运营日报表的开发实录
前言 myBuilder的推广有段时间了,想开发个报表看看平台运营的情况。采用myBuilder强大的报表、数据交换模块功能,直接开干。 1. 报表指标思考与概要设计 首先是报表模块的概要设计,先构思一下,我希望报表能查看新用户注册、活跃…...
51 单片机头文件 reg51.h 和 reg52.h 详解
51 单片机头文件详解 51 单片机的头文件reg51.h和reg52.h是开发中非常重要的文件,它们定义了单片机的特殊功能寄存器 (SFR) 和位地址。以下是对这两个头文件的详细解析: 1. 头文件概述 reg51.h:针对标准 8051 单片机(4KB ROM, 128B RAM) reg52.h:针对增强型 8052 单片…...
PyTorch中.item()函数:提取单元素张量值
PyTorch中,.item()函数是什么 在PyTorch代码中,.item() 主要用于从一个只包含单个元素的张量(Tensor)中提取出对应的Python标量值 ,具体作用和使用场景如下: 作用 获取数值:当通过计算得到一个张量,且该张量仅包含一个元素时,使用 .item() 方法可以方便地将这个元素…...

使用Qt操作SQLite数据库
目录 一、开发成果二、环境配置与基础概念1. 引入SQL模块2. SQLite数据库特性三、数据库连接与操作流程1. 创建并连接数据库2. 执行SQL语句3. 查询与遍历数据四、进阶操作与最佳实践1. 事务处理2. 错误处理3. 使用模型/视图架构五、完整代码示例(学生人员管理)1.mainwindow.h…...

ZYNQ笔记(二十):Clocking Wizard 动态配置
版本:Vivado2020.2(Vitis) 任务:ZYNQ PS端 通过 AXI4Lite 接口配置 Clocking Wizard IP核输出时钟频率 目录 一、介绍 二、寄存器定义 三、配置 四、PS端代码 一、介绍 Xilinx 的 Clock Wizard IP核 用于在 FPGA 中生成和管理…...

探秘高可用负载均衡集群:企业网络架构的稳固基石
目录 高可用负载均衡集群 一、集群的本质与核心价值 二、高可用集群与负载均衡集群的定义 高可用集群(HA Cluster) 负载均衡集群(Load Balance Cluster) 三.高可用与负载均衡的完美融合 四.…...

JAVA:ResponseBodyEmitter 实现异步流式推送的技术指南
1、简述 在许多场景下,我们希望后端能够以流式、实时的方式推送数据给前端,比如消息通知、日志实时展示、进度条更新等。Spring Boot 提供了 ResponseBodyEmitter 机制,可以让我们在 Controller 中异步地推送数据,从而实现实时流式输出。 样例代码:https://gitee.com/lh…...

CSS- 1.1 css选择器
本系列可作为前端学习系列的笔记,代码的运行环境是在HBuilder中,小编会将代码复制下来,大家复制下来就可以练习了,方便大家学习。 HTML系列文章 已经收录在前端专栏,有需要的宝宝们可以点击前端专栏查看! 系…...

ABP-Book Store Application中文讲解 - Part 2: The Book List Page
本章用于介绍如何创建Book List Page。 TBD 1. 汇总 ABP-Book Store Application中文讲解-汇总-CSDN博客 2. 前一章 ABP-Book Store Application中文讲解 - Part 1: Creating the Server Side 项目之间的引用关系。 目录 1. 多语言配置 1.1 zh-Hans.json 1.2 en.jso…...

08 web 自动化之 PO 设计模式详解
文章目录 一、什么是 POM二、如何基于 POM 进行自动化框架架构?1、base 层封装2、pageobjects 层封装3、TestCases 层封装 三、元素和方法分离&数据分离1、哪些部分可以进行分离2、示例代码 四、总结 一、什么是 POM POM page object model 页面对象模型 WEB 自…...

langchain4j集成QWen、Redis聊天记忆持久化
langchain4j实现聊天记忆默认是基于进程内存的方式,InMemoryChatMemoryStore是具体的实现了,是将聊天记录到一个map中,如果用户大的话,会造成内存溢出以及数据安全问题。位了解决这个问题 langchain4提供了ChatMemoryStore接口&am…...

WebGL图形编程实战【7】:变换流水线 × 坐标系与矩阵精讲
变换流水线 #mermaid-svg-Omabd9LSNCdIvWqB {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Omabd9LSNCdIvWqB .error-icon{fill:#552222;}#mermaid-svg-Omabd9LSNCdIvWqB .error-text{fill:#552222;stroke:#552222;…...
在Angular中使用Leaflet构建地图应用
Leaflet是一个用于创建地图的JavaScript库,它包含许多功能,并且非常适用于移动设备。 准备 nodejs: v20.15.0 npm: 10.7.0 angular: 19.2.10 创建一个地图应用工程 npx angular/cli new my-leaflet-app --stylecss --routingfalse --skip-tests提示 …...
鸿蒙next播放B站视频横屏后的问题
(此文讨论范围为b站视频链接,且不包括b站直播链接;android/iOS的webview播放b站视频完全没有这么多问题) 1、竖屏播放没问题 从一个竖屏页p1点击进入视频页p2,p2页仍为竖屏; p2页有一Web组件,…...

DVWA靶场通关笔记-SQL注入(SQL Injection Medium级别)
目录 一、SQL Injection 二、代码审计(Medium级别) 1、源码分析 (1)index.php (2)Medium.php 2、渗透思路 (1)SQL安全问题分析 (2)SQL渗透思路 三、…...

vue异步导入
vue的异步导入 大家开发vue的时候或多或少路由的异步导入 component: () >import(“/views/A_centerControl/intelligent-control/access-user-group”),当然这是路由页面,那么组件也是可以异步导入的 使用方式 组件的异步导入非常简单,主要是一个…...
【Redis】压缩列表
目录 1、背景2、压缩列表【1】底层结构【2】特性【3】优缺点 1、背景 ziplist(压缩列表)是redis中一种特殊编码的双向链表数据结构,主要用于存储小型列表和哈希表。它通过紧凑的内存布局和特殊的编码方式来节省内存空间。 2、压缩列表 【1…...

2025年,如何制作并部署一个完整的个人博客网站
欢迎访问我的个人博客网站:欢迎来到Turnin的个人博客 github开源地址:https://github.com/Re-restart/my_website 前言 2024年年初,从dji实习回来之后,我一直想着拓宽自己的知识边界。在那里我发现虽然大家不用java,…...
.NET 8 + Angular WebSocket 高并发性能优化
.NET 8 Angular WebSocket 高并发性能优化。 .NET 8 WebSocket 高并发性能优化 WebSocket 是一种全双工通信协议,允许客户端和服务端之间保持持久连接。在高并发场景下,优化 WebSocket 的性能至关重要。以下是针对 .NET 8 中 WebSocket 高并发性能优化…...

腾讯云运营开发 golang一面
redis为什么单线程会快 每秒10w吞吐量 io多路复用 一个文件描述符整体拷贝;调用epoll_ctl 单个传递 内核遍历文件描述符判断是否有事件发送;回调函数列表维护 修改有事件发送的socket为可读或可写,返回整个文件描述符;返回链…...

一个简单的静态页面
这个页面采用了现代化的 UI 设计,包括卡片式布局、微交互动画、分层设计和响应式结构。页面结构清晰,包含导航栏、英雄区域、功能介绍、产品特性、用户评价和联系表单等完整组件,可作为企业官网或产品介绍页面的基础模板。 登录后复制 <!D…...