JSTL標籤 介紹

JSTL 全名爲JavaServer Pages Standard Tag Library,目前最新的版本爲1.1。JSTL是由JCP(Java Community Process)所指定的標準規格,它主要提供給Java Web 開發人員一個標準通用的標籤函數庫。
Web 程序開發人員能夠利用JSTL 和EL來開發Web 程序,取代傳統直接在頁面上嵌入Java程序(Scripting)的做法,以提高程序可讀性、維護性和方便性。
本章中,我們將詳細介紹如何使用JSTL 中各種不同的標籤,將依序介紹條件、循環、URL、U18N、XML、SQL 等標籤的用法,讓讀者對JSTL 有更深層的瞭解,並且能夠學會如何使用JSTL。

7-1 JSTL1.1簡介
JavaServer Pages Standard Tag Library (1.1 ),它的中文名稱爲JSP 標準標籤函數庫。JSTL是一個標準的已制定好的標籤庫,可以應用於各種領域,如:基本輸入輸出、流程控制、循環、XML文件剖析、數據庫查詢及國際化和文字格式標準化的應用等。從表7-1 可以知道,JSTL所提供的標
籤函數庫主要分爲五大類:
(1)核心標籤庫 (Core tag library)
(2)I18N 格式標籤庫 (I18N-capable formatting tag library)
(3)SQL 標籤庫 (SQL tag library)
(4)XML 標籤庫 (XML tag library)
(5)函數標籤庫 (Functions tag library)

另外,JSTL 也支持EL(Expression Language)語法,例如:在一個標準的JSP 頁面中可能會使用到如下的寫法:
<%= userList.getUser().getPhoneNumber() %>
使用JSTL 搭配傳統寫法會變成這樣:
<c_rt:out value="<%= userList.getUser( ).getPhoneNumber( ) %>" />
使用JSTL 搭配EL,則可以改寫成如下的形式:
<c:out value="${userList.user.phoneNumber}" />
有關EL的知識請參考相關的資料.

7-1-1 安裝使用JSTL 1.1
1.1 必須在支持Servlet 2.4 且JSP 2.0 以上版本的Container 纔可使用。JSTL 主要由Apache組織的Jakarta Project 所實現,因此讀者可以下載實現好的JSTL1.1,
將lib 中的jstl.jar、standard.jar 複製到工程的WEB-INF/lib 中,然後就可以在JSP 網
頁中使用JSTL了。除了複製 .jar 文件外,最好也把tld 文件的目錄也複製到WEB-INF 中,以便日後使用。

