深色模式
布尔字面量(Boolean literals)
布尔字面量只有两个值:true 和 false,常用于条件判断(如 th:if/th:unless)等场景。例如
html
<!-- 方式1:布尔判断写在表达式外部(由 Thymeleaf 处理) -->
<div th:if="${user.isAdmin()} == false">
非管理员可见内容
</div>在上面例子中,== false 写在大括号外面,因此由 Thymeleaf 来处理它。如果把它写在大括号里面,那么就由 OGNL/SpringEL 引擎来负责处理。
html
<!-- 方式2:布尔判断写在表达式内部(由 OGNL/SpringEL 引擎处理) -->
<div th:if="${user.isAdmin() == false}">
非管理员可见内容
</div>核心逻辑解释
两种写法的执行主体差异:
- 方式1(
${user.isAdmin()} == false): Thymeleaf 先解析${user.isAdmin()}得到布尔值(如true/false),再由 Thymeleaf 本身执行== false的比较; - 方式2(
${user.isAdmin() == false}): 整个user.isAdmin() == false作为 OGNL/SpringEL 表达式,由表达式引擎直接计算并返回布尔结果,Thymeleaf 仅接收最终结果。
- 方式1(
效果等价性: 上述两种写法的最终效果完全一致,选择哪种主要看代码可读性:
- 简单判断(如
== true/false):两种写法无差异; - 复杂逻辑(如
&&/||):推荐写在表达式内部(方式2),更符合编程习惯,例如:html<!-- 推荐:复杂逻辑写在表达式内 --> <div th:if="${user.isAdmin() && user.isActive()}"> 活跃管理员可见内容 </div>
- 简单判断(如
简化写法: 判断“是否为 true”时可省略
== true,直接写表达式:html<!-- 等价于 ${user.isAdmin()} == true --> <div th:if="${user.isAdmin()}"> 管理员可见内容 </div>
关键注意事项
- 布尔字面量无需加单引号:加了会被解析为文本字面量,导致判断失效: ❌ 错误:
th:if="${user.isAdmin()} == 'false'"(文本false与布尔false不相等,判断永远为 false); ✅ 正确:th:if="${user.isAdmin()} == false"(布尔值比较)。 - SpringEL 兼容: 在 Spring MVC 项目中,OGNL 替换为 SpringEL,但布尔字面量的用法完全一致,例如:html
<div th:if="${user.status == 'ACTIVE' && user.age > 18}"> 成年且活跃用户可见 </div>
总结
- 布尔字面量
true/false是 Thymeleaf 条件判断的核心,无需包裹符号,直接使用; - 布尔判断可写在
${}内部(表达式引擎处理)或外部(Thymeleaf 处理),效果等价,复杂逻辑推荐写在内部; - 避免将布尔字面量用单引号包裹(会转为文本),否则会导致条件判断错误。
