JSTL教程-
JSP 標準標記庫(JSP Standard Tag Library,JSTL)是一個實現 Web
應用程式中常見的通用功能的定製標記庫集,這些功能包括迭代和條件判斷、資料管理格式化、XML 操作以及資料庫訪問。在
developerWorks 上其新系列的第一篇文章中,軟體工程師 Mark Kolb 向您展示瞭如何使用 JSTL 標記來避免在 JSP
頁面中使用指令碼編制元素。您還將瞭解如何透過從表示層刪除原始碼來簡化軟體維護。最後,您將瞭解 JSTL
經過簡化的表示式語言,它允許在不必使用功能齊全的程式語言的情況下對 JSTL 操作指定動態屬性值。
JavaServer Pages(JSP)是用於 J2EE 平臺的標準表示層技術。JSP
技術提供了用於執行計算(這些計算用來動態地生成頁面內容)的指令碼編制元素和操作。指令碼編制元素允許在 JSP
頁面中包括程式原始碼,在為響應使用者請求而呈現頁面時可以執行這些原始碼。操作將計算操作封裝到很象 HTML 或 XML 標記的標記中,JSP
頁面的模板文字通常包含這些標記。JSP 規範只將幾種操作定義成了標準,但從 JSP 1.1
開始,開發人員已經能夠以定製標記庫的方式建立其自己的操作了。
JSP 標準標記庫(JSTL)是 JSP 1.2
定製標記庫集,這些標記庫實現大量伺服器端 Java
應用程式常用的基本功能。透過為典型表示層任務(如資料格式化和迭代或條件內容)提供標準實現,JSTL 使 JSP
作者可以專注於特定於應用程式的開發需求,而不是為這些通用操作“另起爐灶”。
當然,您可以使用 JSP
指令碼編制元素(scriptlet、表示式和宣告)來實現此類任務。例如,可以使用三個 scriptlet 實現條件內容,清單 1
中著重顯示了這三個 scriptlet。但是,因為指令碼編制元素依賴於在頁面中嵌入程式原始碼(通常是 Java
程式碼),所以對於使用這些指令碼編制元素的 JSP 頁面,其軟體維護任務的複雜度大大增加了。例如,清單 1 中的 scriptlet
示例嚴格地依賴於花括號的正確匹配。如果不經意間引入了一個語法錯誤,則條件內容中的巢狀其它 scriptlet 可能會造成嚴重破壞,並且在
JSP 容器編譯該頁面時,要使所產生的錯誤資訊有意義可能會很困難。
清單 1. 透過 scriptlet 實現條件內容
|
JSTL 1.0
兩個 JSTL 標記庫驗證器允許開發人員在其 JSP 應用程式中強制使用編碼標準。可以配置 ScriptFreeTLV 驗證器以在 JSP 頁面中禁用各種型別的 JSP 指令碼元素 — scriptlet、表示式和宣告。類似地,PermittedTaglibsTLV 驗證器可以用來限制可能由應用程式的 JSP 頁面訪問的定製標記庫集(包括 JSTL 標記庫)。
儘管 JSTL 最終將會成為 J2EE 平臺的必需元件,但目前只有少數應用程式伺服器包括它。JSTL 1.0 的參考實現可作為 Apache 軟體基金會(Apache Software Foundation)的 Jakarta Taglibs 專案(請參閱參考資料)的一部分而獲得。可以將該參考實現中的定製標記庫合併到任何支援 JSP 1.2 和 Servlet 2.3 規範的伺服器,以新增對 JSTL 的支援。
表示式語言
清單 2. 合併請求時屬性值的 JSP 操作
|
清單 3. 說明 EL 表示式定界符的 JSTL 操作
清單 4. 組合靜態文字和多個 EL 表示式以指定動態屬性值
限制了作用域的變數
·頁面作用域
·請求作用域
·會話作用域
·應用程式作用域
透過將字串對映為期望作用域中的物件來將物件儲存到該作用域。然後,就可以透過提供相同字串來從該作用域檢索該物件。在作用域的對映中查詢字串,並 返回被對映的物件。在 Servlet API 中,將此類物件稱為相應作用域的屬性。但是,在 EL 的上下文中,也將與屬性相關聯的字串看作變數的名稱,該變數透過屬性對映的方式獲得特定的值。
在 EL 中,與隱式物件無關聯的識別符號被認為是儲存在四個 JSP 作用域中的名稱物件。首先對頁面作用域檢查是否存在這樣的識別符號,其次對請求作用域、然後對會話作用域、最後對應用程式作用域依次進行這樣的檢查,然後測 試該識別符號的名稱是否與儲存在該作用域中的某個物件的名稱匹配。第一個這樣的匹配作為 EL 識別符號的值被返回。透過這種方法,可以將 EL 識別符號看作引用限制了作用域的變數。
從更技術的方面來說,沒有對映到隱式物件的識別符號是用 PageContext 例項的 findAttribute() 方法求值的,該例項表示對頁面的處理,在該頁面上,當前正在處理用於請求的表示式。識別符號的名稱作為引數傳遞給這個方法,然後該方法依次在四個作用域中搜 索具有相同名稱的屬性。並將所找到的第一個匹配項作為 findAttribute() 方法的值返回。如果未在這四個作用域中找到這樣的屬性,則返回 null。
最終,限制了作用域的變數是四個 JSP 作用域的屬性,這些屬性具有可以用作 EL 識別符號的名稱。只要對限制了作用域的變數賦予由字母數字組成的名稱,就可以透過 JSP 中提供的用於設定屬性的任何機制來建立它們。這包括內建的
隱式物件
表 1 中列出了 11 個 EL 隱式物件的識別符號。不要將這些物件與 JSP 隱式物件(一共只有九個)混淆,其中只有一個物件是它們所共有的。
表 1. EL 隱式物件
類別 識別符號 描述
JSP pageContext PageContext 例項對應於當前頁面的處理
作用域 pageScope 與頁面作用域屬性的名稱和值相關聯的 Map 類
requestScope 與請求作用域屬性的名稱和值相關聯的 Map 類
sessionScope 與會話作用域屬性的名稱和值相關聯的 Map 類
applicationScope 與應用程式作用域屬性的名稱和值相關聯的 Map 類
請求引數 param 按名稱儲存請求引數的主要值的 Map 類
paramValues 將請求引數的所有值作為 String 陣列儲存的 Map 類
請求頭 header 按名稱儲存請求頭主要值的 Map 類
headerValues 將請求頭的所有值作為 String 陣列儲存的 Map 類
Cookie cookie 按名稱儲存請求附帶的 cookie 的 Map 類
初始化引數 initParam 按名稱儲存 Web 應用程式上下文初始化引數的 Map 類
其餘所有 EL 隱式物件都是對映,可以用來查詢對應於名稱的物件。前四個對映表示先前討論的各種屬性作用域。可以用它們來查詢特定作用域中的識別符號,而不用依賴於 EL 在預設情況下使用的順序查詢過程。
接下來的四個對映用來獲取請求引數和請求頭的值。因為 HTTP 協議允許請求引數和請求頭具有多個值,所以它們各有一對對映。每對中的第一個對映返回請求引數或頭的主要值,通常是恰巧在實際請求中首先指定的那個值。每 對中第二個對映允許檢索引數或頭的所有值。這些對映中的鍵是引數或頭的名稱,但這些值是 String 物件的陣列,其中的每個元素都是單一引數值或頭值。
cookie 隱式物件提供了對由請求設定的 cookie 名稱的訪問。這個物件將所有與請求相關聯的 cookie 名稱對映到表示那些 cookie 特性的 Cookie 物件。
最後一個 EL 隱式物件 initParam 是一個對映,它儲存與 Web 應用程式相關聯的所有上下文的初始化引數的名稱和值。初始化引數是透過 web.xml 部署描述符檔案指定的,該檔案位於應用程式的 WEB-INF 目錄中。
存取器
結果是,對這些物件的特性或(在物件是陣列和集合的情況下)對其元素的訪問通常是令人滿意的。就為了實現這種用途,EL 提供了兩種不同的存取器(點運算子(.)和方括號運算子([])),也支援透過 EL 操作特性和元素。
點運算子通常用於訪問物件的特性。例如,在表示式 ${user.firstName} 中,使用點運算子來訪問 user 識別符號所引用物件的名為 firstName 的特性。EL 使用 Java bean 約定訪問物件特性,因此必須定義這個特性的 getter 方法(通常是名為 getFirstName() 的方法),以便表示式正確求值。當被訪問的特性本身是物件時,可以遞迴地應用點運算子。例如,如果我們虛構的 user 物件有一個實現為 Java 物件的 address 特性,那麼也可以用點運算子來訪問這個物件的特性。例如,表示式 ${user.address.city} 將會返回這個地址物件巢狀的 city 特性。
方括號運算子用來檢索陣列和集合的元素。在陣列和有序集合(也即,實現了 java.util.List 介面的集合)的情況下,把要檢索的元素的下標放在方括號中。例如,表示式 ${urls[3]} 返回 urls 識別符號所引用的陣列或集合的第四個元素(和 Java 語言以及 JavaScript 中一樣,EL 中的下標是從零開始的)。
對於實現 java.util.Map 介面的集合,方括號運算子使用關聯的鍵查詢儲存在對映中的值。在方括號中指定鍵,並將相應的值作為表示式的值返回。例如,表示式 ${commands["dir"]} 返回與 commands 識別符號所引用的 Map 中的 "dir" 鍵相關聯的值。
對於上述兩種情況,都可允許表示式出現在方括號中。對巢狀表示式求值的結果將被作為下標或鍵,用來檢索集合或陣列的適當元素。和點運算子一樣,方括號運算 符也可以遞回應用。這使得 EL 能夠從多維陣列、巢狀集合或兩者的任意組合中檢索元素。此外,點運算子和方括號運算子還可以互操作。例如,如果陣列的元素本身是物件,則可以使用方括號運 算符來檢索該陣列的元素,並結合點運算子來檢索該元素的一個特性(例如 ${urls[3].protocol})。
假定 EL 充當指定動態屬性值的簡化語言,EL 存取器有一個有趣的功能(與 Java 語言的存取器不同),那就是它們在應用於 null 時不丟擲異常。如果應用 EL 存取器的物件(例如,${foo.bar} 和 ${foo["bar"]} 中的 foo 識別符號)是 null,那麼應用存取器的結果也是 null。事實證明,在大多數情況下,這是一個相當有用的行為,不久您就會了解這一點。
最後,點運算子和方括號運算子可能實現某種程度的互換。例如,也可以使用 ${user["firstName"]} 來檢索 user 物件的 firstName 特性,正如可以用 ${commands.dir} 獲取與 commands 對映中的 "dir" 鍵相關聯的值一樣。
運算子
最終,EL 還包括了幾個用來操作和比較 EL 表示式所訪問資料的運算子。表 2 中彙總了這些運算子。
表 2. EL 運算子
類別 運算子
算術運算子 +、-、*、/(或 div)和 %(或 mod)
關係運算子 ==(或 eq)、!=(或 ne)、<(或 lt)、>(或 gt)、<=(或 le)和 >=(或 ge)
邏輯運算子 &&(或 and)、||(或 or)和 !(或 not)
驗證運算子 empty
算術運算子支援數值的加法、減法、乘法和除法。還提供了一個求餘運算子。注:除法和求餘運算子都有替代的、非符號的名稱(為的是與 XPath 保持一致)。清單 5 中顯示了一個演示算術運算子用法的示例表示式。對幾個 EL 表示式應用算術運算子的結果是將該算術運算子應用於這些表示式返回的數值所得的結果。
清單 5. 利用算術運算子的 EL 表示式
|
關係運算子允許比較數字或文字資料。比較的結果作為布林值返回。邏輯運算子允許合併布林值,返回新的布林值。因此,可以將 EL 邏輯運算子應用於巢狀的關係或邏輯運算子的結果,如清單 6 所示。
清單 6. 利用關係和邏輯運算子的 EL 表示式
|
最後一種 EL 運算子是 empty,它對於驗證資料特別有用。empty 運算子采用單個表示式作為其變數(也即,${empty input}),並返回一個布林值,該布林值表示對錶達式求值的結果是不是“空”值。求值結果為 null 的表示式被認為是空,即無元素的集合或陣列。如果引數是對長度為零的 String 求值所得的結果,則 empty 運算子也將返回 true。
表 3 顯示了 EL 運算子的優先順序。正如清單 5 和 6 所示,可以用圓括號對錶達式分組,高於普通的優先順序規則。
表 3. EL 運算子優先順序(自頂到底,從左到右)
|
文字
在 EL 表示式中,數字、字串、布林值和 null 都可以被指定為文字值。字串可以用單引號或雙引號定界。布林值被指定為 true 和 false。
Taglib 偽指令
正如我們先前討論的,JSTL 1.0 包括四個定製標記庫。為了演示 JSTL 標記和表示式語言的互動,我們將研究幾個來自 JSTL core 庫的標記。和使用任何 JSP 定製標記庫一樣,必須在您想要使用這個庫標記的任何頁面中包括 taglib 偽指令。清單 7 顯示了用於這個特定庫的偽指令。
清單 7. 用於 JSTL core 庫 EL 版本的 taglib 偽指令
清單 8. 用於 JSTL core 庫 RT 版本的 taglib 偽指令
變數標記
清單 9.
清單 10 中顯示了
清單 10.
清單 11. 透過主體內容指定
|
清單 12.
輸出
清單 13.
例如,假定有一個名為 user 的會話作用域變數,它是一個類的例項,該類為使用者定義了兩個特性:username 和 company。每當使用者訪問站點時,這個物件被自動分配給會話,但直到使用者實際登入後,才會設定這兩個特性。假定是這種方案,請考慮清單 14 中的 JSP 片段。在使用者登入之後,這個片段將顯示單詞“Hello”,其後是他/她的使用者名稱和一個驚歎號。但是,在使用者登入之前,由這個片段生成的內容則是短語 “Hello Guest!”。在這種情況下,因為 username 特性還有待初始化,所以
清單 14. 帶預設內容的
|
清單 15. 禁用轉義的
用預設值設定變數
清單 16 中說明了這種方法。外部
清單 16. 合併
EL 和 JSP 2.0
Your preferred time zone is ${timezone}
。這個 JSP 2.0 功能(就象 JSTL 本身一樣)將支援頁面作者進一步減少對 JSP 編制指令碼元素的依賴,從而改進 JSP 應用程式的可維護性。
結束語
清單 17. 合併
|
參考資料
“Using
JSPs and custom tags within VisualAge for Java and WebSphere
Studio”(WebSphere 開發者園地)是一篇 WBOnline 實用論文,它演示了 servlet、JSP 和定製標記庫的使用。
透過 Jeff Wilson 精彩的文章“使用定製標記控制 JSP 頁面”(developerWorks,2002 年 1 月)瞭解關於定製標記庫的一切。
Noel Bergman 的文章“JSP 標記庫:著意設計的更好的可用性”(developerWorks,2001 年 12 月)向您展示了宣告性標記是如何幫助提高 JSP 頁面的可用性的。
有關 EcmaScript 的更多詳細資訊,請參閱 Sing Li 的“快速上手 Java 程式設計”(developerWorks,2001 年 7 月)。
在 developerWorks Java 技術專區可以找到多達數百篇的 Java 技術參考資料。
[@more@]
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7558084/viewspace-1003497/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- JSTLJS
- EL&JSTL26_JSTL標籤3JS
- JSTL標籤JS
- Java for Web學習筆記(二五):JSTL(1)使用JSTLJavaWeb筆記JS
- JSP三(JSTL)JS
- JSTL基礎用法JS
- jstl處理字串JS字串
- jstl處理日期JS
- JSP&&EL&&JSTLJS
- jstl 寫的分頁JS
- JSTL標籤工具類JS
- JSTL 每天積極向上JS
- jstl forEach遍歷JS
- jstl 時間data格式JS
- jstl格式化日期JS
- JSTL的相關使用JS
- JSTL取list 長度JS
- Jstl中標籤的使用JS
- jstl表示式引用檔案JS
- 在GAE裡面使用JSTLJS
- Lomboz開發JSTL和ELJS
- jstl-fn函式篇JS函式
- 使用Jstl異常:The absolute uri: http://java.sun.com/jsp/jstl/core cannot&nbsJSHTTPJava
- JavaWEB開發12——el&jstlJavaWebJS
- EL表示式 與JSTL標籤JS
- Java Web(七) JSTL標籤庫JavaWebJS
- JSTL 入門: 表示式語言JS
- JSTL Tag學習筆記之<fn: />JS筆記
- Accessing Java Constants from JSTL or OGNLJavaJS
- JSTL+Spring+Hibernate中文ya}JSSpring
- 關於jsp中使用jstl薦JS
- JSTL的標籤及使用,包含例項JS
- JSTL各個標籤的解析以及使用JS
- jstl/jsp--el 判斷為空JS
- JSTL動態載入單選框--【ssnc】JS
- JSTL Tag學習筆記(二)之<fmt: />JS筆記
- JSTL Tag學習筆記(一)之<c: />JS筆記
- 使用jstl無法遍歷bean中的集合JSBean