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 或选错对象时,修改判空方法并不能修复路径错误。选择表达式说明
这些条件控制的是展示。权限、必填和数据有效性仍应由后端执行,隐藏按钮也不能成为访问控制。