js|編碼
隨著J2EE瘦客戶機技術JavaServer Pages(JSP)在過去幾年中的流行,獨立程式開發人員已經建立了許多自訂的JSP標記庫。雖然很多標記庫是編寫用來實現不同目標的,但它們往往也對迭代、條件及其他通用操作都提供了類似的解決方案。
為了減少對解決類似通用問題的獨立標記庫的需求,在Java Community Process(JSR 52)的贊助下建立了JSTL(JavaServer Pages Standard Tag Library,JSP)標準標記庫,為解決這些通用功能提供一個單一的標準解決方案。
JSTL庫
JSTL特別為條件處理、迭代、國際化、資料庫訪問和可延伸標記語言 (XML)(XML)處理提供支援。JSTL還引入了expression language(EL,運算式語言),極大地簡化了對JSP中應用資料的訪問和操作。JSTL包括4個JSP 1.2自訂標籤庫,每一個都涵蓋了一個特定的功能領域。
核心(Core)標記庫為日常任務提供通用支援,如顯示和設定變數、重複使用一組項目、測試條件以及其他動作(如匯入和重新導向Web內容)。
XML標記庫提供了對XML處理和操作的支援,包括XML節點的解析、迭代、基於XML資料的條件評估以及可延伸樣式表語言轉換(Extensible Style Language Transformations,XSLT)的執行。
國際化(Internationalization)標記庫支援多語種的應用程式。
資料庫(Database)標記庫對訪問和修改資料庫資料提供標準化支援。
表1:JSTL的四個標記庫
功能領域 URI首碼例子核心(Core) http://java.sun.com/jstl/corec<c:tagname ...>XML http://java.sun.com/jstl/xml x <x:tagname ...> 國際化(Internationalization)http://java.sun.com/jstl/fmt fmt <fmt:tagname ...> 資料庫(Database)http://java.sun.com/jstl/sql sql <sql:tagname ...>
JSTL入門
初步瞭解JSTL的最好方法是訪問Apache網站--jakarta.apache.org,並下載JSTL的參考實現。在Apache網站還可找到詳細的安裝指南。可下載的參考實現是一個JAR檔案、文檔和簡單程式碼範例的組合包。
要在你的J2EE Web應用程式中使用JSTL,只需簡單地將"lib"目錄下的JSTL JAR檔案複製到你應用程式的WEB-INF/lib目錄下。要在一個特定的JSP中使用JSTL標記,你還必須提供一個taglib指令。例如,要將"核心"JSTL庫匯入到你的頁面中,你應該在你的JSP頂端包含下面的指令,如下所示:
<%@ taglib uri="http://java.sun.com /jstl/core" prefix="c" %>
JSTL的EL支援
JSTL的一個重要優勢是它採用了簡單的expression language(EL),該語言提供一個訪問和操作應用程式資料(如儲存在servlet上下文中的資料)的簡單方式。
EL的文法很簡單,而且比Java中具有相同功能的表示要對使用者更為友好。例如, pageContext.getAttribute("aName")運算式在EL中就成了${aName}。所有的JSTL標記在其屬性值中都使用EL運算式。EL運算式在訪問嵌套屬性時使用${Java.expression}或${ data.reference}格式。資料參考可以是對象及其屬性或者對象及其屬性數組:
${myobject.property}
數組存取操作符也用於以索引元素集合顯示的資料,如Java數組或java.util.List:
${myList[2]}$
在EL運算式中除了可以使用屬性和數組元素操作符以及算術、關係和邏輯操作符以外,你還可以使用特別操作符來測試對象是否為空白。
除了對象和數組存取,EL還提供了一個完整的常用操作符集合,包括=、!、<、>、<=、>=、+、-、*、/等。
在任何JSP範圍(頁面、請求、會話或應用程式)中的對象都可以在EL運算式中引用。例如,如果你有一個帶有一個屬性"Ename"的Java bean--Employee,那麼可以用EL運算式${Employee.Ename}訪問這個變數。
除了顯式變數,EL還提供了對隱式變數的請求和應答對象中的隱式變數的直接存取。例如,以下語句將訪問一個名為"empname"的請求參數:
${param.empname}
即將推出的JSP 2.0和JSTL 1.0都使用EL。然而,JSP 2.0中使用的EL稍有一點不同。JSTL專家組(JSR-052)已經同意在即將推出的JSTL維護版中使用EL的JSP 2.0版本。
使用JSTL核心標記庫
JSTL核心標記庫為諸如顯示、迭代和設定變數等操作提供了最常用的標記。下面,我們更詳細地介紹一些最常用的JSTL核心標記庫。首先,在使用任何JSTL核心標記之前,你需要將以下指令添加到你的JSP中:
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
你最常使用的JSTL操作之一是顯示動態值。為了顯示動態資料,核心庫提供了c:out標記。c:out標記在一個頁面中顯示一個EL運算式的值。例如:
First name: <c:out value="${Employee.Ename}" />
c:out的值屬性還可以包含文本和運算式的組合:
<c:out value="First name: ${Employee.Ename}" />
(注意:當JSP 2.0提供對EL的支援時,你無需再使用c:out操作,你可以直接在頁面中嵌入JSP運算式。)
另一個操作是設定變數。為了在一個頁面中設定變數,核心標記庫提供了c:set標記。這個例子顯示了將變數Ename設定為參數"enameparm"的值:
<c:set var="Ename" value="${param.enameparm}" />
JSTL核心標記庫還提供了用於處理條件的標記。c:if處理簡單的條件測試。計算test屬性中布林運算式的值;如果是真,計算主體中的內容。在下面的操作中,你還可以看到儲存測試結果以備以後在頁面(或者在別的地方,如果指定了其他的可選範圍屬性)中使用的可選的var屬性:
<c:if test="${Employee.salary <= 10000}" >It's time for a raise <c:out value="${Employee.name">! </c:if>
下面,你可以看到JSTL通過c:choose、c:when和c:otherwise對跳轉邏輯的支援。你可以在一個選擇(choose)標記中包含一組c:when操作;如果對c:when塊中的運算式求值為真,則不對下面的c:choose操作中的測試進行計算。如果對c:when塊中測試求值沒有一個為真,則計算c:otherwise操作(如果存在的話)的內容:
<c:choose><c:when test="${dept.name == 'development'}">...</c:when><c:when test="${dept.name == 'marketing'}">...</c:when><c:otherwise>...</c:otherwise></c:choose>
c:forEach標記提供了一個對元素集合進行迭代的簡單方法。如果你只想迭代集合中的部分元素,你可以分別指定開始和結束索引以及帶有可選的開始、結束與步進屬性的增量值。在下例中,我們對變數empNames中的一個集合的內容進行迭代;在每個迴圈中,下一個元素被放置在變數名中,並在c:forEach操作的主體中進行求值。
<table><c:forEach var="name" items="${empNames}"><tr><td><c:out value="${name}"/></td></tr></c:forEach></table>
JSTL核心標記庫還可以簡化異常處理。以前,你必須將Java try/catch語句放置在Java scriptlet中,或者在錯誤頁面中提供它們。JSTL通過c:catch標記提供了一個處理異常的高明方法,而無需使用scriptlet。
<c:catch> <!—. . . some set of nested JSTL tags that fire an exception-></c:catch>
可以在jakarta.apache.org的參考實現中提供的JSTL文檔中找到其他JSTL標記庫如XML、國際化和資料庫標記庫的例子。