news 2026/7/16 14:28:57

Thymeleaf实战:从零构建动态Web页面(附完整代码)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Thymeleaf实战:从零构建动态Web页面(附完整代码)

1. Thymeleaf入门:为什么选择它?

第一次接触Thymeleaf是在一个紧急的Web项目重构中,当时团队正被JSP的编译问题和前后端协作效率折磨得焦头烂额。当我发现Thymeleaf的HTML文件可以直接在浏览器中预览时,那种"终于找到救星"的感觉至今难忘。

Thymeleaf作为Spring Boot官方推荐的模板引擎,最吸引我的三个特点是:

  1. 自然模板设计:直接在HTML文件中编写,添加th:前缀的属性(如th:text)就能实现动态渲染。美工设计的静态页面无需修改就能直接使用,后端开发时加上Thymeleaf属性即可变成动态页面。

  2. 无服务预览:不像JSP必须启动服务器才能查看效果,Thymeleaf模板作为标准HTML,双击就能在浏览器中打开。这对前后端分离开发太友好了!

  3. Spring生态深度整合:自动支持Spring表达式语言(SpEL)、表单绑定、国际化等特性。我常用的一个例子是表单处理:

<form th:action="@{/login}" th:object="${user}" method="post"> <input th:field="*{username}" placeholder="用户名"> <input th:field="*{password}" type="password"> </form>

2. 环境搭建:5分钟快速启动

最近在帮新人搭建环境时,我整理了一套最简流程。以IntelliJ IDEA为例:

  1. 创建Spring Boot项目
    • 勾选Spring WebThymeleaf依赖
    • 或者手动添加pom.xml依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
  1. 目录结构关键点

    src/main/resources ├── static/ # 静态资源(CSS/JS) └── templates/ # Thymeleaf模板
  2. 配置调优建议: 在application.properties中添加:

    # 开发时关闭缓存,修改即时生效 spring.thymeleaf.cache=false # 建议设置编码(遇到过GBK乱码坑) spring.thymeleaf.encoding=UTF-8

3. 核心语法实战:用户管理页面

去年开发后台管理系统时,我总结了一套Thymeleaf的高频用法:

3.1 数据绑定:用户信息展示

<div th:object="${user}"> <h2>用户详情</h2> <p>姓名:<span th:text="*{name}">张三</span></p> <!-- 日期格式化 --> <p>注册时间: <span th:text="${#dates.format(user.createTime,'yyyy-MM-dd HH:mm')}"> </span></p> </div>

提示:${}用于直接访问模型属性,*{}用于选择当前对象属性

3.2 列表迭代:用户表格

<table class="table"> <tr th:each="user,stat : ${userList}"> <td th:text="${stat.count}">序号</td> <td th:text="${user.name}">姓名</td> <!-- 条件判断 --> <td th:text="${user.vip} ? 'VIP用户' : '普通用户'"></td> </tr> </table>

踩坑记录:stat是状态变量,包含index/count/even等有用属性

3.3 表单处理:用户注册

<form th:action="@{/users}" th:object="${user}" method="post"> <!-- 字段绑定 --> <input th:field="*{email}" type="email"> <!-- 错误提示 --> <p th:if="${#fields.hasErrors('email')}" th:errors="*{email}">错误提示</p> </form>

实测发现:th:field会自动绑定name/value/id属性

4. 高级技巧:提升开发效率

4.1 模板布局:避免重复代码

定义公共模板layout.html

<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head th:fragment="common-header"> <link th:href="@{/css/bootstrap.min.css}" rel="stylesheet"> </head> <body> <div th:fragment="header">网站头部</div> <!-- 内容占位 --> <div th:fragment="content"></div> <script th:src="@{/js/jquery.js}"></script> </body> </html>

子页面引用:

<html th:replace="~{layout :: html}"> <body> <div th:replace="~{layout :: header}"></div> <div th:insert="~{layout :: content}"> <!-- 页面特有内容 --> </div> </body> </html>

4.2 AJAX局部刷新

