JSP標準標記庫促進了網頁的開發
2024-09-05 00:19:11
供稿:網友
java server pages (jsp) 標準標記庫 (jstl)的版本的發布對于jsp/servlet開發者來說是一個重大的進展。有了一個表達語言(el)和一組四種強大的、易于學習的標準標記庫,jstl極有可能不久后成為實現動態的、基于java的站點的主要方法。
1996年對jsp servlet的介紹使得java成為動態網頁開發的合理的選擇。隨后出現的java服務器頁(jsp)是走向快速的、可維護的java網頁實現過程的合理進化的一步,緊接著就出現了jsp標記的支持。但是2002中期的jstl(jsp標準標記庫)的發布才是進一步加速和簡化開發過程最大的一步。
在本文中,我解釋了jstl的功能,也涵蓋了你啟動jstl所需的每件事情。假設你有了對java、jsp、xml和安裝一個web容器的基本理解。如果你對這些主題感到陌生,你可以在resources(http://www.javaworld.com/javaworld/jw-02-2003/jw-0228-jstl.html?#resources#resources)上瀏覽一下背景參考。在下面的闡述中,假定你有xml和sql的知識。
安裝jstl支持
對于我們的jstl安裝例子來說,我們使用tomcat 4.1(盡管任意支持servlet 2.3和jsp1.2說明的servlet容器都應該能工作)。首先,下載tomcat 4.1并且按指示進行安裝(注意:jstl需要一個jsp1.2 web容器)。
用tomcat4 start程序啟動tomcat,并且運行index.html頁來確保tomcat是激活的、且運行良好。
接下來,安裝jstl支持,你可以從jakarta站點下載jstl支持,(http://www.javaworld.com/javaworld/jw-02-2003/jw-0228-jstl.html?#resources#resources)并按照下面步驟:
1. 從jakarta站點下載jstl檢索、解壓/脫檔該文件。(http://www.javaworld.com/javaworld/jw-02-2003/jw-0228-jstl.html?#resources)
2. 復制你已經解壓為common/lib的jar文件到你的tomcat安裝路徑中(盡管我們的項目不需要所有的jar文件);這使得jstl文件適用于你的任意web應用。
3. 對于任意你想使用jstl的web應用來說,復制.tld文件到你的web應用的web-inf目錄下。
4. 對于你的jstl的web應用,編輯web.xml并添加下列輸入:
<taglib>
<taglib-uri>http://java.sun.com/jstl/fmt</taglib-uri>
<taglib-location>/web-inf/fmt.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://java.sun.com/jstl/core</taglib-uri>
<taglib-location>/web-inf/c.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://java.sun.com/jstl/sql</taglib-uri>
<taglib-location>/web-inf/sql.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://java.sun.com/jstl/x</taglib-uri>
<taglib-location>/web-inf/x.tld</taglib-location>
</taglib>
這些輸入讓你的web應用可使用jstl標記庫的表達語言(el)版本。這些輸入的位置有關系!如果你不肯定將他們輸入到何處,關于web.xml選項和順序的權威性指導在文檔類型定義(dtd)中定義過:http://java.sun.com/j2ee/dtds/web-app_2_2.dtd。
5. 當你創建了一個使用jstl的jsp頁時,將他輸入到你的web應用的主目錄下,就像其它jsp和html頁一樣。你可以為該頁任意取名,但是它必須有一個.jsp的擴展名。
基礎原理
首先,所有的jstl也是jsp頁,jstl只是jsp功能的一個超集。
同樣,所有的jstl標記是有效的xml。這意味著:如果你將jstl標記之外的內容當作臨時文本(通常是html)時,剩下的jstl標記必須當作合法的xml來解釋。這里有一些隱含的規則,它要求大部分xml語法都是正確的。
jstl提供一組四個標準標記庫(core核心、internationalization/format國際標準化/格式、xml和sql)并支持el。jstl和el的基本設計目的是簡化網頁開發和實現。
在本文中,我們遵循jstl說明書的命名規則,并且把jstl標記當作動作。一個jstl標記對應于某個動作;調用動作明確的提醒我們:他們添加動態行為到一個另外的靜態頁上。
jstl標記庫有兩個版本:一個用你以前使用的方法將jsp表達式插入,如<%= . . . %>,另一個使用一個jstl el.我會在后面進一步討論在jstl中的el支持。
el支持
要理解當前jstl對el支持的狀態,讓我們檢查相關的說明書是怎樣處理的。java說明書請求(jsr)專家組成員決定:由于某種原因,el規范說明應該是jsp說明書的一部份,而不是jstl說明書的一部分。el完整的說明書成為jsp2.0的一部分。因為jstl1.0在jsp1.3之前已經完成,jstl作者不得不對用于jstl1.0的el支持實現做一個合理的猜測(結果可能是相當好的)。一個jstl維護版本將與jsp1.3說明書保持一致,并為了使el適合jsp1.3說明書,jstl維護版本做了一些修正。
本文描述的el概要可能在即將發布的jstl版本中有一點改動,但是任何改動都是微小的。
el用于簡單的語法定義了一套功能強大的語言,它很容易學習。它融合著javascript語言和perl語言較好的部分的一些風格。el表達式,集成了來自四種標準標記庫的jstl標記,提供了一個巨大的、靈活的屬性集。
所有的el表達式都被${}括起來。jstl中的表達式總是jstl標記中的屬性值的一部分。表達式可以是屬性的一部分或者合并和嵌入到一個字符串直接量中。jstl屬性也可以包含簡單的字符串直接量。在接下來的jstl中,我們在一個來自核心庫的c:out動作中說明每種情況,這個核心庫將它的value屬性值送到jsp輸出上:
<c:out value="${anexpression}"/>
<c:out value="literaltext${anexpression}${anotherexpression}"/>
<c:out value="literaltext"/>
el也定義了一套規則用于強制表達式中的值轉換為上下文相對應的類型。我們在這里不詳細討論這些規則;然而,它的方法與用perl語言定義的方式非常相似(就像perl語言中的做法一樣,該方法理所當然的運行良好,但是,偶爾,也會出現可能不是你十分想要的那種結果,但你可以接受)。
el為訪問對象屬性、集合元素、一組隱藏對象以及使用相關的、邏輯的和算術的操作符提供了支持。對于索引的屬性來說,包括數組和java.util.list類在內,元素可用下列語法訪問:
${alist[4]}
${alist[somevariable]}
javabean屬性和java.util.map元素(它代表一系列名字/值對)都可以使用下列方法的一個訪問得到。在以下的開頭兩個表達式里,我們可以訪問到一個用javabean語言命名為aproperty的屬性或者用關鍵字aproperty訪問到一個map實體。在第三個表達式中(注意:我已經省略了引號),我們用保存在變量avariablecontainingpropertyname中的一個名字訪問了在anobject之內的一個元素:
${anobject.aproperty}
${anobject["apropertyname"]}
${anobject[avariablecontainingpropertyname]}
在el中定義了許多隱藏變量:
pagecontext:用于該網頁的pagecontext對象
pagescope, requestscope, sessionscope, 和 applicationscope:這些是映射這些范圍的每一個變量到值上的map集。
param 和 paramvalues:用頁訪問傳遞的參數,與在jsp中一樣
header 和 headervalues:用頁請求傳遞的頭,與在jsp中一樣
cookie:map映射cookie程序到特定的cookie對象上
el定義了全套與你在java中非常熟悉的那些完全對應的操作符。算法操作符包括+、 -、 *、 / (或 div)、 和% (或 mod)。相關的操作符包括==、!=、<、>、<=、>=,它分別對應于eq、ne、lt、gt、le、和ge。我不想詳細闡述這些操作符,因為他們都能自我說明。
jstl標記庫
至此,我已經解釋了一些基本原理并且涵蓋了el語法。我要專門討論四種jstl標記庫。我主要討論核心庫,因為它是你一定要使用的;但是,我也會詳細的討論其余幾個,以便你能啟動它。
首先,盡管我應該更多地談論jstl標記庫的兩種風格,我上面提到的每個jstl標記庫以兩個版本出現:一個支持使用el的表達式;另一個支持標準jsp表達式。當你引入任何標記庫到一個jsp頁時,你要定義一個前綴,該前綴指定了與庫中標記相對應的命名空間。
四種標準標記庫,和他們的jstl規范定義的前綴常規,列表如下。記?。耗憧梢远x自己的前綴,但是這絕對沒有什么好處。
四種標準標記庫
庫
el 庫前綴
請求時間 (rt) 庫前綴
核心
c
c_rt
國際標準化/格式
fmt
fmt_rt
sql/db 支持
sql
sql_rt
xml
x
x_rt
為了使用頁中的核心標記庫( 實際上,你使你的頁對標記庫的命名空間可見),在你的頁首包含下列例子中的指令:
<%@ taglib prefix="c" uri=http://java.sun.com/jstl/core %>
為了使用該標記庫的標記,用你在你的包含語句中設計好的前綴,在你的頁中給每個標記加上前綴:
<c:out value="${anexpression}"/>
核心數據庫
讓我們更詳細的測試核心數據庫,先看看他最通用的功能。
顯示/設定值和異常處理
核心庫的最基本的標記是c:out標記,它在頁中顯示一個el表達式的值。一個使用c:out的表達式通常是這樣:
we have <c:out value="${applicationscope.product.inventorycount}" escapexml="true" default="0" /> of those items in stock.
上例中,value屬性是我們送到頁輸出的表達式。我也說明了選項escapexml的屬性和默認屬性。escapexml的屬性指定了xml字符(<、>、 &、 和 .)是否應該轉化為相應的字符實體代碼(這樣他們可以讓這些字符出現在一個html頁中);默認屬性用于el不能估算出數值或者數值計算出來為空的情況。
注意:當el支持完全貫穿整個jsp2.0的時候,你不需要使用c:out動作;你可以僅嵌套jsp表達式直接在頁中。
另一個普遍使用的核心動作是c:set,它在頁中設定一個變量。你可以用兩種方法使用c:set動作,第一種方法設定在var屬性中定義的變量到在value屬性中定義的值上,方法如下:
<c:set var="customerid" value="$param:customernumber" scope="session" />
上述的選擇項scope屬性指定了我們要在會話期范圍內設定變量customerid;如果范圍沒有制定,范圍默認為頁。
c:set另一個強大的用途就是將c:set標記的體的內容賦給一個指定的變量:
<c:set var="cellcontents">
<td>
<c:out value="${mycell}"/>
</td>
</c:set>
在上例中,c:set動作定義了名為cellcontents(在頁的范圍內)的變量,該變量擁有在標記的體中定義的內容。在這種情況下,體定義了一個html表格單元格元素,計算體中的c:out動作,并且該計算的結果包括在體中的字符串直接量值。
就像你預想的那樣,jstl進行異常處理有點早。在典型的jsp頁中,你有兩種異常處理的方法:試圖/捕捉直接嵌入到頁中的小腳本代碼中的塊;或者用一個jsp errorpage指令。jsp errorpage指令提供一個良好的捕捉所有異常的方法來處理頁中任何可能的異常。jstl用一個c:catch動作提供一個好的可選擇的方式。這個c:catch動作提供一個更細粒度的有效方法來處理異常。而且沒有嵌入java代碼到頁中。一個c:catch動作是這樣的:
<c:catch>
<!--. . . some set of nested jstl tags below which would be hit on an exception-->
</c:catch>
c:catch動作有一個可選的屬性,即一個指向拋出異常的變量。
你可能不怎么愿意使用c:remove標記。這個標記有用于變量名和范圍的屬性,并且可從指定的范圍內刪除指定的變量。
流程控制
讓我們轉為討論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>