注意
lib 目錄下,除了jstl.jar 和standard.jar之外,還有old-dependencies目錄,這目錄裏面的東西是讓之前JSTL 1.0 的程序也能夠在JSTL 1.1 環境下使用。tld 目錄下有許多TLD 文件,其中大部分都是JSTL 1.0 的TLD 文件,例如:c-1_0.tld 和c-1_0-rt.tld。
下面寫一個測試用的範例程序helloJSTL.jsp,程序主要是顯示瀏覽器的版本和歡迎的字符串。
■ helloJSTL.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>測試你的第一個使用到JSTL 的網頁</title>
</head>
<body>
<c:out value="歡迎測試你的第一個使用到JSTL 的網頁"/>
</br>你使用的瀏覽器是:</br>
<c:out value="${header['User-Agent']}"/>
<c:set var="a" value="David O'Davies" />
<c:out value="David O'Davies" escapeXml="true"/>
</body>
</html>
在helloJSTL.jsp 的範例裏,我們用到核心標籤庫(Core)中的標準輸出功能和EL 的header隱含對象。若要在JSP 網頁中使用JSTL 時,一定要先做下面這行聲明:
< %@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
這段聲明表示我將使用JSTL 的核心標籤庫。一般而言,核心標籤庫的前置名稱(prefix)都爲c,當然你也可以自行設定。不過uri 此時就必須爲 http://java.sun.com/jsp/jstl/core
接下來使用核心標籤庫中的out 標籤,顯示value的值。${header['User-Agent']}表示取得表頭裏的User-Agent 的值,即有關用戶瀏覽器的種類。
<c:out value="歡迎測試你的第一個使用到JSTL 的網頁" />
<c:out value="${header['User-Agent']}" />
假若讀者想要自定義taglib的uri 時,那就必須在web.xml中加入設定值。例如:假若uri想要改爲http://www.javaworld.com.tw/jstl/core 時,web.xml 就必須加入如下設定:
<web-app>
<jsp-config>
<taglib>
<taglib-uri>http://www.javaworld.com.tw/jstl/core</taglib-uri>
<taglib-location>/WEB-INF/tld/c.tld</taglib-location>
核心標籤庫 (Core tag library)
首先介紹的核心標籤庫(Core)主要有:基本輸入輸出、流程控制、迭代操作和URL 操作。詳細的分類如表7-2 所示,接下來我們將一一介紹每個標籤的功能。
表達式操作
表達式操作分類中包含四個標籤:<c:out>、<c:set>、<c:remove>和<c:catch>。接下來將依序介紹這四個標籤的用法。
● <c:out>
<c:out>主要用來顯示數據的內容,就像是 <%= scripting-language %> 一樣,例如:
<c:out value="${username}" />
語法
語法1:沒有本體(body)內容
<c:out value="value" [escapeXml="{true|false}"] [default="defaultValue"] />
語法2:有本體內容
<c:out value="value" [escapeXml="{true|false}"]>
default value
</c:out>
屬性
value 需要顯示出來的值
default 如果value的值爲null,則顯示default屬性
escapexml 是否轉換特殊字符,如<轉換成&lt;
Null 和 錯誤處理
• 假若value爲null,會顯示default 的值;假若沒有設定default的值,則會顯示一個空的字符串。
說明
一般來說,<c:out>默認會將 <、>、’、” 和 & 轉換爲 &lt;、&gt;、&#039;、&#034; 和 &amp;。假若不想轉換時,只需要設定<c:out>的escapeXml 屬性爲fasle 就可以了
範例
<c:out value="Hello JSP 2.0 !! " />
<c:out value="${ 3 + 5 }" />
<c:out value="${ param.data }" default="No Data" />
<c:out value="<p>有特殊字符</p>" />
<c:out value="<p>有特殊字符</p>" escapeXml="false" />
<c:set>
<c:set>主要用來將變量儲存至JSP 範圍中或是JavaBean 的屬性中。
語法
語法1:將 value 的值儲存至範圍爲scope 的 varName 變量之中
<c:set value="value" var="varName" [scope="{ page|request|session|application }"]/>
語法2:將本體內容的數據儲存至範圍爲scope 的 varName 變量之中
<c:set var="varName" [scope="{ page|request|session|application }"]>
… 本體內容
</c:set>
語法3:
將 value 的值儲存至 target 對象的屬性中
< c:set value="value" target="target" property="propertyName" />
語法4:
將本體內容的數據儲存至 target 對象的屬性中
<c:set target="target" property="propertyName">
… 本體內容
</c:set>
屬性
value 要被存儲的值
var 欲存入變量的名稱
scope var變量的jsp範圍,默認值page
target 爲一個javaBean或java.util.Map的對象
property 指定target對象的屬性
Null 和 錯誤處理
語法3 和語法4 會產生異常錯誤,有以下兩種情況:
☆ target 爲null
☆ target 不是java.util.Map 或JavaBean 對象
假若value 爲null 時:將由儲存變量改爲移除變量
☆ 語法1:由var 和scope 所定義的變量,將被移除
□ 若scope 已指定時,則PageContext.removeAttribute(varName, scope)
□ 若scope 未指定時,則PageContext.removeAttribute(varName)
☆ 語法3:
□ 假若target 爲Map 時,則Map.remove(property)
□ 假若target 爲JavaBean 時,property 指定的屬性爲null
說明
使用<c:set>時,var 主要用來存放表達式的結果;scope 則是用來設定儲存的範圍,例如:假若scope="session",則將會把數據儲存在session中。如果<c:set>中沒有指定scope時,則它會默認存在Page 範圍裏。
注意
var 和scope 這兩個屬性不能使用表達式來表示,例如:我們不能寫成
scope="${ourScope}"或者是var="${username}"。
我們考慮下列的寫法:
<c:set var="number" scope="session" value="${1 + 1}"/>
把1+1的結果2儲存到number變量中。如果<c:set>沒有value屬性,此時value之值在<c:set>
和</c:set>之間,本體內容看下面的範例:
<c:set var="number" scope="session">
<c:out value="${1+1}" />
</c:set>
上面的 <c:out value="${1+1}" /> 部分可以改寫成2 或是 <%=1+1%> ,結果都會一樣,也就是說,<c:set>是把本體(body)運算後的結果來當做value的值。另外,<c:set>會把body 中最開頭和結尾的空白部分去掉。如:
<c:set var="number" scope="session">
_____________1 + 1
</c:set>
則number 中儲存的值爲1 + 1 而不是 1 + 1。
範例
1,<c:set var="number" scope="request" value="${1 + 1}" />
2,<c:set var="number" scope="session" />
${3 + 5}
</c:set>
3,<c:set var="number" scope="request" value="${ param.number }" />
4,<c:set target="User" property="name" value="${ param.Username}" />
1.將2 存入Request 範圍的number 變量中;
2.將8 存入Session 範圍的number 變量中;
3. 假若 ${param.number}爲null 時,則移除Request 範圍的number變量;若${param.number}不爲null 時,則將 ${param.number}的值存入Request 範圍的number 變量中;
4.假若 ${param.Username}爲null 時,則設定User(JavaBean)的name 屬性爲null;若不爲null 時,則將 ${param.Username}的值存入User(JavaBean)的name 屬性(setter 機制)。
注意
上述範例的3.中,假若 ${param.number}爲null時,則表示移除Request範圍的number變量。


