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项目中获取。

测试建议

  1. 先通过浏览器直接验证页面效果
  2. 结合JUnit测试进行深度验证

⚠️ 注意:本文仅覆盖常用工具对象,完整功能列表请参考Thymeleaf官方文档


原始标题:Spring and Thymeleaf 3: Expressions