流程控制
讓我們轉為討論JSTL的流程控制和條件標記。如果你已經用任何一種語言使用了條件和流程控制語句,理論上這裡沒什麼新鮮的東西。
c:if動作處理簡單條件語句的測試。計算測試屬性中的Boolean表達式的值,如果表達式為真的話,計算體的內容。在下面的動作中,我們也說明了備選項var屬性。為了以後的使用,var屬性保存測試結果在頁(如果沒有指定其他scope屬性的話)中。
<c:if test="${status.totalVisits == 1000000}" var="visits">
You are the millionth visitor to our site! Congratulations!
</c:if>
下面我們展示了用c:choose、 c:when、 和 c:otherwise交換邏輯的JSTL的支持。一組c:when動作可能包括在一個備選的標記內,如果在c:when塊中任何表達式計算值為真的話,就不用計算c:choose動作內的測試。如果c:when塊中沒有一個測試計算值為真的時候:如果出現c:otherwise動作內容時,則計算c:otherwise動作的內容:
<c:choose>
<c:when test="${item.type == book }">
...
</c:when>
<c:when test="${item.type == electronics }">
...
</c:when>
<c:when test="${item.type == toy }">
...
</c:when>
<c:otherwise>
...
</c:otherwise>
</c:choose>
c:foreach動作提供一個容易的方法來迭代一個集合的元素。如果你想只迭代集合的一部分的話,你可以分別用begin、 end、 和 step屬性指定起點、終點和一個遞增值。在下面的例子中,我們在變量customerNames中迭代一個集合的內容;在每個循環中,下一個元素輸入到變量名內並在c:foreach動作的體內計算:
<table>
<c:forEach var="name" items="${customerNames}">
<tr><td><c:out value="${name}"/></td></tr>
</c:forEach>
</table>
記得Java的StringTokenizer類嗎?有了c:forTokens動作,你可以用JSTL獲得類似的功能。這個程序片斷可使用在delims屬性中定義的定界符通過items String屬性中的條目迭代。注意,items 屬性不必是一個字符直接量;它可以是任何有效的EL表達式:
<table>
<c:forTokens items="47,52,53,55,46,22,16,2" delim="," var="dailyPrice">
<tr><td><c:out value="${dailyPrice}"/></td></tr>