● <c:remove>
<c:remove>主要用來移除變量。
語法
<c:remove var="varName" [scope="{ page|request|session|application }"] />
屬性
var 欲移除變量名稱
scope var變量的jsp範圍,默認值page
<c:remove>必須要有var 屬性,即要被移除的屬性名稱,scope 則可有可無,例如:
<c:remove var="number" scope="session" />
將number 變量從Session 範圍中移除。若我們不設定scope,則<c:remove>將會從Page、
Request、Session 及Application 中順序尋找是否存在名稱爲number 的數據,若能找到時,
則將它移除掉,反之則不會做任何的事情。
範例
我們在這裏寫一個使用到<c:set>和<c:remove>的範例,能讓讀者可以更快地瞭解如何使用
它們,此範例的名稱爲Core_set_remove.jsp。
<c:catch>
<c:catch>主要用來處理產生錯誤的異常狀況,並且將錯誤信息儲存起來。

語法
<c:catch [var="varName"] >
… 欲抓取錯誤的部分
</c:catch>
屬性
var 用來存儲錯誤信息的變量
說明
<c:catch>主要將可能發生錯誤的部分放在<c:catch>和</c:catch>之間。如果真的發生錯誤,可以將錯誤信息儲存至varName 變量中,例如:
<c:catch var="message">
: //可能發生錯誤的部分
</c:catch>
另外,當錯誤發生在<c:catch>和</c:catch>之間時,則只有<c:catch>和</c:catch>之間的程序會被中止忽略,但整個網頁不會被中止。
範例
我們寫一個簡單的範例,文件名爲Core_catch.jsp,來讓大家看一下<c:catch>的使用方式。
流程控制
流程控制分類中包含四個標籤:<c:if>、<c:choose>、<c:when>和<c:otherwise>,我們依此順序依次說明這四個標籤的使用。
● <c:if>
<c:if>的用途就和我們一般在程序中用的if 一樣。