<div id="user-list" th:fragment="userTable"> <!-- 用户列表内容 --> </div> <script> $('#refresh-btn').click(function(){ $('#user-list').load('/users #user-list'); }); </script>

控制器需返回片段:

@GetMapping("/users") public String getUsers(Model model) { model.addAttribute("users", userService.findAll()); return "users :: userTable"; // 只返回userTable片段 }

4.3 实用工具函数

这些内置工具我经常用:

<!-- 字符串处理 --> <p th:text="${#strings.substring(user.bio,0,100)} + '...'"></p> <!-- 集合判空 --> <div th:unless="${#lists.isEmpty(comments)}"> <p th:text="'共' + ${#lists.size(comments)} + '条评论'"></p> </div> <!-- 快速创建URL参数 --> <a th:href="@{/search(keywords=${#strings.listJoin(tags,',')})}"> 搜索相关标签 </a>

5. 调试技巧与性能优化

  1. 开发模式配置

    # 开启模板调试信息 spring.thymeleaf.reactive.full-mode-view-names=* # 禁用缓存 spring.thymeleaf.cache=false
  2. 缓存优化建议

    • 生产环境务必开启缓存
    • 对不常变化的模板使用th:inline="none"减少解析开销
  3. 常见问题排查

    • 页面不更新:检查是否忘记关闭缓存
    • 表达式不生效:确保HTML已声明xmlns:th
    • 静态资源404:检查是否放在static/目录下

最近在项目中,我们通过模板片段缓存和资源压缩,使页面加载速度提升了40%。Thymeleaf可能不是性能最高的模板引擎,但它优秀的开发体验和与Spring生态的无缝集成,让它成为我们团队的首选方案。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/16 14:28:46

从旋转矩阵到齐次变换:机器人空间运动的数学语言

1. 刚体位姿描述&#xff1a;从坐标系到旋转矩阵 想象你桌上放着一部手机。要精确描述它的摆放状态&#xff0c;我们需要两个关键信息&#xff1a; 位置 &#xff08;放在桌子的哪个位置&#xff09;和 姿态 &#xff08;是横放、竖放还是斜着放&#xff09;。这就是机器人…

作者头像 李华
网站建设 2026/7/16 14:28:24

10分钟掌握CellPose:零代码实现AI细胞分割的终极指南

10分钟掌握CellPose&#xff1a;零代码实现AI细胞分割的终极指南 【免费下载链接】cellpose a generalist algorithm for cellular segmentation with human-in-the-loop capabilities 项目地址: https://gitcode.com/gh_mirrors/ce/cellpose CellPose是一款革命性的AI驱…

作者头像 李华
网站建设 2026/7/16 14:27:44

C++核心进阶:从指针内存管理到面向对象与STL实战

1. 项目概述&#xff1a;C入门知识的下半场上一篇文章我们聊了C的“面子”&#xff0c;也就是那些最基础的语法和概念&#xff0c;算是把门给推开了。这篇咱们接着往里走&#xff0c;聊聊C的“里子”。如果说上半部分是让你知道怎么用砖头&#xff0c;那下半部分就是教你如何用…

作者头像 李华
网站建设 2026/7/16 14:26:39

操作系统——时间片轮转调度算法(RR)的实战解析与性能调优

1. 时间片轮转调度算法&#xff08;RR&#xff09;的核心原理 时间片轮转调度算法&#xff08;Round-Robin Scheduling&#xff09;是操作系统中最经典的进程调度算法之一。它的核心思想就像餐厅里排队取餐的场景&#xff1a;每个顾客&#xff08;进程&#xff09;按顺序获得固…

作者头像 李华
网站建设 2026/7/16 14:25:54

运放电源时序问题解析与五种工程解决方案

1. 运算放大器电源上电时序问题的真实案例去年调试一块多路ADC采集板时&#xff0c;遇到过诡异现象&#xff1a;系统上电后&#xff0c;信号调理通道偶尔会出现5mV左右的直流偏移。这个误差对12位ADC来说相当于10个LSB&#xff0c;完全不可接受。排查两周后发现&#xff0c;问题…

作者头像 李华