js|過程|網頁 流程式控制制
讓我們轉為討論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></c:forTokens></table>
在接下來的完整的JSTL頁中,我列出了已經傳遞到該頁的所有參數。param 和paramValues對象是映射關鍵字到一個或多個值的Java Map集。在本例中,我們找出了用於集合的每個MapEntry的關鍵字即參數名,並且使用關鍵字來尋找所有與關鍵字關聯的參數值:
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %><html><body><head><title>Parameter Listing Example</title></head><br><b>Parameter values passed to this page for each parameter: </b><table border="2"><c:forEach var="current" items="${param}"> <tr> <td> <b><c:out value="${current.key}" /></b> </td> <c:forEach var="aVal" items="${paramValues[current.key]}"> <td> <c:out value="${aVal}" /> </td> </c:forEach> </tr></c:forEach></table></body></html>
其他動作
我們也需要討論一些其他重要的核心標記庫動作。在網頁實現中一個潛在的問題範圍與URL編碼有關。沒有URL編碼,在網頁中傳遞的URL的某個字元如空格,可能會迷惑Web伺服器。URL編碼確保這些特殊的字元用不引起迷惑的字元代替。下列例子在變數myUrl中定義了一個URL,該變數myUrl由一個URL和一系列參數組成。URL動作(注意,這裡只在JSTL意義上的動作)保證所有字元都正確的編碼:
<c:url value="http://acme.com/exec/register" var="myUrl"><c:param name="name" value="${param.name}"/><c:param name="country" value="${param.country}"/></c:url><a href= <c:out value="${myUrl}"/> >Register</a>
在上面的代碼中,param動作簡單的定義了一組名值對。
JSP允許設計者用指令包括其他頁的內容。JSTL用JSTL c:import動作擴充了這個概念。c:import的主要優勢是:你能指定一個任意的URL;也可以包含你的Web應用之外(W3C的任何地方)的頁的內容或者你的伺服器上的另一個Web應用內的頁的內容。
對於一組與HTTP相關的標記來說,沒有一個方法處理HTTP重新導向是不完整的。JSTL用c:redirect動作支援它。
國際化標記庫
在討論了JSTL支援國際化中,我假設你已經有了對下列主題的合理的理解:
●資源套件和Java如何找到它們
●Locale類
●資源套件尋找和MessageFormat類
●局部編碼以及它與Java國際化的關係
●Java文本和資料格式化
我在下面的兩個部分討論了國際化標記庫。在第一部分,我包括了你可能使用的格式化和解釋相關的動作(它最初對應於java.text封裝包中的類),儘管你沒有開發過完全的國際化應用程式,可能你也要用到它。在第二部分,我說明了更針對於國際化的動作。
如果存在一個遠端可能性,你的應用程式會在你本國之外使用。如果你從一開始就建立在國際化的支援上,那麼開發就會更加容易。無論你使用何種方法來開發,即使像JSTL一樣容易使用的方法,一開始建立在國際化支援上也是十分有益的。