7.1 简单条件:if与unless
有时,你会需要模版的某部分在满足特定条件时,才在结果中显示。
比如,想象一下:我们想要在产品表格的某一列里,展示每一个产品的评论数量,并且如果有评论的话,还要显示一条指向评论详细页面的链接。
为此,我们使用th:if属性:
<table><tr><th>NAME</th><th>PRICE</th><th>IN STOCK</th><th>COMMENTS</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><td><span th:text="${#lists.size(prod.comments)}">2</span> comment/s<a href="comments.html"th:href="@{/product/comments(prodId=${prod.id})}"th:if="${not #lists.isEmpty(prod.comments)}">view</a></td></tr></table>
这里有相当多可以看的地方,让我们看到最重要的一行上:
<a href="comments.html"th:href="@{/product/comments(prodId=${prod.id})}"th:if="${not #lists.isEmpty(prod.comments)}">view</a>
这会创建一条指向评论页的链接(URL是/product/comments),并把prodId参数设置到产品id上,但是只会在产品有任何评论的情况下。
让我们看一看生成的标记:
<table><tr><th>NAME</th><th>PRICE</th><th>IN STOCK</th><th>COMMENTS</th></tr><tr><td>Fresh Sweet Basil</td><td>4.99</td><td>yes</td><td><span>0</span> comment/s</td></tr><tr class="odd"><td>Italian Tomato</td><td>1.25</td><td>no</td><td><span>2</span> comment/s<a href="/gtvg/product/comments?prodId=2">view</a></td></tr><tr><td>Yellow Bell Pepper</td><td>2.50</td><td>yes</td><td><span>0</span> comment/s</td></tr><tr class="odd"><td>Old Cheddar</td><td>18.75</td><td>yes</td><td><span>1</span> comment/s<a href="/gtvg/product/comments?prodId=4">view</a></td></tr></table>
完美!这就是我们想要的。
注意:th:if属性不仅仅会对布尔条件求值。它的能力超出了布尔条件的范围。他会依据以下规则,将特定的表达式求值为true:
- 如果值不为null:
- 如果值是布尔值,并且为true
- 如果值是数字,并且不为0
- 如果值是字符,并且不为0
- 如果值是字符串,并且不为“false”, “off”或者“no”
- 如果值不是布尔值,数字,字符或者字符串
- (如果值为null,
th:if会求值为false)
th:if有一个相反的属性:th:unless。我们可以把它用在先前的例子里,代替在OGNL表达式里使用not:
<a href="comments.html"th:href="@{/comments(prodId=${prod.id})}"th:unless="${#lists.isEmpty(prod.comments)}">view</a>
