Skip to content

4.11 条件表达式

条件表达式的作用是根据一个条件(本身也是一个表达式)的结果,仅执行两个表达式中的一个。

先看一个简单示例(同时引入新的属性修饰符 th:class):

html
<!-- 若 row.even 为 true,class 为 'even';否则为 'odd' -->
<tr th:class="${row.even}? 'even' : 'odd'">
  ...
</tr>

条件表达式的三个部分(条件、then 分支、else 分支)本身都是合法的 Thymeleaf 表达式,支持:

  • 变量表达式(${...}/*{...}
  • 消息表达式(#{...}
  • URL 表达式(@{...}
  • 字面量('...'/数字/布尔)

可以通过括号 () 实现条件表达式的嵌套,处理更复杂的分支逻辑:

html
<!-- 优先级:先判断是否为第一行,再判断是否为偶数行,最后为奇数行 -->
<tr th:class="${row.even}? (${row.first}? 'first' : 'even') : 'odd'">
 ...
</tr>

可省略 else 分支,此时若条件为 false,会返回 null(对应 HTML 属性会被清空):

html
<!-- 仅当 row.even 为 true 时,class 为 'alt';否则无 class 属性 -->
<tr th:class="${row.even}? 'alt'">
 ...
</tr>

常见使用场景

  • 样式动态切换:如示例中的行样式(even/odd/first)、按钮状态(active/disabled);
  • 文本/内容动态显示:根据条件显示不同文本、链接、图片等;
  • URL 动态生成:根据用户权限拼接不同的跳转链接:
    html
    <a th:href="${user.isAdmin()}? @{/admin/dashboard} : @{/user/profile}">
      个人中心
    </a>

关键注意事项

  • 条件表达式的结果类型需统一(如 then/else 分支均为字符串、均为 URL 等),避免类型混乱;
  • 嵌套表达式需用括号明确优先级,否则可能因运算顺序导致逻辑错误;
  • 省略 else 分支时,若条件为 false,属性值会变为 null(HTML 中表现为该属性不存在),而非空字符串。

总结

  1. 条件表达式 (条件) ? (then) : (else) 是 Thymeleaf 处理分支逻辑的核心语法,三个部分均支持所有合法表达式;
  2. 可通过括号嵌套实现多分支逻辑,也可省略 else 分支(条件不满足时返回 null);
  3. 常用于动态设置样式、文本、URL 等场景,是模板中实现“动态逻辑”的基础方式。