Skip to content

4.8 字面量替换

字面量替换(Literal substitutions)提供了一种简洁的方式来格式化包含变量值的字符串,无需通过 '...' + '...' 的方式拼接文本和变量。

这类替换必须用竖线 | 包裹,语法示例如下:

html
<span th:text="|Welcome to our application, ${user.name}!|">
  Welcome to our application, Guest!
</span>

这段代码完全等价于使用 + 拼接的写法:

html
<span th:text="'Welcome to our application, ' + ${user.name} + '!'">
  Welcome to our application, Guest!
</span>

字面量替换可以和其他类型的表达式(如纯变量表达式、文本拼接)结合,灵活构建复杂文本:

html
<!-- 组合变量表达式 + 文本拼接 + 字面量替换,结果如 "Hello John, 28 years old!" -->
<span th:text="${onevar} + ' ' + |${twovar}, ${threevar}|">
</span>

关键注意事项

  1. 严格的表达式类型限制|...| 内部仅允许使用变量表达式(${...}/*{...})和消息表达式(#{...},不支持以下内容:

    • 文本字面量('...'):❌ |'Hello' ${user.name}|
    • 布尔/数字字面量:❌ |${user.age} + 2|、❌ |${user.isAdmin()} == true|
    • 条件表达式:❌ |${user.age} ?: 18|
    • 空格外的特殊运算:❌ |${user.score} * 100|

    ✅ 合法示例:

    html
    <!-- 变量表达式 + 消息表达式 -->
    <span th:text="|#{home.welcome}, ${user.name} (${user.id})|">
      Welcome, Guest (0)
    </span>
  2. 空格与特殊字符支持|...| 内部可自由使用空格、标点等字符,无需额外转义(只要这些字符不属于表达式语法):

    html
    <!-- 包含逗号、空格、感叹号,合法 -->
    <span th:text="|Dear ${user.name}, your order #${order.id} is ready!|">
      Dear Guest, your order #0 is ready!
    </span>

字面量替换 vs 文本拼接

| 特性 | 字面量替换(|...|)| 文本拼接(+)| |---------------------|---------------------------------|---------------------------------| | 语法简洁性 | 高(无需频繁写单引号和 +)| 低(需手动拼接单引号和 +)| | 支持的表达式类型 | 仅 ${...}/*{...}/#{...} | 所有类型(文本、变量、运算等)| | 适用场景 | 简单的“文本+变量”组合 | 复杂的多段拼接/运算组合 |

总结

  1. 字面量替换 |...| 是 Thymeleaf 简化“文本+变量/消息表达式”拼接的语法糖,比 + 更简洁易读;
  2. 核心限制:|...| 内部仅支持变量/消息表达式,不支持文本/布尔/数字字面量、运算、条件表达式等;
  3. 简单拼接优先用字面量替换,复杂逻辑(含运算、条件)仍需用 + 拼接或拆分表达式。