深色模式
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 中表现为该属性不存在),而非空字符串。
总结
- 条件表达式
(条件) ? (then) : (else)是 Thymeleaf 处理分支逻辑的核心语法,三个部分均支持所有合法表达式; - 可通过括号嵌套实现多分支逻辑,也可省略 else 分支(条件不满足时返回 null);
- 常用于动态设置样式、文本、URL 等场景,是模板中实现“动态逻辑”的基础方式。
