Skip to content

4 标准表达式语法

在继续开发虚拟杂货店应用前,我们先暂停一下,学习 Thymeleaf 标准方言(Standard Dialect)中最重要的部分:Thymeleaf 标准表达式语法

我们已经见过该语法支持的两种合法属性值类型:消息表达式和变量表达式:

html
<p th:utext="#{home.welcome}">Welcome to our grocery store!</p>

<p>Today is: <span th:text="${today}">13 february 2011</span></p>

但表达式的类型远不止这些,我们已知的表达式也还有更多有趣的细节值得学习。首先,快速梳理一下标准表达式的核心特性:

1. 简单表达式

  • 变量表达式:${...}
  • 选择变量表达式:*{...}
  • 消息表达式:#{...}
  • 链接 URL 表达式:@{...}
  • 片段表达式:~{...}

2. 字面量

  • 文本字面量:'one text''Another one!'
  • 数字字面量:0343.012.3
  • 布尔字面量:truefalse
  • 空字面量:null
  • 字面量标记:onesometextmain

3. 文本操作

  • 字符串拼接:+
  • 字面量替换:|The name is ${name}|

4. 算术运算

  • 二元运算符:+-*/%
  • 负号(一元运算符):-

5. 布尔运算

  • 二元运算符:andor
  • 布尔取反(一元运算符):!not

6. 比较与相等判断

  • 比较器:><>=<=(也可写为 gtltgele
  • 相等运算符:==!=(也可写为 eqne

7. 条件运算符

  • 单条件(if-then):(if) ? (then)
  • 多条件(if-then-else):(if) ? (then) : (else)
  • 默认值(Elvis 运算符):(value) ?: (defaultvalue)

8. 特殊标记

  • 无操作:_

所有这些特性都可以组合嵌套使用,例如:

thymeleaf
'User is of type ' + (${user.isAdmin()} ? 'Administrator' : (${user.type} ?: 'Unknown'))

核心语法解释

  1. 表达式类型的核心用途
    • ${...}:访问上下文变量(控制器传入的动态数据);
    • *{...}:基于当前选中对象的变量访问(后续章节详解);
    • #{...}:读取国际化消息;
    • @{...}:生成 URL(自动拼接上下文路径);
    • ~{...}:引用模板片段(用于布局复用)。
  2. 字面量替换的便捷性|The name is ${name}| 等价于 'The name is ' + ${name},语法更简洁,适合拼接包含变量的文本。
  3. 符号别名的意义: 如 gt(>)、eq(==),是为了兼容 XML 规范(XML 中 <>` 等符号有特殊含义,直接使用会报错)。
  4. 默认值运算符(?:)${user.type} ?: 'Unknown' 表示“如果 user.type 不为 null/空,则使用其值,否则使用 Unknown”,简化空值判断。
  5. 无操作令牌(_): 使用 _ 时,Thymeleaf 会保留标签的默认文本,不做任何替换(后续章节详解)。

总结

  1. Thymeleaf 标准表达式语法覆盖了变量访问、文本操作、运算、条件判断等全场景需求,是模板动态渲染的核心。
  2. 不同类型的表达式(${}/#{}/@{} 等)各司其职,分别处理动态变量、国际化、URL 生成等场景。
  3. 表达式支持组合嵌套,能通过简洁的语法实现复杂的逻辑判断,同时提供符号别名、字面量替换等特性适配不同场景(如 XML 兼容)。