
Thymeleaf 的 th:each 不能直接作用于 标签来循环生成多行表格——必须包裹在 th:block 中,否则因 HTML 结构合法性与 Thymeleaf 解析机制冲突导致循环失效、数据不显示。
thymeleaf 的 `th:each` 不能直接作用于 `
在使用 Thymeleaf 渲染动态表格时,一个常见误区是将 th:each 直接添加到
<tr th:each="data : ${stats}">
<td th:text="${data.country}"></td>
<td th:text="${data.state}"></td>
<td th:text="${data.latestTotalCases}">0</td>
</tr>这种写法看似合理,实则无法正常工作。原因在于:Thymeleaf 在解析模板时,会优先校验 HTML 结构语义完整性。当 th:each 应用于
✅ 正确做法是使用语义中立、无渲染副作用的 th:block 作为循环容器:
<tbody>
<th:block th:each="data : ${stats}">
<tr style="background-color: #f9f9f9;">
<td th:text="${data.country}">Country Name</td>
<td th:text="${data.state}">State Name</td>
<td th:text="${data.latestTotalCases}">0</td>
</tr>
</th:block>
</tbody>? 提示:
是 Thymeleaf 提供的逻辑分组标签,编译后不会生成任何实际 HTML 元素,仅用于控制结构逻辑,完美适配循环、条件等场景。
此外,请务必确保以下几点以排除其他潜在问题:
- ✅ 后端控制器已将 List
(或类似实体集合)正确放入 Model: model.addAttribute("stats", statService.getAllStats()); - ✅ 实体类 Stat 中的字段(如 country、state、latestTotalCases)具有 public getter 方法(如 getCountry()),Thymeleaf 依赖 JavaBean 规范访问属性;
- ✅ 模板中已声明 Thymeleaf 命名空间:
<html xmlns:th="http://www.thymeleaf.org">
- ⚠️ 避免在 th:each 内部混用静态内容与 th:text —— 若需默认值,应统一用 ?: Elvis 运算符处理空值,例如:
<td th:text="${data.country} ?: 'N/A'"></td>
总结:th:each 的宿主元素必须是可安全重复、不影响 HTML 结构层级的容器。










