Skip to content

布尔字面量(Boolean literals)

布尔字面量只有两个值:truefalse,常用于条件判断(如 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. 两种写法的执行主体差异

    • 方式1(${user.isAdmin()} == false): Thymeleaf 先解析 ${user.isAdmin()} 得到布尔值(如 true/false),再由 Thymeleaf 本身执行 == false 的比较;
    • 方式2(${user.isAdmin() == false}): 整个 user.isAdmin() == false 作为 OGNL/SpringEL 表达式,由表达式引擎直接计算并返回布尔结果,Thymeleaf 仅接收最终结果。
  2. 效果等价性: 上述两种写法的最终效果完全一致,选择哪种主要看代码可读性:

    • 简单判断(如 == true/false):两种写法无差异;
    • 复杂逻辑(如 &&/||):推荐写在表达式内部(方式2),更符合编程习惯,例如:
      html
      <!-- 推荐:复杂逻辑写在表达式内 -->
      <div th:if="${user.isAdmin() && user.isActive()}">
        活跃管理员可见内容
      </div>
  3. 简化写法: 判断“是否为 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>

总结

  1. 布尔字面量 true/false 是 Thymeleaf 条件判断的核心,无需包裹符号,直接使用;
  2. 布尔判断可写在 ${} 内部(表达式引擎处理)或外部(Thymeleaf 处理),效果等价,复杂逻辑推荐写在内部;
  3. 避免将布尔字面量用单引号包裹(会转为文本),否则会导致条件判断错误。