JSP標準標籤庫(JavaServer Pages Standard Tag Library,JSTL)是一個JSP標籤集合,它封裝了JSP應用的通用核心功能。JSTL支持通用的、結構化的任務,好比迭代,條件判斷,XML文檔操做,國際化標籤,SQL標籤。 除了這些,它還提供了一個框架來使用集成JSTL的自定義標籤。html
引入JSTL主要有如下兩個優勢:java
本篇博客要介紹的JSTL中最重要的標籤,尤爲是訪問有界對象(pageScope、requestScope、sessionScope、applicationScope)、遍歷集合、以及格式化數字和日期的那些標籤。若是有興趣進一步瞭解,能夠在JSTL規範文檔中找到全部JSTL標籤的完整版說明。git
注意:隨着EL 3.0的發佈,全部的JSTL核心標記均可以用EL表達式替代。然而,有些舊項目中包含JSTL,所以掌握JSTL仍然是頗有必要的。sql
JSTL目前的最新版本是1.2,這是由JSR-52專家組在JCP(www.jcp.org)上定義的,JSTL庫能夠在如下網站下載:數據庫
點擊Download,打開以下頁面:apache
咱們只須要下載前兩個便可:數組
剩下兩個包:taglibs-standard-jstlel-1.2.5.jar和taglibs-standard-compat-1.2.5.jar都是爲了兼容舊項目,這兩個包都是JSTL 1.0規範的實現包,這裏不作過多討論。瀏覽器
JSTL是標準標籤庫,可是它是經過多個標籤庫來暴露其行爲的。根據JSTL標籤所提供的功能,能夠將其分爲5個類別:tomcat
區域 | 子函數 | URI | 前綴 |
核心 | 變量支持 | http://java.sun.com/jsp/jstl/core | c |
流控制 | |||
URL管理 | |||
其餘 | |||
XML | 核心 | http://java.sun.com/jsp/jstl/xml | x |
流控制 | |||
轉換 | |||
國際化 | 語言區域 | http://java.sun.com/jsp/jstl/fmt | fmt |
消息格式化 | |||
數字和日期格式化 | |||
數據庫 | SQL | http://java.sun.com/jsp/jstl/sql | sql |
函數 | 集合長度 | http://java.sun.com/jsp/jstl/functions | fn |
字符串操做 |
在JSP頁面中使用JSTL庫,必須經過如下格式使用taglib指令:服務器
<%@ taglib uri="uri" prefix="prefix" %>
例如,要使用Core庫,必須在JSP頁面的開頭處作如下聲明:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
這個前綴可使任意的,可是採用慣例能使團隊的其餘開發人員以及後續加入該項目的其餘人員更容易熟悉這些代碼,所以,建議使用預訂的前綴。
核心標籤是最經常使用的 JSTL標籤。引用核心標籤庫的語法以下:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
標籤 | 描述 |
---|---|
<c:out> | 用於在JSP中顯示數據,就像<%= ... > |
<c:set> | 用於保存數據 |
<c:remove> | 用於刪除數據 |
<c:catch> | 用來處理產生錯誤的異常情況,而且將錯誤信息儲存起來 |
<c:if> | 與咱們在通常程序中用的if同樣 |
<c:choose> | 自己只當作<c:when>和<c:otherwise>的父標籤 |
<c:when> | <c:choose>的子標籤,用來判斷條件是否成立 |
<c:otherwise> | <c:choose>的子標籤,接在<c:when>標籤後,當<c:when>標籤判斷爲false時被執行 |
<c:import> | 檢索一個絕對或相對 URL,而後將其內容暴露給頁面 |
<c:forEach> | 基礎迭代標籤,接受多種集合類型 |
<c:forTokens> | 根據指定的分隔符來分隔內容並迭代輸出 |
<c:param> | 用來給包含或重定向的頁面傳遞參數 |
<c:redirect> | 重定向至一個新的URL. |
<c:url> | 使用可選的查詢參數來創造一個URL |
下面首先介紹Core庫中用來操做有界變量的通常行爲:out、set、remove。
在運算表達式時,out標籤是將結果輸出到當前的JspWriter。out語法有兩種形式,即有body content和沒有body content。
<c:out value="value" [escapeXml="true"] [default="defaultValue"]/> <c:out value="value" [escapeXml="true"] > defaultValue </c:out>
注意:在標籤的語法中,[]是可選的屬性。
out標籤的屬性以下:
屬性 | 類型 | 描述 |
value | 對象 | 要計算的表達式 |
escapeXml | 布爾 | 當設置爲true時,將value中的值以字符串的形式原封不動的顯示出來;當設置爲false,將value中的html標籤以HTML格式顯示;默認是true |
default | 對象 | 默認值,當賦予給value屬性的EL表達式返回null時,就會使用該默認值。 |
例如,下列的out標籤將輸出有界變量x的值:
<c:out value="${x}"/>
其中x爲字符串類型,值爲「測試」。則在頁面顯示結果爲:
當把escapeXml設置false時,out會將字符實體碼<>'"&轉換成html對應的字符<、>、'、「和&。
<c:out value="<>'"&;" escapeXml="false" /><br> <c:out value="<>'"&;" escapeXml="true" /><br>
輸出以下:
url標籤是很是有用的,簡而言之,url標籤執行如下任意操做:
本節將會經過一個小的應用程序來解釋url標籤的重要性,應用程序的結構以下圖:
該應用由兩個JSP頁面main.jsp和admin.jsp組成。main.jsp文件位於應用程序根目錄中,admin.jsp位於admin文件夾中。兩者都須要顯示在圖像文件夾中的兩個圖像,image1.png,image2.png。請注意,圖片的絕對路徑是:
http://host/context/image/image1.png
http://host/context/image/image2.png
由於兩個圖片從不一樣的位置被引用屢次,爲了方便使用,用一個包含文件來引用它們。任何須要顯示圖像的JSP頁面僅須要將包含文件添加到文件中便可。
(1)inc1.jsp:
inc1.jsp <img src="image/image1.png"/> <img src="../image/image2.png"/>
第一個包含文件包含路徑是相對當前頁的路徑,假設main.jsp頁面的URL是http://host/context/main.jsp,那麼這兩個圖像的URL將被解析爲如下URL:
http://host/context/image/image1.png
http://host/context/../image/image2.png
不難想象,結果不太使人滿意,第一個圖像能正常顯示,可是第二個圖像不能。
當經過http://host/context/admin/admin.jsp訪問管理頁面時,圖像的URL解析成以下:
http://host/context/admin/image/image1.png
http://host/context/admin/../image/image2.png
結果第一個圖像不能正常顯示,可是第二個圖像將顯示。
很明顯,使用相對路徑並不能總工做,由於能夠從不一樣的目錄中的JSP頁面調用包含文件。咱們惟一但願的是使圖像URL相對於應用程序自己,因此就有了第二個包含文件inc2.jsp。
(2) inc2.jsp:
inc2.jsp <img src="/image/image1.png"/> <img src="/image/image2.png"/>
這樣看起來不錯,應該能工做了吧?遺憾的是,它並不適用於全部狀況。這是由於在開發應用程序時,部署上下文路徑一般是未知的。根據應用程序是否部署爲默認上下文,admin.jsp頁面可能具備如下URL之一:
http://host/context/admin/admin.jsp
http://host/admin/admin.jsp
在這兩種狀況下,瀏覽器不知道上下文路徑。事實上,在第一個URL的狀況下,它會認爲應用程序被部署爲默認上下文(即服務器根路徑),context是一個目錄。所以,它將解析到第一個圖像的URL爲:
http://host/image/image1.png
很顯然圖像沒法正常工做。實際上,僅當應用程序真正被部署到默認上下文時(即admin.jsp的URL爲http://host/admin/admin.jsp),才能正確顯示這兩個圖像。
注意:<img src="/image/image1.png"/>這個根路徑並非指的應用程序的根路徑,而是服務器根路徑,或者說是http://localhost:port/;
(2) inc3.jsp:
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> inc3.jsp <img src="<c:url value="/image/image1.png"/>"/> <img src="<c:url value="/image/image2.png"/>"/>
這種寫法解決了咱們的問題,由於url標籤在服務器上執行,它知道上下文路徑是什麼。因此,它能夠正確的解析圖像的路徑。這裏的"/"指的就是應用程序的根路徑。
(4) inc4.jsp:
inc4.jsp <!-- 經過EL定義cp變量,可是不在html中顯示 --> <!-- ${cp=pageContext.request.contextPath} --> <img src="${cp=="/"? "" : cp}/image/image1.png"/> <img src="${cp=="/"? "" : cp}/image/image2.png"/> <br/> ${cp}
下面這種採用EL表達式的寫法,咱們使用如下EL表達式獲取上下文路徑:
${pageContext.request.contextPath}
相同的表達式將會被屢次使用,所以建立了一個變量:
${cp=pageContext.request.contextPath}
然而,該值仍然會發送到瀏覽器中顯示,因此須要將其放在一個HTML註釋中。而後,只須要測試上下文路徑是"/"仍是別的東西。
${cp=="/"? "" : cp}
main.jsp:
<!DOCTYPE html> <html> <head> <title>Main Page</title> <style> img { width:200px; } </style> </head> <body> <h2>Main Page</h2> <%@include file="include/inc1.jsp"%> <hr/> <%@include file="include/inc2.jsp"%> <hr/> <%@include file="include/inc3.jsp"%> <hr/> <%@include file="include/inc4.jsp"%> </body> </html>
admin.jsp:
<!DOCTYPE html> <html> <head> <title>Admin</title> <style> img { width:200px; } </style> </head> <body> <h2>Admin</h2> <%@include file="../include/inc1.jsp"%> <hr/> <%@include file="../include/inc2.jsp"%> <hr/> <%@include file="../include/inc3.jsp"%> <hr/> <%@include file="../include/inc4.jsp"%> </body> </html>
下面顯示了非默認上下文中的admin.jsp頁面:
能夠看到上下文路徑是:/jstl-demo。
利用set標籤,能夠完成如下工做:
注意:有界對象指的是隱式對象pageScope、requestScope、sessionScope、applicationScope。
若是用set建立有界變量,那麼在該標籤出現後的整個JSP頁面中均可以使用該變量。
set便籤的語法有4種形式。
(1)第一種像是用於建立一個有界變量,並用value屬性在其中定義一個要建立的字符串或者現存有界對象。
<c:set value="value" var="varName" [scope="{page|request|session|application}"]/>
這裏的scope屬性指定了有界變量的範圍,默認變量範圍是page。
例如,下面的set標籤則建立了字符串"The wisest fool",並將其賦給新建立的頁面範圍變量foo:
<c:set var="foo" value="The wisest fool"/> ${foo}
輸出以下:
下面的set標籤則建立了一個名爲job的有界變量,它引用requestScope對象的position屬性,變量job的範圍爲page:
<c:set var="job" value="${requestScope.position}" scope="page"/>
(2)第二種形式與第一種形式類似,只是要建立的字符串或者要引用的有界對象是做爲body content賦值的:
<c:set var="varName" [scope="{page|request|session|application}"]> body content </c:set>
第二種形式容許在body content中有JSP代碼。
(3)第三種形式是設置有界對象的屬性值。target屬性用於指定有界對象,property屬性用於指定有界對象的屬性。對該屬性的賦值是經過value屬性進行的:
<c:set target="target" property="propertyName" value="value"/>
例如,下面的set標籤是將字符串"Tokyo"賦予有界對象address的city屬性:
<c:set target="${address}" property="city" value="Tokyo"/> ${address.city}
輸出以下:
注意:必須在target屬性中用一個EL表達式來引用這個有界對象。
(4)第4種方式與第三種形式類似,只是賦值是做爲body content完成的:
<c:set target="target" property="propertyName"> body content </c:set>
例如,下面的set標籤是將字符串"Beijing"賦予有界對象address的city屬性:
<c:set target="${address}" property="city"> Beijing </c:set>
set標籤的屬性見表:
屬性 | 類型 | 描述 |
value | 對象 | 要建立的字符串,或者要引用的有界對象,或者新的屬性值 |
var | 字符串 | 要建立的有界變量 |
scope | 字符串 | 新建立的有界變量的範圍 |
target | 對象 | 其屬性要被賦予新值的有界對象;這必須是一個JavaBeans實例或者Java.util.Map對象 |
property | 字符串 | target所指定對象,要被賦予新值的屬性名稱 |
remove標籤用於刪除有界對象,其語法以下:
<c:remove var="varName" [scope="{page|request|session|application}"]/>
注意:有界對象引用的對象不能刪除,所以,若是另外一個有界對象也引用了同一個對象,仍然能夠經過另外一個有界變量訪問該對象。
remove標籤的屬性見表:
屬性 | 類型 | 描述 |
var | 字符串 | 要刪除的有界變量的名稱 |
scope | 字符串 | 要刪除的有界變量的範圍,默認是page |
例如,下面的remove標籤刪除了頁面範圍的變量job:
<c:remove var="job" scope="page"/>
下面介紹Core庫中執行條件行爲的標籤。JSTL中執行條件行爲的標籤有4個,即if、choose、when、otherwise。
if標籤是對某一個條件進行測試,假設結果爲true,就處理它的body content。測試結果保存在Boolean對象中,並建立有界變量來引用這個Boolean對象,利用var屬性和scope屬性分別定義有界變量的名稱和範圍。
if的語法有兩種形式。第一種形式沒有body content。
<c:if test="testCondition" var="varName" [scope="{page|request|session|application}"] />
在這種狀況下,var定義的有界對象通常是由其餘標籤在同一個JSP的後續階段進行測試。
第二種形式是使用一個body content:
<c:if test="testCondition" [var="varName"] [scope="{page|request|session|application}"]> body content </c:if>
body content是JSP,當測試條件的結果爲true時,就會獲得處理。例如:
<c:if test="${param.user='ken' && param.password == 'blackcomb'}" scope="page"> You logged in successfully. </c:if>
if標籤的屬性見表:
屬性 | 類型 | 描述 |
test | 布爾 | 決定是否處理任何現有body content的測試條件 |
var | 字符串 | 引用測試條件值的有界變量名稱;var的類型是Boolean |
scope | 字符串 | var定義的有界變量的範圍 |
爲了模擬else,下面使用了兩個if標籤,並使用了相反的條件。例如,若是user和password參數的值爲"ken"和「blackcomb」,如下代碼片斷將顯示 "You logged in successfully.",不然,將顯示"Login failed":
<c:if test="${param.user='ken' && param.password == 'blackcomb'}" scope="page"> You logged in successfully. </c:if> <c:if test="${!(param.user='ken' && param.password == 'blackcomb')}" scope="page"> Login failed. </c:if>
下面的if標籤測試user和password參數值是否分別爲「key」和"blackcomb",並將結果保存在頁面範圍的變量loggedIn中。以後,利用一個EL表達式,若是loggedIn變量值爲true,則顯示"You logged in successfully.",不然,將顯示"Login failed":
<c:if var="loggedIn" test="${param.user='ken' && param.password == 'blackcomb'}" scope="page"> ... ${loggedIn ? "You logged in successfully.":"Login failed."}
choose和when標籤的做用與Java中的關鍵字switch和case相似。也就是說,他們是用來爲相互排斥的條件執行提供上下文的。choose標籤中的必需嵌入有一個或者多個when標籤,而且每一個when標籤都表示一種能夠計算和處理的狀況。otherwise標籤則用於默認的條件快,假設沒有任何一個when標籤的測試條件結果爲true,otherwise就會獲得處理。假如是這種狀況,otherwise就必須放在最後一個when以後。
choose和otherwise標籤沒有屬性,when標籤必須帶有定義測試條件的test屬性,用來決定是否應該處理body content。
舉個例子,如下代碼是測試參數status的值,若是status的值爲full,將顯示「You ara a full member.」;若是這個值是student,則顯示「You are a student member.」;若是status參數不存在,或者它的值既不是full也不是student,那麼這段代碼將不顯示任何內容:
<c:choose> <c:when test="${ param.status=='full'}"> You are a full member. </c:when> <c:when test="${ param.status=='sdtudent'}"> You are a student member. </c:when> </c:choose>
下面的例子與前面的例子類似,可是它利用了otherwise標籤,若是status參數不存在,或者它的值不是full或student,則顯示「Please register.」:
<c:choose> <c:when test="${ param.status=='full'}"> You are a full member. </c:when> <c:when test="${ param.status=='sdtudent'}"> You are a student member. </c:when> <c:otherwise> Please register. </c:otherwise> </c:choose>
下面介紹Core庫中執行遍歷行爲的標籤。JSTL中執行遍歷行爲的標籤有2個,forEach和forTakens。這些標籤封裝了Java中的for,while,do-while循環。
forEach標籤會無數次的反覆遍歷body content或者集合對象。能夠遍歷的對象包括java.util.Collection和java.util.Map的全部實現,以及對象數組或者基本類型。也能夠遍歷java.util.Iterator和java.util.Enumeration,但不該該在多個行爲中使用Iterator或者Enumeration,由於沒法重置Iterator或者Enumeration。
forEach標籤的語法有兩種形式。第一種形式是固定次數的重複body content:
<c:forEach [var="varName"] begin="begin" end="end" step="step"> body content </c:forEach>
第二種形式用於遍歷集合對象:
<c:forEach items="collection" [var="varName"] [varStatus="varStatusName"] [begin="beagin"] [end="end"] [step="step"]> body content </c:forEach>
body content是JSP。
若是要遍歷Map,要分別利用key和value屬性引用一個Map key和一個Map value,遍歷Map的僞代碼以下所示:
<c:forEach var="mapItem" items="map" > ${mapItem.key}:${mapItem.value}<br/> </c:forEach>
forEach屬性見表:
屬性 | 描述 | 類型 | 默認值 |
---|---|---|---|
items | 要被遍歷的集合 | 支持的任意類型 | 無 |
begin | 開始的元素(0=第一個元素,1=第二個元素) | 整數 | 0 |
end | 最後一個元素(0=第一個元素,1=第二個元素) | 整數 | Last element |
step | 每一次迭代的步長 | 整數 | 1 |
var | 引用遍歷的當前項的有界變量名稱 | 字符串 | 無 |
varStatus | 保存遍歷狀態的有界變量名稱,類型值爲javax.servlet.jsp.jstl.core.LoopTagStatus | 字符串 | 無 |
例如,下列的forEach標籤將顯示「1,2,3,4,5」:
<c:forEach var="x" begin="1" end="5" step="1"> ${x } </c:forEach>
下面的forEach標籤將遍歷有界變量address的phones屬性:
<c:forEach var="phone" items="${address.phones}" > ${phone}<br/> </c:forEach>
對於每次變量,forEach標籤都會建立一個有界變量,變量名經過var屬性定義。在本例中,有界變量名爲phone。forEach標籤中的EL表達式用於顯示phone的值,這個有界變量只存在於開始和結束的forEach標籤之間,一到結束的forEach標籤前,它就會被刪除。
forEach標籤有一個類型爲javax.servlet.jsp.jstl.core.LoopTagStatus的變量varStatus,LoopTagStatus接口帶有count屬性,它返回當前遍歷的「次數」。第一次遍歷時,varStatus.count值爲1,;第二次遍歷時,varStatus.count值爲2。依此類推,經過測試varStatus.count%2的餘數,能夠知道該標籤正在處理的是偶數編號的元素,仍是奇數編號的元素。
forTakens標籤能夠指定的分隔符來分隔內容並迭代輸出,至關於Java.util.StirngTokenizer類。,其語法以下:
<c:forTokens items="stringOfTakens" [delims="delimiters"] [var="varName"] [varStatus="varStatusName"] [begin="beagin"] [end="end"] [step="step"]> body content </c:forTokens>
body content是JSP,forTakens標籤的屬性以下:
屬性 | 描述 | 類型 | 默認值 |
---|---|---|---|
items | 要被遍歷的token字符串 | 支持的任意類型 | 無 |
begin | 開始的元素(0=第一個元素,1=第二個元素) | 整數 | 0 |
end | 最後一個元素(0=第一個元素,1=第二個元素) | 整數 | Last element |
step | 每一次迭代的步長 | 整數 | 1 |
var | 引用遍歷的當前項的有界變量名稱 | 字符串 | 無 |
varStatus | 保存遍歷狀態的有界變量名稱,類型值爲javax.servlet.jsp.jstl.core.LoopTagStatus | 字符串 | 無 |
delims | 一組分隔符 | 字符串 | 無 |
下面是一個forTakens示例:
<c:forTokens var="item" items="Argentina,Brazil,Chile" delims=","> <c:out value="${item}" /><br/> </c:forTokens>
當將以上forTakens黏貼到JSP中時,它將會產生如下結果:
JSTL格式化標籤用來格式化並輸出文本、日期、時間、數字。引用格式化標籤庫的語法以下:
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
標籤 | 描述 |
---|---|
<fmt:formatNumber> | 使用指定的格式或精度格式化數字 |
<fmt:parseNumber> | 解析一個表明着數字,貨幣或百分比的字符串 |
<fmt:formatDate> | 使用指定的風格或模式格式化日期和時間 |
<fmt:parseDate> | 解析一個表明着日期或時間的字符串 |
<fmt:bundle> | 綁定資源 |
<fmt:setLocale> | 指定地區 |
<fmt:setBundle> | 綁定資源 |
<fmt:timeZone> | 指定時區 |
<fmt:setTimeZone> | 指定時區 |
<fmt:message> | 顯示資源配置文件信息 |
<fmt:requestEncoding> | 設置request的字符編碼 |
formatNumber標籤用於格式化數字。你能夠根據須要,利用這個標籤的各類屬性來獲取本身想要的格式。formatNumber的語法格式有如下兩種形式,第一種沒有body content:
<fmt:formatNumber value="numericValue" [type="{number|currency|percent}"] [pattern="customPattern"] [currencyCode="currencyCode"] [currencySymbol="currencySymbol"] [groupingUsed="{true|false}"] [maxIntegerDigits="maxIntegerDigits"] [minIntegerDigits="minIntegerDigits"] [maxFractionDigits="maxFractionDigits"] [minFractionDigits="minFractionDigits"] [var="varName"] [scope="{page|request|session|application}"] />
第二種形式有body content:
<fmt:formatNumber [type="{number|currency|percent}"] [pattern="customPattern"] [currencyCode="currencyCode"] [currencySymbol="currencySymbol"] [groupingUsed="{true|false}"] [maxIntegerDigits="maxIntegerDigits"] [minIntegerDigits="minIntegerDigits"] [maxFractionDigits="maxFractionDigits"] [minFractionDigits="minFractionDigits"] [var="varName"] [scope="{page|request|session|application}"]> numeric value to be formatted </fmt:formatNumber>
body content是JSP,formatNumber標籤的屬性見下表:
屬性 | 描述 | 類型 | 默認值 |
---|---|---|---|
value | 要顯示的數字 | 字符串或者數字 | 無 |
type | 說明該值是要被格式化成數字、貨幣仍是百分比。屬性值以下:number,currency,或 percent類型 | 字符串 | number |
pattern | 指定一個自定義的格式化模式用於輸出 | 字符串 | 無 |
currencyCode | ISO 4217貨幣代碼(當type="currency"時) | 字符串 | 取決於默認區域 |
currencySymbol | 貨幣符號 (當type="currency"時) | 字符串 | 取決於默認區域 |
groupingUsed | 說明輸出結果中是否包含組分隔符 | 布爾 | true |
maxIntegerDigits | 規定輸出結果中整數部分最多幾位數字 | 整數 | 無 |
minIntegerDigits | 規定輸出結果中整數部分最少幾位數字 | 整數 | 無 |
maxFractionDigits | 規定輸出結果中小數部分最多幾位數字 | 整數 | 無 |
minFractionDigits | 規定輸出結果中小數部分最少幾位數字 | 整數 | 無 |
var | 將輸出結果存儲爲字符串的有界變量名稱 | 字符串 | 無 |
scope | var的做用域 | 字符串 | page |
formatNumber標籤的用途之一就是將數字格式化成貨幣。爲此:
貨幣 | ISO 4217貨幣代碼 | 大單位名稱 | 小單位名稱 |
加拿大元 | CAD | 加元 | 分 |
人民幣 | CNY | 元 | 角 |
歐元 | EUR | 歐元 | 分 |
日元 | JPY | 日元 | 錢 |
英鎊 | GBP | 英鎊 | 便士 |
美圓 | USD | 美圓 | 美分 |
pattern屬性能夠在對數字編碼時包含指定的字符。接下來的表格中列出了這些字符:
符號 | 描述 |
---|---|
0 | 表明一位數字 |
E | 使用指數格式 |
# | 表明一位數字,若沒有則顯示 0,前導 0 和追尾 0 不顯示。 |
. | 小數點 |
, | 數字分組分隔符 |
; | 分隔格式 |
- | 使用默認負數前綴 |
% | 百分數 |
? | 千分數 |
¤ | 貨幣符號,使用實際的貨幣符號代替 |
X | 指定能夠做爲前綴或後綴的字符 |
' | 在前綴或後綴中引用特殊字符 |
formatNumber標籤的用法見下表:
<!-- formatNumber標籤 --> <fmt:formatNumber value="12" type="number"/><br/> <fmt:formatNumber value="12" type="number" minIntegerDigits="3"/><br/> <fmt:formatNumber value="12" type="number" minFractionDigits="2"/><br/> <fmt:formatNumber value="123456.78" pattern=".000"/><br/> <fmt:formatNumber value="123456.78" pattern="#,#00.0#"/><br/> <fmt:formatNumber value="12" type="currency"/><br/> <fmt:formatNumber value="12" type="currency" currencyCode="GBP"/><br/> <fmt:formatNumber value="0.12" type="percent"/><br/> <fmt:formatNumber value="0.12" type="percent" minFractionDigits="2"/><br/>
輸出以下:
formatDate便籤用於格式化日期,其語法格式以下:
<fmt:formatDate value="date" [type="{time|date|both}"] [dateStyle="{default|short|medium|long|full}"] [timeStyle="{default|short|medium|long|full}"] [pattern="customPattern"] [timeZone="timeZone"] [var="varName"] [scope="{page|request|session|application}"]/>
body content是JSP,formatDate標籤的屬性見下表:
屬性 | 描述 | 類型 | 默認值 |
---|---|---|---|
value | 要格式化的日期、時間、日期和時間 | java.util.Date | 無 |
type | 說明要格式化的是時間、日期、仍是時間與日期部分都要格式化,屬性值:date, time, both | 字符串 | date |
dateStyle | 預約義日期的格式化樣式,遵循java.text.DateFormat中定義的語法。屬性值:full, long, medium, short, 或 default | 字符串 | default |
timeStyle | 預約義時間的格式化樣式,遵循java.text.DateFormat中定義的語法。屬性值:full, long, medium, short, 或 default | 字符串 | default |
pattern | 自定義格式化模式 | 字符串 | 無 |
timeZone | 定義用於顯示時間的時區 | 字符串 | 默認時區 |
var | 將輸出結果存儲爲字符串的有界變量名稱 | 字符串或者java.util.TimeZone | 無 |
scope | var的做用域 | 字符串 | page |
formatDate標籤的格式話模式見下表:
代碼 | 描述 | 實例 |
---|---|---|
G |
時代標誌 |
AD |
y |
不包含紀元的年份。若是不包含紀元的年份小於 10,則顯示不具備前導零的年份。 |
2002 |
M |
月份數字。一位數的月份沒有前導零。 |
April & 04 |
d |
月中的某一天。一位數的日期沒有前導零。 |
20 |
h |
12 小時制的小時。一位數的小時數沒有前導零。 |
12 |
H |
24 小時制的小時。一位數的小時數沒有前導零。 |
0 |
m |
分鐘。一位數的分鐘數沒有前導零。 |
45 |
s |
秒。一位數的秒數沒有前導零。 |
52 |
S |
毫秒 |
970 |
E |
周幾 |
Tuesday |
D |
一年中的第幾天 |
180 |
F |
一個月中的第幾個周幾 |
2 (一個月中的第二個星期三) |
w |
一年中的第幾周r |
27 |
W |
一個月中的第幾周 |
2 |
a |
a.m./p.m. 指示符 |
PM |
k |
小時(12 小時制的小時) |
24 |
K |
小時(24 小時制的小時) |
0 |
z |
時區 |
中部標準時間 |
' |
轉義文本 |
|
'' |
單引號 |
下列代碼利用formatDate標籤格式化有界變量now引用的java.util.Date對象:
<!-- dormatDate標籤 --> <% String str = "2008-08-08 20:08:08"; String dateFormat = "yyyy-MM-dd HH:mm:ss"; SimpleDateFormat sdf = new SimpleDateFormat(dateFormat); /* * Date parse(String str) * 將給定的字符串按照SimpleDateFormat指定 * 的日期格式解析並轉換爲Date對象返回 */ Date now = (Date) sdf.parse(str); out.println(now+"<br/>"); pageContext.setAttribute("now", now); %> Default:<fmt:formatDate value="${now}"/><br/> Short:<fmt:formatDate value="${now}" dateStyle="short"/><br/> Medium:<fmt:formatDate value="${now}" dateStyle="medium"/><br/> Long:<fmt:formatDate value="${now}" dateStyle="Long"/><br/> Full:<fmt:formatDate value="${now}" dateStyle="Full"/><br/>
輸出以下:
下面的formatDate標籤用於格式化時間:
Default:<fmt:formatDate type="time" value="${now}"/><br/> Short:<fmt:formatDate type="time" value="${now}" timeStyle="short"/><br/> Medium:<fmt:formatDate type="time" value="${now}" timeStyle="medium"/><br/> Long:<fmt:formatDate type="time" value="${now}" timeStyle="Long"/><br/> Full:<fmt:formatDate type="time" value="${now}" timeStyle="Full"/><br/>
下面的formatDate標籤用於格式化日期和時間:
Default:<fmt:formatDate type="both" value="${now}"/><br/> Short:<fmt:formatDate type="both" value="${now}" dateStyle="short" timeStyle="short"/><br/> Medium:<fmt:formatDate type="both" value="${now}" dateStyle="medium" timeStyle="medium"/><br/> Long:<fmt:formatDate type="both" value="${now}" dateStyle="Long" timeStyle="Long"/><br/> Full:<fmt:formatDate type="both" value="${now}" dateStyle="Full" timeStyle="Full"/><br/>
下面的formatDate標籤用於格式化帶時區的時間:
Time zone CT:<fmt:formatDate type="time" value="${now}" timeZone="CT"/><br/> Time zone HST:<fmt:formatDate type="time" value="${now}" timeZone="HST"/><br/>
下面的formatDate標籤利用定製模式來格式化日期和時間:
<fmt:formatDate type="both" value="${now}" pattern="dd.MM.yy"/><br/> <fmt:formatDate type="both" value="${now}" pattern="dd.MM.yyyy"/><br/>
timeZone標籤用於定義時區,使其body content中的時間信息按指定時區進行格式化或者解析。其語法以下:
<fmt:timezone value="timeZone"> body content </fmt:timeZone>
body content是JSP,屬性值能夠是類型爲String或者java.util.TimeZone的動態值。
若是value屬性爲null或者empty,則使用GMT時區。
下面的範例用timeZone標籤格式化帶時區的日期:
<!-- timeZone標籤 --> <fmt:timeZone value="GMT+1:00"> <fmt:formatDate value="${now}" type="both" dateStyle="full" timeStyle="full"/><br/> </fmt:timeZone> <fmt:timeZone value="HST"> <fmt:formatDate value="${now}" type="both" dateStyle="full" timeStyle="full"/><br/> </fmt:timeZone> <fmt:timeZone value="CST"> <fmt:formatDate value="${now}" type="both" dateStyle="full" timeStyle="full"/><br/> </fmt:timeZone>
美國和加拿大時區的值見下表:
縮寫 | 全名 | 時區 |
NST | 紐芬蘭標準時間 | UTC-3:30 |
NDT | 紐芬蘭夏時制 | UTC-2:30 |
AST | 大西洋標準時間 | UTC-4 |
ADT | 大西洋夏時制 | UTC-3 |
EST | 東部標準時間 | UTC-5 |
EDT | 東部夏時制 | UTC-4 |
ET | 東部時間,如EST和EDT | * |
CST | 中部標準時間 | UTC-6 |
CDT | 中部夏時制 | UTC-5 |
CT | 中部時間,如CST和CDT | * |
MST | 山地標準時間 | UTC-7 |
MDT | 山地夏時制 | UTC-6 |
MT | 山地時間,如MST和MDT | * |
PST | 太平洋標準時間 | UTC-8 |
PDT | 太平洋夏時制 | UTC-7 |
PT | 太平洋時間,如PST和PDT | * |
AKST | 阿拉斯加標準時間 | UTC-9 |
AKDT | 阿拉斯加夏時制 | UTC-8 |
HST | 夏威夷標準時間 | UTC-10 |
setTimeZone標籤用於將指定時區保存在一個有界變量或者時間配置變量中,setTimeZone的語法以下:
<fmt:setTimeZone value="timeZone" [var="varName"] [scope="{page|request|session|application}"]/>
下表顯示了setTimeZone標籤的屬性:
屬性 | 描述 | 類型 | 默認值 |
---|---|---|---|
value | 時區 | 字符串或者java.util.TimeZone | 無 |
var | 保存類型爲java.util.TimeZone的時區有界變量 | 字符串 | 無 |
scope | 變量的做用與 | 字符串 | page |
下面演示一個具體的示例:
<!-- setTimeZone標籤 --> <c:set var="now" value="<%=new java.util.Date()%>" /> <p>當前時區時間: <fmt:formatDate value="${now}" type="both" timeStyle="long" dateStyle="long" /></p> <p>修改成 GMT-8 時區:</p> <fmt:setTimeZone value="GMT-8" /> <p>Date in Changed Zone: <fmt:formatDate value="${now}" type="both" timeStyle="long" dateStyle="long" /> </p>
parseNumber標籤用於將以字符串表示的數字、貨幣或者百分百解析成數字。其語法有兩種形式,第一種沒有body content:
<fmt:parseNumber value="numericValue" [type="{number|currency|percent}"] [pattern="customPattern"] [parseLocale="parseLocale"] [integerOnly="{true|false}"] [var="varName"] [scope="{page|request|session|application}"] />
第二種形式有body content:
<fmt:parseNumber value="numericValue" [type="{number|currency|percent}"] [pattern="customPattern"] [parseLocale="parseLocale"] [integerOnly="{true|false}"] [var="varName"] [scope="{page|request|session|application}"]> body content </fmt:parseNumber>
body content是JSP。parseNumber標籤的屬性見表:
屬性 | 描述 | 類型 | 默認值 |
---|---|---|---|
value | 要解析的字符串 | 字符串或數字 | 無 |
type | 說明該字符串是要被解析成數字、貨幣仍是百分比 | 字符串 | number |
parseLocale | 定義locale,在解析操做期間將其默認格式化樣式,或將pattern屬性定義的樣式應用其中 | 字符串或者java.util.Locale | 默認區域 |
integerOnly | 是否只解析整型數(true)或浮點數(false) | 布爾 | false |
pattern | 自定義格式化模式 | 字符串 | 無 |
timeZone | 定義用於顯示時間的時區 | 字符串或者java.util.TimeZone | 默認時區 |
var | 保存輸出結果的有界變量名稱 | 字符串 | 無 |
scope | var變量的做用域 | 字符串 | page |
下面的parseNumber標籤就是解析有界變量balance的值,並將結果保存在有界變量i中:
<!-- parseNumber標籤 --> <c:set var="balance" value="1250003.350" /> <fmt:parseNumber var="i" type="number" value="${balance}" /> <p>數字解析 (1) : <c:out value="${i}" /></p> <fmt:parseNumber var="i" integerOnly="true" type="number" value="${balance}" /> <p>數字解析 (2) : <c:out value="${i}" /></p>
parseDate標籤以區分地域的格式解析以字符串表示的日期和時間。其語法有兩種形式,第一種沒有body content:
<fmt:parseDate value="dateString" [type="{time|date|both}"] [dateStyle="{default|short|medium|long|full}"] [timeStyle="{default|short|medium|long|full}"] [pattern="customPattern"] [timeZone="timeZone"] [parseLocale="parseLocale"] [var="varName"] [scope="{page|request|session|application}"]/>
第二種形式有body content:
<fmt:parseDate value="dateString" [type="{time|date|both}"] [dateStyle="{default|short|medium|long|full}"] [timeStyle="{default|short|medium|long|full}"] [pattern="customPattern"] [timeZone="timeZone"] [parseLocale="parseLocale"] [var="varName"] [scope="{page|request|session|application}"]> date value to be parsed </fmt:parseDate>
body content是JSP,parseDate標籤的屬性見下表:
屬性 | 描述 | 類型 | 默認值 |
---|---|---|---|
value | 要解析的字符串 | 字符串 | 無 |
type | 說明要被解析的字符串是否包含日期、時間或者兩者均有。屬性值:date, time, 或 both | 字符串 | date |
dateStyle | 日期的格式化樣式。屬性值:full, long, medium, short, 或 default | 字符串 | default |
timeStyle | 時間的格式化樣式。屬性值:full, long, medium, short, 或 default | 字符串 | default |
pattern | 自定義格式化模式,決定要如何解析該字符串 | 字符串 | 無 |
timeZone | 定義時區,是日期字符串中的時間信息均根據它來解析 | 字符串或者java.util.TimeZone | 默認時區 |
parseLocale | 定義locale,在解析操做期間將其默認格式化樣式,或將pattern屬性定義的樣式應用其中 | 字符串或者java.util.Locale | 默認區域 |
var | 保存輸出結果的有界變量名稱 | 字符串 | 顯示在頁面 |
scope | var變量的做用域 | 字符串 | 頁面 |
下面的parseDate標籤用於解析有界變量now引用的日期字符串,並將獲得的java.util.Date保存在一個頁面範圍的有界變量parsedEmpDate中:
<!-- parseDate標籤 --> <c:set var="now" value="20-10-2015" /> <fmt:parseDate value="${now}" var="parsedEmpDate" pattern="dd-MM-yyyy" /> <p>解析後的日期爲: <c:out value="${parsedEmpDate}" /></p>
JSTL定義了一套能夠再EL表達式中使用的標準函數。這些函數都集中放在functtion標籤庫中。要使用這些函數,必須在JSP的最前面使用如下的taglib指令:
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
調用函數時,要如下列各式使用一個EL:
${fn:functionName}
這裏的functionName是函數名。
大部分都用於字符串操做。例如,length函數用於字符串和集合,並返回集合或者數組中的項數,或者返回一個字符串的字符數。
函數 | 描述 |
---|---|
fn:contains() | 測試輸入的字符串是否包含指定的子串 |
fn:containsIgnoreCase() | 測試輸入的字符串是否包含指定的子串,大小寫不敏感 |
fn:endsWith() | 測試輸入的字符串是否以指定的後綴結尾 |
fn:escapeXml() | 跳過能夠做爲XML標記的字符 |
fn:indexOf() | 返回指定字符串在輸入字符串中出現的位置 |
fn:join() | 將數組中的元素合成一個字符串而後輸出 |
fn:length() | 返回字符串長度 |
fn:replace() | 將輸入字符串中指定的位置替換爲指定的字符串而後返回 |
fn:split() | 將字符串用指定的分隔符分隔而後組成一個子字符串數組並返回 |
fn:startsWith() | 測試輸入字符串是否以指定的前綴開始 |
fn:substring() | 返回字符串的子集 |
fn:substringAfter() | 返回字符串在指定子串以後的子集 |
fn:substringBefore() | 返回字符串在指定子串以前的子集 |
fn:toLowerCase() | 將字符串中的字符轉爲小寫 |
fn:toUpperCase() | 將字符串中的字符轉爲大寫 |
fn:trim() | 移除首尾的空白符 |
contains()函數用於肯定一個字符串是否包含指定的子字符串。若是字符串中包含了該子字符串,則返回true,不然返回false,其語法以下:
contains(string,substring)
例如,下面兩個EL表達式都返回true:
<!-- contains()函數 --> <c:set var="myString" value="Hello World"/> ${fn:contains(myString,"Hello")}<br/> ${fn:contains("Stella Cadente","Cadente")}<br/>
containsIgnoreCase()函數用於肯定一個字符串是否包含指定的子字符串,忽略大小寫,該函數與contains()相似。,其語法以下:
containsIgnoreCase(string,substring)
例如,下面的EL表達式將返回true:
<!-- containsIgnoreCase()函數 --> ${fn:containsIgnoreCase("Stella Cadente","CADENTE")}<br/>
endsWith()函數用於肯定一個字符串是否以指定後綴結尾。其返回值是一個Boolean,語法以下:
endsWith(string,suffix)
例如,下面的EL表達式將返回true:
<!-- endsWith()函數 --> ${fn:endsWith("Hello World","World")}<br/>
escapeXml()函數忽略用於XML標記的字符。其語法以下:
escapeXml(string)
例如,下面的EL表達式:
<!-- excapexml()函數 --> <c:set var="string1" value="This is first String."/> <c:set var="string2" value="This <abc>is second String.</abc>"/> <p>使用 escapeXml() 函數:</p> <p>string (1) : ${fn:escapeXml(string1)}</p> <p>string (2) : ${fn:escapeXml(string2)}</p> <p>不使用 escapeXml() 函數:</p> <p>string (1) : ${string1}</p> <p>string (2) : ${string2}</p>
indexOf()函數返回指定子字符串在某個字符串中第一次出現時的索引。若是沒有找到指定的子字符串,則返回-1。其語法以下:
indexOf(string,substring)
例如,下面的EL表達式返回7:
<!-- indexOf()函數 --> ${fn:indexOf("Stella Cadente","Cadente")}
join()函數將一個String數組中的全部元素合併成一個字符串,並用指定的分隔符分開,其語法以下:
join(array,separator)
若是這個數組爲null,就會返回一個空字符串。
例如,下面的EL表達式:
<!-- join()函數 --> <c:set var="string1" value="www runoob com"/> <c:set var="string2" value="${fn:split(string1, ' ')}" /> <c:set var="string3" value="${fn:join(string2, '-')}" /> <p>字符串爲 : ${string3}</p>
length()函數用於返回集合中的項數,或者字符串中的字符數,其語法以下:
length(input)
例如,下面的EL表達式:
<!-- length()函數 --> <c:set var="string1" value="This is first String."/> <c:set var="string2" value="This is second String." /> <p>字符串長度 (1) : ${fn:length(string1)}</p> <p>字符串長度 (2) : ${fn:length(string2)}</p>
replace()函數將字符串string中出現的全部beforeSubstring都用afterSubstring轉換,並將結果返回,其語法以下:
replace(string,beforeSubstring,afterSubstring)
例如,下面的EL表達式:
<!-- replace()函數 --> <c:set var="string1" value="I am from google"/> <c:set var="string2" value="${fn:replace(string1, 'google', 'runoob')}" /> <p>替換後的字符串 : ${string2}</p>
split()函數用於將一個字符串分割成一個子字符串數組。它的做用與join()相反。例以下列代碼分割字符串「my,world」,並將結果保存在有界變量split中,隨後,利用forEach標籤將split格式化成一個HTML表格中:
<!-- split()函數 --> <c:set var="split" value="${fn:split('my,world',',')}"/> <table> <c:forEach var="sub" items="${split}"> <tr> <td> ${sub} </td> </tr> </c:forEach> </table>
startsWith()函數用於測試一個字符串是否以指定的前綴開頭,若是是,返回true,不然返回false。其語法以下:
startsWith(string,prefix)
例如,下面的EL表達式:
<!-- startsWith()函數 --> <c:set var="string" value="Runoob: I am from Runoob."/> <c:if test="${fn:startsWith(string, 'Google')}"> <p>字符串以 Google 開頭</p><br/> </c:if> <c:if test="${fn:startsWith(string, 'Runoob')}"> <p>字符串以 Runoob 開頭</p> </c:if>
substring()函數用於返回一個從指定基於0的起始索引到指定基於0的終止索引的子字符串,其語法以下:
substring(string,beginIndex,endIndex)
例如,下面的EL表達式:
<!-- substring()函數 --> <c:set var="string1" value="This is first String."/> <c:set var="string2" value="${fn:substring(string1, 5, 15)}" /> <p>生成的子字符串爲 : ${string2}</p>
substringAfter()函數用於返回指定子字符串第一次出現後的字符串部分,其語法以下:
substringAfter(string,substring)
例如,下面的EL表達式:
<!-- substringAfter()函數 --> <c:set var="string1" value="This is first String."/> <c:set var="string2" value="${fn:substringAfter(string1, 'is')}" /> <p>生成的子字符串 : ${string2}</p>
substringAfter()函數用於返回指定子字符串第一次出現前的字符串部分,其語法以下:
substringBefore(string,substring)
例如,下面的EL表達式:
<!-- substringBefore()函數 --> <c:set var="string1" value="This is first String."/> <c:set var="string2" value="${fn:substringBefore(string1,'first')}" /> <p>生成的子字符串 : ${string2}</p>
toLowerCase()函數將一個字符串轉換成它的小寫版本,其語法以下:
toLowerCase(string)
例如,下面的EL表達式:
<!-- toLowerCase()函數 --> <c:set var="string1" value="I am from RUNOOB"/> <c:set var="string2" value="${fn:toLowerCase(string1)}" /> <p>字符串爲 : ${string2}</p>
toUpperCase()函數將一個字符串轉換成它的大寫版本,其語法以下:
toUpperCase(string)
例如,下面的EL表達式:
<!-- toUpperCase()函數 --> <c:set var="string1" value="I am from RUNOOB"/> <c:set var="string2" value="${fn:toUpperCase(string1)}" /> <p>字符串爲 : ${string2}</p>
trim()函數用於刪除一個字符串開頭和結束的空白,其語法以下:
trim(string)
例如,下面的EL表達式:
<!-- trim()函數 --> <c:set var="string1" value="I am from runoob "/> <p>string1 長度 : ${fn:length(string1)}</p> <c:set var="string2" value="${fn:trim(string1)}" /> <p>string2 長度 : ${fn:length(string2)}</p> <p>字符串爲 : ${string2}</p>
JSTL XML標籤庫提供了建立和操做XML文檔的標籤。引用XML標籤庫的語法以下:
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>
在使用xml標籤前,你必須將XML 和 XPath 的相關包拷貝至你的<Tomcat 安裝目錄>\lib下:
標籤 | 描述 |
---|---|
<x:out> | 與<%= ... >,相似,不過只用於XPath表達式 |
<x:parse> | 解析 XML 數據 |
<x:set> | 設置XPath表達式 |
<x:if> | 判斷XPath表達式,若爲真,則執行本體中的內容,不然跳過本體 |
<x:forEach> | 迭代XML文檔中的節點 |
<x:choose> | <x:when>和<x:otherwise>的父標籤 |
<x:when> | <x:choose>的子標籤,用來進行條件判斷 |
<x:otherwise> | <x:choose>的子標籤,當<x:when>判斷爲false時被執行 |
<x:transform> | 將XSL轉換應用在XML文檔中 |
<x:param> | 與<x:transform>共同使用,用於設置XSL樣式表 |
JSTL SQL標籤庫提供了與關係型數據庫(Oracle,MySQL,SQL Server等等)進行交互的標籤。引用SQL標籤庫的語法以下:
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
標籤 | 描述 |
---|---|
<sql:setDataSource> | 指定數據源 |
<sql:query> | 運行SQL查詢語句 |
<sql:update> | 運行SQL更新語句 |
<sql:param> | 將SQL語句中的參數設爲指定值 |
<sql:dateParam> | 將SQL語句中的日期參數設爲指定的java.util.Date 對象值 |
<sql:transaction> | 在共享數據庫鏈接中提供嵌套的數據庫行爲元素,將全部語句以一個事務的形式來運行 |
參考文章
[1]JSP 標準標籤庫(JSTL)(推薦)
[3]Spring MVC學習指南