)
1. Thymeleaf入门为什么选择它第一次接触Thymeleaf是在一个紧急的Web项目重构中当时团队正被JSP的编译问题和前后端协作效率折磨得焦头烂额。当我发现Thymeleaf的HTML文件可以直接在浏览器中预览时那种终于找到救星的感觉至今难忘。Thymeleaf作为Spring Boot官方推荐的模板引擎最吸引我的三个特点是自然模板设计直接在HTML文件中编写添加th:前缀的属性如th:text就能实现动态渲染。美工设计的静态页面无需修改就能直接使用后端开发时加上Thymeleaf属性即可变成动态页面。无服务预览不像JSP必须启动服务器才能查看效果Thymeleaf模板作为标准HTML双击就能在浏览器中打开。这对前后端分离开发太友好了Spring生态深度整合自动支持Spring表达式语言(SpEL)、表单绑定、国际化等特性。我常用的一个例子是表单处理form th:action{/login} th:object${user} methodpost input th:field*{username} placeholder用户名 input th:field*{password} typepassword /form2. 环境搭建5分钟快速启动最近在帮新人搭建环境时我整理了一套最简流程。以IntelliJ IDEA为例创建Spring Boot项目勾选Spring Web和Thymeleaf依赖或者手动添加pom.xml依赖dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-thymeleaf/artifactId /dependency目录结构关键点src/main/resources ├── static/ # 静态资源(CSS/JS) └── templates/ # Thymeleaf模板配置调优建议 在application.properties中添加# 开发时关闭缓存修改即时生效 spring.thymeleaf.cachefalse # 建议设置编码遇到过GBK乱码坑 spring.thymeleaf.encodingUTF-83. 核心语法实战用户管理页面去年开发后台管理系统时我总结了一套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 classtable tr th:eachuser,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} methodpost !-- 字段绑定 -- input th:field*{email} typeemail !-- 错误提示 -- 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:thhttp://www.thymeleaf.org head th:fragmentcommon-header link th:href{/css/bootstrap.min.css} relstylesheet /head body div th:fragmentheader网站头部/div !-- 内容占位 -- div th:fragmentcontent/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 /html4.2 AJAX局部刷新div iduser-list th:fragmentuserTable !-- 用户列表内容 -- /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,,)})} 搜索相关标签 /a5. 调试技巧与性能优化开发模式配置# 开启模板调试信息 spring.thymeleaf.reactive.full-mode-view-names* # 禁用缓存 spring.thymeleaf.cachefalse缓存优化建议生产环境务必开启缓存对不常变化的模板使用th:inlinenone减少解析开销常见问题排查页面不更新检查是否忘记关闭缓存表达式不生效确保HTML已声明xmlns:th静态资源404检查是否放在static/目录下最近在项目中我们通过模板片段缓存和资源压缩使页面加载速度提升了40%。Thymeleaf可能不是性能最高的模板引擎但它优秀的开发体验和与Spring生态的无缝集成让它成为我们团队的首选方案。