1. 引言
Thymeleaf 是一个强大的Java模板引擎,专门用于处理和生成HTML、XML、JavaScript、CSS及纯文本。关于Thymeleaf与Spring的基础集成,可以参考这篇入门文章。
除了基础功能外,Thymeleaf还提供了一套实用工具对象,帮助我们在应用中高效完成常见任务。本文将深入探讨Thymeleaf 3.0的核心特性——表达式工具对象,重点介绍在Spring MVC应用中处理日期、日历、字符串、对象等场景的实用技巧。
2. Maven依赖配置
要集成Thymeleaf与Spring,首先需要添加以下依赖:
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
<version>3.0.15.RELEASE</version>
</dependency>
⚠️ 注意:
- Spring 4项目需使用
thymeleaf-spring4
而非thymeleaf-spring5
- 最新版本可查阅Maven中央仓库
3. 表达式工具对象
在深入核心功能前,建议先了解Thymeleaf 3.0的配置方法。本文通过Spring控制器和HTML文件演示所有特性,以下是完整的工具对象列表:
工具对象 | 功能描述 |
---|---|
#dates |
处理java.util.Date 对象 |
#calendars |
处理java.util.Calendar 对象 |
#numbers |
数字格式化工具 |
#strings |
字符串操作工具 |
#objects |
通用Java对象工具 |
#bools |
布尔值评估工具 |
#arrays |
数组操作工具 |
#lists |
列表操作工具 |
#sets |
集合操作工具 |
#maps |
映射操作工具 |
#aggregates |
聚合计算工具 |
#messages |
外部化消息获取工具 |
3.1. 日期对象处理
#dates
工具对象提供了丰富的日期处理方法,所有方法以#dates.functionName()
形式调用。假设Spring模型中已添加date
变量:
基础格式化
<!-- ISO8601标准格式 -->
<p th:text="${#dates.formatISO(date)}"></p>
<!-- 自定义格式 -->
<p th:text="${#dates.format(date, 'dd-MM-yyyy HH:mm')}"></p>
其他实用方法
<!-- 获取星期名称 -->
<p th:text="${#dates.dayOfWeekName(date)}"></p>
<!-- 创建当前时间对象 -->
<p th:text="${#dates.createNow()}"></p>
<!-- 创建当前日期对象(时间设为00:00) -->
<p th:text="${#dates.createToday()}"></p>
✅ 关键点:
formatISO()
自动遵循ISO8601标准format()
支持任意日期格式模式createNow()
和createToday()
的区别在于时间部分
3.2. 日历对象处理
#calendars
与#dates
功能类似,但专门处理java.util.Calendar
对象:
<!-- 基础格式化 -->
<p th:text="${#calendars.formatISO(calendar)}"></p>
<p th:text="${#calendars.format(calendar, 'dd-MM-yyyy HH:mm')}"></p>
<p th:text="${#calendars.dayOfWeekName(calendar)}"></p>
<!-- 创建新实例 -->
<p th:text="${#calendars.createNow().getTime()}"></p>
<p th:text="${#calendars.createToday().getFirstDayOfWeek()}"></p>
⚠️ 注意:可直接调用Calendar类的任何方法(如getTime()
、getFirstDayOfWeek()
)
3.3. 数字处理
#numbers
工具对象提供强大的数字格式化功能,假设模型中有double
类型的num
变量:
小数格式化
<!-- 基础格式:最小2位整数,精确3位小数 -->
<p th:text="${#numbers.formatDecimal(num,2,3)}"></p>
<!-- 指定千分位分隔符 -->
<p th:text="${#numbers.formatDecimal(num,2,3,'COMMA')}"></p>
✅ 分隔符选项:
POINT
(点号)COMMA
(逗号)WHITESPACE
(空格)NONE
(无分隔符)DEFAULT
(按本地化设置)
序列生成
<!-- 生成0到2的整数序列 -->
<p th:each="number: ${#numbers.sequence(0,2)}">
<span th:text="${number}"></span>
</p>
<!-- 生成0到4的步进序列(步长为2) -->
<p th:each="number: ${#numbers.sequence(0,4,2)}">
<span th:text="${number}"></span>
</p>
❌ 踩坑提示:序列区间是闭区间(包含起止值)
3.4. 字符串操作
#strings
是功能最全面的工具对象,提供空安全的字符串处理:
空值检查
<!-- 检查空字符串 -->
<p th:text="${#strings.isEmpty(string)}"></p> <!-- 返回false -->
<!-- 检查null -->
<p th:text="${#strings.isEmpty(nullString)}"></p> <!-- 返回true -->
<!-- 指定默认值 -->
<p th:text="${#strings.defaultString(emptyString,'Empty String')}"></p>
子串操作
<p th:text="${#strings.indexOf(name,frag)}"></p> <!-- 查找子串位置 -->
<p th:text="${#strings.substring(name,3,5)}"></p> <!-- 截取子串 -->
<p th:text="${#strings.substringAfter(name,prefix)}"></p> <!-- 获取前缀后部分 -->
<p th:text="${#strings.substringBefore(name,suffix)}"></p> <!-- 获取后缀前部分 -->
<p th:text="${#strings.replace(name,'las','ler')}"></p> <!-- 替换子串 -->
比较与连接
<p th:text="${#strings.equals(first, second)}"></p> <!-- 精确比较 -->
<p th:text="${#strings.equalsIgnoreCase(first, second)}"></p> <!-- 忽略大小写比较 -->
<p th:text="${#strings.concat(values...)}"></p> <!-- 连接字符串 -->
<p th:text="${#strings.concatReplaceNulls(nullValue, values...)}"></p> <!-- 连接并替换null -->
文本样式
<p th:text="${#strings.abbreviate(string,5)}"></p> <!-- 缩略文本(最大5字符) -->
<p th:text="${#strings.capitalizeWords(string)}"></p> <!-- 单词首字母大写 -->
✅ 优势:所有方法都经过空值安全处理,避免NPE问题
3.5. 聚合计算
#aggregates
提供空安全的集合计算功能:
<!-- 数组求和与平均值 -->
<p th:text="${#aggregates.sum(array)}"></p>
<p th:text="${#aggregates.avg(array)}"></p>
<!-- 集合求和与平均值 -->
<p th:text="${#aggregates.sum(set)}"></p>
<p th:text="${#aggregates.avg(set)}"></p>
✅ 适用场景:快速计算数组/集合的数值统计量
4. 总结
本文系统介绍了Thymeleaf 3.0中表达式工具对象的核心功能,包括:
- 日期/日历的灵活格式化
- 数字的精确控制显示
- 字符串的空安全操作
- 集合的聚合计算
完整示例代码可在GitHub项目中获取。
测试建议:
- 先通过浏览器直接验证页面效果
- 结合JUnit测试进行深度验证
⚠️ 注意:本文仅覆盖常用工具对象,完整功能列表请参考Thymeleaf官方文档。