Thymeleaf 的“空”需要按类型判断:列表为空、字符串为空、对象为 null,不应共用一条含糊的判断。列表展示可用 #lists.isEmpty,表单选择表达式则还要确认 th:object 指向谁。

列表有内容才显示区域

假设 model 中的 items 是 List:

<p th:if="${#lists.isEmpty(items)}">暂无记录</p>
<ul th:unless="${#lists.isEmpty(items)}">
  <li th:each="item : ${items}" th:text="${item}">记录</li>
</ul>

#lists.isEmpty 适用于列表;不要把它当成任意对象的通用校验器。列表为空时渲染空态,有内容时再循环,能避免页面只留一个无说明的空容器。Thymeleaf 列表工具

null、空字符串和空白字符串不同

需要区分以下情况:

数据常见判断意图
null没有对象或没有设置
空字符串字符串长度为零
只有空格的字符串业务是否认为没有有效输入
数字 0一个有效数值,通常不是缺失

例如先检查 name,再输出:

<span th:if="${not #strings.isEmpty(name)}" th:text="${name}">名称</span>
<span th:if="${name == null}">尚未设置</span>

如果要求忽略前后空白,应在后台按业务约定规范化并验证,不能以页面隐藏结果代替输入校验。#strings.isEmpty 的行为也不应外推为对所有 Unicode 空白和所有数据类型的验证。

选择表达式依赖 th:object

下面 form 是 model 中的对象,title 是其属性:

<form th:object="${form}">
  <input type="text" th:field="*{title}">
  <p th:if="*{title == null}">标题尚未设置</p>
</form>

${form.title} 明确从上下文取 form;*{title} 则在当前选定对象中取值。缺少 th:object 或选错对象时,修改判空方法并不能修复路径错误。选择表达式说明

这些条件控制的是展示。权限、必填和数据有效性仍应由后端执行,隐藏按钮也不能成为访问控制。