如何在Thymeleaf单个单元格中显示集合,而非为每个元素创建列?
解决Thymeleaf中集合在单个单元格显示的问题
我完全懂你的困扰——你现在的代码把th:each放在了<td>标签上,这就导致每循环一个team就会生成一个新的单元格,自然变成了每个团队占一列的情况。要把所有团队名称合并到同一个单元格里,有两种简单的方法可以实现:
方法一:用Thymeleaf内置字符串工具直接拼接(最简洁)
Thymeleaf提供了#strings.join工具类,配合集合投影操作,可以一行代码搞定:
<tr th:each="employee : ${allEmployees}"> <td th:text="${employee.id}"></td> <td th:text="${employee.firstName}"></td> <td th:text="${employee.lastName}"></td> <td th:text="${employee.position}"></td> <td th:text="${employee.salary}"></td> <td th:text="${employee.supervisorId}"></td> <!-- 修改后的团队列 --> <td th:text="${#strings.join(employee.teams.![name], ', ')}"></td> </tr>
这里的employee.teams.![name]是投影表达式,它会提取employee.teams集合中每个元素的name属性,生成一个字符串集合;然后#strings.join把这个集合用, (逗号加空格)连接成单个字符串,正好符合你想要的「Technical Architecture, Mobile」格式。
方法二:在单元格内部循环拼接(更灵活)
如果之后需要给每个团队名称加样式或者其他自定义格式,可以在<td>内部循环,用状态变量控制分隔符:
<tr th:each="employee : ${allEmployees}"> <!-- 其他列保持不变 --> <td> <!-- 循环每个team,用stat状态变量判断是否是最后一个元素 --> <span th:each="team, stat : ${employee.teams}"> [[${team.name}]] <!-- 不是最后一个元素的话,添加逗号分隔符 --> <th:block th:if="${!stat.last}">, </th:block> </span> </td> </tr>
这种方式的好处是可以灵活调整每个团队名称的展示样式,比如给span加class,或者换行显示(如果需要的话)。
为什么原来的写法不对?
你之前把th:each="${team : ${employee.teams}}"写在了<td>标签上,Thymeleaf的规则是:只要在标签上写了th:each,就会为每个循环元素复制整个标签,所以每个team都会生成一个独立的<td>,自然就变成了多列的情况。把循环放在td内部的子元素上,就能保证所有内容都在同一个单元格里啦。
内容的提问来源于stack exchange,提问作者Fajeczny
相关产品推荐
相关产品推荐