語法
語法1:沒有本體內容(body)
<c:if test="testCondition" var="varName"
[scope="{page|request|session|application}"]/>
語法2:有本體內容
<c:if test="testCondition" [var="varName"]
[scope="{page|request|session|application}"]>
具體內容
</c:if>
屬性
test 如果表達式結果爲true,則執行本體內容,false則相反。類型Bolean
var 用來存儲test運算後的結果,即true或false,類型String
scope var變量的jsp範圍,默認值page
說明
<c:if> 標籤必須要有test 屬性,當test 中的表達式結果爲true 時,則會執行本體內容;如果爲false,則不會執行。例如:${param.username = = 'admin'},如果param.username 等於admin時,結果爲true;若它的內容不等於admin 時,則爲false。
接下來看下列的範例:
<c:if test="${param.username = = 'admin' }">
ADMIN 您好!! //body 部分
</c:if>
如果名稱等於admin,則會顯示"ADMIN您好!! "的動作,如果相反,則不會執行<c:if>的body部分,所以不會顯示"ADMIN 您好!! //body 部分"。另外<c:if>的本體內容除了能放純文字,還可以放任何JSP 程序代碼(Scriptlet)、JSP 標籤或者HTML 碼。除了test 屬性之外,<c:if>還有另外兩個屬性var和scope。當我們執行<c:if>的時候,可以將這次判斷後的結果存放到屬性var 裏;scope 則是設定var 的屬性範圍。哪些情況纔會用到var和scope 這兩個屬性呢?例如:當表達式過長時,我們會希望拆開處理,或是之後還須使用此結果
時,也可以用它先將結果暫時保留,以便日後使用。
範例
我們寫了一個簡單的範例,名稱爲Core_if.jsp。
■ Core_if.jsp
<%@ page contentType="text/html;charset=GB2312 " %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<title>CH7 - Core_if.jsp</title>
</head>
<body>
<h2><c:out value="<c:if> 的用法" /></h2>
<c:if test="${param.username == 'Admin'}" var="condition" scope="page">
您好Admin 先生
</c:if></br>
執行結果爲: ${condition}
</body>
</html>
我們在判斷用戶送來的參數時,如果username 的值等於Admin 時,則會將condition 設爲true並存放於pageScope中,否則存放於condition中,最後再顯示結果。因爲JSTL會自動找尋condition所存在的屬性範圍,因此只須使用 ${condition},而不用 ${pageScope.condition}。

<c:choose>
<c:choose>本身只當做 <c:when> 和 <c:otherwise> 的父標籤。
語法
<c:choose>
本體內容( <when> 和 <otherwise> )
</c:choose>

限制
<c:choose>的本體內容只能有:
•空白
•1 或多個 <c:when>
•0 或多個 <c:otherwise>
說明
若使用<c:when>和<c:otherwise>來做流程控制時,兩者都必須爲<c:choose>的子標籤,即:
<c:choose>

<c:when>
</c:when>

<c:otherwise>
</c:otherwise>

</c:choose>
<c:when>
<c:when> 的用途就和我們一般在程序中用的when 一樣。
語法
<c:when test="testCondition" >
本體內容
</c:when>
屬性
test 如果表達式的結果爲true,則執行本體內容,否則相反
限制
☆ <c:when>必須在<c:choose>和</c:choose>之間
☆ 在同一個<c:choose>中時,<c:when>必須在<c:otherwise>之前
說明
<c:when>必須有test 屬性,當test 中的表達式結果爲true 時,則會執行本體內容;如果爲false 時,則不會執行。

發佈了68 篇原創文章 · 獲贊 2 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章