7.1 简单条件:if与unless

有时,你会需要模版的某部分在满足特定条件时,才在结果中显示。

比如,想象一下:我们想要在产品表格的某一列里,展示每一个产品的评论数量,并且如果有评论的话,还要显示一条指向评论详细页面的链接。

为此,我们使用th:if属性:

  1. <table>
  2. <tr>
  3. <th>NAME</th>
  4. <th>PRICE</th>
  5. <th>IN STOCK</th>
  6. <th>COMMENTS</th>
  7. </tr>
  8. <tr th:each="prod : ${prods}" th:class="${prodStat.odd}? 'odd'">
  9. <td th:text="${prod.name}">Onions</td>
  10. <td th:text="${prod.price}">2.41</td>
  11. <td th:text="${prod.inStock}? #{true} : #{false}">yes</td>
  12. <td>
  13. <span th:text="${#lists.size(prod.comments)}">2</span> comment/s
  14. <a href="comments.html"
  15. th:href="@{/product/comments(prodId=${prod.id})}"
  16. th:if="${not #lists.isEmpty(prod.comments)}">view</a>
  17. </td>
  18. </tr>
  19. </table>

这里有相当多可以看的地方,让我们看到最重要的一行上:

  1. <a href="comments.html"
  2. th:href="@{/product/comments(prodId=${prod.id})}"
  3. th:if="${not #lists.isEmpty(prod.comments)}">view</a>

这会创建一条指向评论页的链接(URL是/product/comments),并把prodId参数设置到产品id上,但是只会在产品有任何评论的情况下。

让我们看一看生成的标记:

  1. <table>
  2. <tr>
  3. <th>NAME</th>
  4. <th>PRICE</th>
  5. <th>IN STOCK</th>
  6. <th>COMMENTS</th>
  7. </tr>
  8. <tr>
  9. <td>Fresh Sweet Basil</td>
  10. <td>4.99</td>
  11. <td>yes</td>
  12. <td>
  13. <span>0</span> comment/s
  14. </td>
  15. </tr>
  16. <tr class="odd">
  17. <td>Italian Tomato</td>
  18. <td>1.25</td>
  19. <td>no</td>
  20. <td>
  21. <span>2</span> comment/s
  22. <a href="/gtvg/product/comments?prodId=2">view</a>
  23. </td>
  24. </tr>
  25. <tr>
  26. <td>Yellow Bell Pepper</td>
  27. <td>2.50</td>
  28. <td>yes</td>
  29. <td>
  30. <span>0</span> comment/s
  31. </td>
  32. </tr>
  33. <tr class="odd">
  34. <td>Old Cheddar</td>
  35. <td>18.75</td>
  36. <td>yes</td>
  37. <td>
  38. <span>1</span> comment/s
  39. <a href="/gtvg/product/comments?prodId=4">view</a>
  40. </td>
  41. </tr>
  42. </table>

完美!这就是我们想要的。

注意:th:if属性不仅仅会对布尔条件求值。它的能力超出了布尔条件的范围。他会依据以下规则,将特定的表达式求值为true

  • 如果值不为null:
    • 如果值是布尔值,并且为true
    • 如果值是数字,并且不为0
    • 如果值是字符,并且不为0
    • 如果值是字符串,并且不为“false”, “off”或者“no”
    • 如果值不是布尔值,数字,字符或者字符串
  • (如果值为null,th:if会求值为false)

th:if有一个相反的属性:th:unless。我们可以把它用在先前的例子里,代替在OGNL表达式里使用not

  1. <a href="comments.html"
  2. th:href="@{/comments(prodId=${prod.id})}"
  3. th:unless="${#lists.isEmpty(prod.comments)}">view</a>