Thymleaf中用th:each
属性实现迭代操作。
<tr th:each="prod : ${prods}">
<td th:text="${prod.name}">Onions</td>
<td th:text="${prod.price}">2.41</td>
<td th:text="${prod.inStock}? #{true} : #{false}">yes</td>
</tr>
<tr>
将会以prods
中的每个元素prod
,迭代多次。
${prods}
称为被迭代的表达式,被迭代的变量(Iterated expression, Iterrated variable)prod
称为迭代变量,其作用域为声明其的标签(Interation variable, iter variable)
被迭代的变量允许的类型为:
- 实现了
java.util.Iterable
的对象 - 实现了
java.util.Map
的对象,此时inter variable为java.util.Map.Entry
- 数组
- 其他任何对象会被当做只有该对象本身一个元素的单值列表被迭代
Theamleaf因为其作为模板引擎的使用场景,仅提供了foreach风格的迭代,未直接提供C中经典的for风格循环方式,不过可以通过foreach一个顺序数列来达到同样的效果。
迭代状态
迭代的状态通过状态变量(status variable)反映。声明状态变量的语法为:迭代变量后,紧跟逗号分隔符,然后声明状态命令的名称。
<tr th:each="prod,iterStat : ${prods}" th:class="${iterStat.odd}? 'odd'">
<td th:text="${prod.name}">Onions</td>
<td th:text="${prod.price}">2.41</td>
<td th:text="${prod.inStock}? #{true} : #{false}">yes</td>
</tr>
状态变量有和迭代变量一样的作用域。
一个状态变量包含数据:
index
属性,从0开始,当前的迭代索引count
属性,从1开始,当前的迭代索引size
属性,被迭代变量(Iterated variable)中的元素总数current
属性,当前的迭代(Iteration variable)变量even/odd
布尔属性,当前的迭代是奇数还是偶数first/last
布尔属性,当前是否是开始的或最后的迭代
隐式的状态变量
如果没有显式的声明状态变量,一个隐式的状态变量被自动声明,其名称为迭代变量(Iter variable)加上“Stat”
的后缀。
<tr th:each="prod : ${prods}" th:class="${prodStat.odd}? 'odd'">
<td th:text="${prod.name}">Onions</td>
<td th:text="${prod.price}">2.41</td>
<td th:text="${prod.inStock}? #{true} : #{false}">yes</td>
</tr>