概述html
在 JSP 頁面中,使用標籤庫代替傳統的 Java 片斷語言來實現頁面的顯示邏輯已經不是新技術了,然而,由自定義標籤很容易形成重複定義和非標準的實現。鑑於此,出現了 JSTL ( JSP Standard Tag Library )。大多數 JSP 頁面邏輯提供了實現的 JSTL 技術,該技術自己就是一個標籤庫。java
Sun 公司 Java 規範標準的 JSTL 由 apache jakarta 組織負責維護。做爲開源的標準技術,它一直在不斷地完善。 JSTL 的發佈包有兩個版本: Standard-1.0 Taglib 、 Standard-1.1 Taglib ,它們在使用時是不一樣的。數據庫
Standard-1.0 Taglib ( JSTL1.0 )支持 Servlet2.3 和 JSP1.2 規範, Web 應用服務器 Tomcat4 支持這些規範,而它的發佈也在 Tomcat 4.1.24 測試經過了。apache
Standard-1.1 Taglib ( JSTL1.1 )支持 Servlet2.4 和 JSP2.0 規範, Web 應用服務器 Tomcat5 支持這些規範,它的發佈在 Tomcat 5.0.3 測試經過了。數組
在本章的介紹中,將以由 Sun 發佈的 Standard-1.1 Taglib 標籤庫爲主,而 apache jakarta 組織發佈的開源標籤庫,能夠從 http://jakarta.apache.org/taglibs/ 找到所須要的幫助。 Sun 發佈的標準 JSTL1.1 標籤庫有如下幾個標籤:服務器
核心標籤庫:包含 Web 應用的常見工做,好比:循環、表達式賦值、基本輸入輸出等。cookie
國際化標籤庫:用來格式化顯示數據的工做,好比:對不一樣區域的日期格式化等。session
數據庫標籤庫:能夠作訪問數據庫的工做。app
XML 標籤庫:用來訪問 XML 文件的工做,這是 JSTL 標籤庫的一個特色。jsp
函數標籤庫:用來讀取已經定義的某個函數。
此外, JSTL 還提供了 EL 表達式語言( Expression Language )來進行輔助的工做。
JSTL 標籤 庫由標籤庫和 EL 表達式語言兩個部分組成。 EL 在 JSTL 1.0 規範中被引入,當時用來做爲 Java 表達式來工做,而該表達式必須配合 JSTL 的標籤庫才能獲得須要的結果。
說明:在 JSTL 1.1 規範中, JSP2.0 容器已經可以獨立的理解任何 EL 表達式。 EL 能夠獨立出如今 JSP 頁面的任何角落。本文隨後的內容將以 JSTL 1.1 規範做爲介紹的重點。
9.2.1 JSTL EL 表達式語言簡介
EL 是從 JavaScript 腳本語言獲得啓發的一種表達式語言,它借鑑了 JavaScript 多類型轉換無關性的特色。在使用 EL 從 scope 中獲得參數時能夠自動轉換類型,所以對於類型的限制更加寬鬆。 Web 服務器對於 request 請求參數一般會以 String 類型來發送,在獲得時使用的 Java 語言腳本就應該是 request.getParameter(「XXX」) ,這樣的話,對於實際應用還必須進行強制類型轉換。而 EL 就將用戶從這種類型轉換的繁瑣工做脫離出來,容許用戶直接使用 EL 表達式取得的值,而不用關心它是什麼類型。
下面的示例就是一個 EL 表達式,見例 9.1 。
例 9.1 :簡單 EL 表達式
<%@ page contentType="text/html; charset=UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <body> ${sampleValue + 1} <br> </body> </html>
這個示例將在 JSP 頁面顯示爲「 1 」, EL 表達式必須以「 ${XXX} 」來表示,其中「 XXX 」部分就是具體表達式內容,「 ${} 」將這個表達式內容包含在其中做爲 EL 表達式的定義。本示例能夠在知足 JSP2.0 規範的任何 Web 應用服務器中使用。
9.2.2 EL 表達式的默認變量
一個 EL 表達式包含變量和操做符兩個內容。任何存在於 JSP 做用範圍的 JavaBean 均可以被轉化成 EL 表達式來使用,它所包含的默認變量以下:
1 .默認變量 pageScope 、 requestScope 、 sessionScope 、 applicationScope
這 4 個默認變量包含 Scope 做用範圍的參數集合,至關於被保存在 java.util.Map 中的某個參數。下面看簡單的示例 9.2 :
例 9.2 :使用 sessionScope 變量的 EL 表達式
<%request.getSession().setAttribute("sampleValue", new Integer(10));%>
${sessionScope.sampleValue}
取得保存在 Session 中參數的 sessionScope 變量的 EL 表達式,「 . 」是 property 訪問操做符,在這裏表示從 Session 中取得「鍵」爲「 sampleValue 」的參數,並顯示出來。顯示結果爲「 10 」。
2 .默認變量 param 、 paramValues
這兩個默認變量包含請求參數的集合, param 代表請求包含的參數爲單一控件, paramValues 代表請求包含的參數爲控件數組。下面看一個簡單示例 9.3 :
例 9.3 :提交請求的頁面和接受的頁面
01 <%@ page contentType="text/html; charset=UTF-8"%> 02 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 03 <html> 04 <body> 05 <form action="SampleJsp.jsp"> 06 <input type="text" name="sampleValue" value="10"> 07 <input type="text" name="sampleValue" value="11"> 08 <input type="text" name="sampleValue" value="12"> 09 <input type="text" name="sampleSingleValue" value="SingleValue"> 10 <input type="submit" value="Submit"> 11 </form> 12 </body> 13 </html>
在這個頁面中定義了兩組控件,控件名爲「 sampleValue 」的是一套控件數組,控件名爲「 sampleSingleValue 」的是單一控件,經過遞交將請求參數傳送到 SampleJsp.jsp 。
1 <%@ page contentType="text/html; charset=UTF-8"%> 2 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 3 <html> 4 <body> 5 ${paramValues.sampleValue[2]} <br> 6 ${param.sampleSingleValue} <br> 7 </body> 8 </html>
這是請求轉發到的頁面,經過 EL 表達式的 paramValues 變量獲得控件數組中最後一個控件的遞交參數,經過 EL 表達式的 param 變量獲得單一控件的遞交參數。控件數組參數的 EL 表達式使用「 [] 」來指定數組下標。本示例將顯示控件數組中最後一個控件的值「 12 」和單一控件的值「 SingleValue 」。
3 .默認變量 header 、 headerValues
這兩個默認變量包含請求參數頭部信息的集合, header 變量表示單一頭部信息, headerValues 則表示數組型的頭部信息。
4 .默認變量 cookie
包含全部請求的 cookie 集合,集合中的每一個對象對應 javax.servlet.http.Cookie 。
5 .默認變量 initParam
包含全部應用程序初始化參數的集合。
6 .默認變量 pageContext
等價於 page 環境類 javax.servlet.jsp.PageContext 的實例,用來提供訪問不一樣的請求參數。
11 個默認變量幾乎包含了 Web 應用的全部基本操做,若一個表達式不使用這些變量而直接使用參數名,那麼就採用就近原則。該表達式將使用最近取得的參數值。
9.2.3 EL 表達式的操做符
EL 表達式中還有許多操做符能夠幫助完成各類所需的操做,以前的示例中「 . 」、「 [] 」就是其中的兩個,下面將用表 9.1 來展現全部操做符及它們各自的功能。
表 9.1 EL 表達式的操做符