Skip to content

4.14 数据转换/格式化

Thymeleaf 为变量表达式(${...})和选择表达式(*{...})定义了双大括号语法${{...}}/*{{...}}),允许通过配置的转换服务(Conversion Service) 对数据进行转换或格式化。

最基础的使用方式如下:

html
<!-- 对 user.lastAccessDate 执行格式化转换后渲染 -->
<td th:text="${{user.lastAccessDate}}">2026-01-16 10:00:00</td>

注意到这里的双层大括号了吗:${{...}}。这种写法会指示 Thymeleaf 将 user.lastAccessDate 表达式的结果传递给转换服务,并要求转换服务在输出结果之前执行格式化操作(将其转换为字符串)。

假设 user.lastAccessDate 的类型为 java.util.Calendar,那么只要已注册了转换服务(IStandardConversionService 的实现类),且该服务中包含从 Calendar 到 String 的有效转换规则,此转换就会生效。

IStandardConversionService 的默认实现类(即 StandardConversionService 类)在将任意对象转换为字符串时,仅会调用该对象的 .toString() 方法。如需了解如何注册自定义的转换服务实现类,可参考 “配置进阶”章节

INFO

官方的 thymeleaf-spring3/thymeleaf-spring4 集成包,会将 Thymeleaf 的转换服务机制与 Spring 自身的 ConversionService 无缝整合。你在 Spring 配置中声明的转换服务ConversionService)、格式化器Formatter)会自动对 ${{...}}/*{{...}} 生效。

  • 例如配置了 DateFormatter 后,${{user.lastAccessDate}} 会直接按你定义的格式(如 yyyy-MM-dd HH:mm:ss)输出,无需手动调用 #dates.format()

关键注意事项

  • 双大括号 vs 工具对象

    • 双大括号是“通用化”的格式化方式,依赖全局配置的转换服务,适合统一格式规范;
    • #dates/#temporals 等工具对象是“手动”格式化方式,适合临时调整格式;
    • 示例对比:
      html
      <!-- 方式1:双大括号(依赖 Spring 转换服务,自动按配置格式输出) -->
      <td th:text="${{user.lastAccessDate}}">2026-01-16</td>
      
      <!-- 方式2:工具对象(手动指定格式) -->
      <td th:text="${#temporals.format(user.lastAccessDate, 'yyyy-MM-dd')}">2026-01-16</td>
  • 自定义转换服务: 若未使用 Spring 集成包,需手动注册自定义 IStandardConversionService 实现(参考 Thymeleaf 官方文档的「More on Configuration」章节),才能让双大括号实现自定义格式化。

  • 选择表达式的双大括号: 选择表达式也支持双大括号,用法与变量表达式一致:

    html
    <div th:object="${user}">
      <!-- 对选中对象的 lastAccessDate 执行格式化 -->
      <td th:text="*{{lastAccessDate}}">2026-01-16</td>
    </div>

总结

  1. 双大括号 ${{...}}/*{{...}} 是 Thymeleaf 基于转换服务的通用数据格式化语法,核心是将表达式结果交给转换服务处理后再渲染;
  2. 默认转换服务仅调用 .toString(),实际开发中需结合 Spring 集成包,复用 Spring 的 ConversionService/Formatter 实现自定义格式化;
  3. 双大括号适合统一格式规范,#dates/#temporals 等工具对象适合临时格式调整,可根据场景选择使用。