迭代循环
th:each
我们在模板中最常用的循环就是表格了,在示例程序中就有这样一个例子—/WEB-INF/templates/product/list.html ,在这个页面中,我们将查询出的所有产品放到list中,并将list存入上下文中。
public void process( HttpServletRequest request, HttpServletResponse response, ServletContext servletContext, TemplateEngine templateEngine) { ProductService productService = new ProductService(); List<Product> allProducts = productService.findAll(); WebContext ctx = new WebContext(request, servletContext, request.getLocale()); ctx.setVariable("prods", allProducts); templateEngine.process("product/list", ctx, response.getWriter()); }
在模板中,我们用th:each来进行循环
<table> <tr> <th>NAME</th> <th>PRICE</th> <th>IN STOCK</th> </tr> <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> </table>
我们不仅可以通过th:each 来迭代List,还可以用来迭代很多对象,例如:
- 所有实现了java.util.Iterable接口的对象
- 所有实现了java.util.Map的对象
- 数组
- 所有对象–因为都可以看做只包含自身的列表
迭代状态
Thymeleaf提供了一组迭代状态,方便在循环时使用
- index ,当前索引,从0开始
- count ,当前索引,从0开始
- size ,被迭代对象的总数,例如List的size
- current ,The iter variable for each iteration(官方原文,没太明白)
- even/odd ,boolean值,当前的迭代是否是奇数或偶数
- first/last ,boolean值,当前的迭代是否是第一个或最后一个
我们通常都有这样的需求,表格为了美观,会隔行变色。
这时我们就可以使用迭代变量的even/odd 状态,使用方法如下:
<table> <tr> <th>NAME</th> <th>PRICE</th> <th>IN STOCK</th> </tr> <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> </table>
在上面的代码中,iterStat是我们创建的迭代状态变量。如果没有创建,Thymeleaf会自动创建一个状态变量,名字就是迭代变量的名字加上Stat后缀:
<table> <tr> <th>NAME</th> <th>PRICE</th> <th>IN STOCK</th> </tr> <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> </table>
条件表达式
if unless
例:
<a href="comments.html" th:href="@{/product/comments(prodId=${prod.id})}" th:if="${not #lists.isEmpty(prod.comments)}">view</a>
代码运行的结果就是,如果prod.comments不是空的,就输出<a>标签,如下图:
switch
例:
<div th:switch="${user.role}"> <p th:case="'admin'">User is an administrator</p> <p th:case="#{roles.manager}">User is a manager</p> <p th:case="*">User is some other thing</p> </div>
其中th:case=”*“就是switch中的default