Thymeleaf each是Thymeleaf模板中强大的迭代器,可以在模板中对集合数据进行循环,以便方便地渲染列表或表格等等。在本文中,我们将从多个角度来探究Thymeleaf each的用法和更多细节。
一、基础用法
在Thymeleaf中,使用th:each属性可以对集合进行迭代。
<ul>
<li th:each="item : ${items}">
<span th:text="${item}">Item name</span>
</li>
</ul>
在上面的代码中,我们使用了th:each属性迭代了一个集合,其中变量item表示集合中的每一个元素。在循环体内,我们使用th:text属性展示了每个元素的文本内容。
此外,Thymeleaf each还支持迭代时另外指定索引变量和循环状态变量,如下所示:
<ul>
<li th:each="item,iterStat : ${items}">
<span th:text="${iterStat.index}">1</span>:<span th:text="${item}">Item name</span>
<br/>
</li>
</ul>
在上面的代码中,我们使用th:each属性同时指定了变量item和iterStat,其中iterStat是一个内置变量,表示当前的迭代状态。我们可以使用iterStat访问当前迭代的索引(iterStat.index)和是否是首(iterStat.first)或尾(iterStat.last)元素。
二、迭代器的嵌套
迭代器的嵌套是Thymeleaf each的常用技巧,可以用于渲染嵌套的列表或表格。例如,我们可以通过嵌套迭代器来渲染一个二维列表:
<table>
<tr th:each="row : ${matrix}">
<td th:each="cell : ${row}">
<span th:text="${cell}">Cell content</span>
</td>
</tr>
</table>
在上面的代码中,我们首先使用外部迭代器row来循环遍历二维列表的每一行,然后在行内使用内部迭代器cell来循环遍历当下行的每一个单元格。使用这种方式可以轻松渲染出一个简单的二维表格。
三、局部变量的应用
在Thymeleaf中,我们还可以使用局部变量来临时存储循环体内的某一元素,并在后续的操作中使用。
<ul>
<li th:each="item : ${items}">
<span th:text="${item}">Item name</span>
<span th:text="${#lists.last(items)?'':','}"></span> <!-- 如果不是最后一个元素,输出逗号 -->
<span th:with="nextItem=${#lists.next(items, item)}" th:text="${nextItem != null ? nextItem : ''}"></span> <!-- 展示下一个元素 -->
</li>
</ul>
在上面的代码中,我们使用Thymeleaf提供的#lists工具类来操作集合,通过lists.last判断当前元素是否是最后一个元素,如果不是则输出逗号。同时我们使用th:with创建了局部变量nextItem,通过#lists.next方法获取当前元素之后的下一个元素,并且将其展示在模板中。
四、排序和过滤
在实际开发中,我们经常需要按照某种规则对集合元素进行排序或者过滤,Thymeleaf也提供了非常方便的处理方式。
<ul>
<li th:each="item : ${#lists.sort(items)}">
<span th:text="${item}">Item name</span>
</li>
</ul>
<ul>
<li th:each="item : ${#lists.filter(items, lambda(item): item != null)}">
<span th:text="${item}">Item name</span>
</li>
</ul>
在上面的代码中,我们使用#lists工具类提供了两种操作:#lists.sort用于对集合元素进行排序,而#lists.filter用于对集合元素进行过滤。注意到我们在#lists.filter中使用了一个lambda表达式来指定过滤规则,这样可以非常方便地灵活地控制过滤规则。
五、小结
本文从基础用法、迭代器的嵌套、局部变量、以及排序和过滤四个方面分别详细介绍了Thymeleaf each的用法和技巧。通过对这些细节的掌握,我们可以更加高效地使用Thymeleaf each来渲染模板,提高应用的性能和灵活性。