JSTL標準標籤庫
一、 JSTL簡介
標準標籤庫JSTL的全名爲:Java Server PagesStandard Tag Library.
JSTL主要提供了5大類標籤庫:
1.核心標籤庫:爲日常任務提供通用支持,如顯示和設置變量,重複使用一組項目,測試條件以及其他操作(如導入和重定向web頁面等).
2.國際化(I18N)標籤庫: 支持多種語言的引用程序.
3.SQL標籤庫: 對訪問和修改數據庫提供標準化支持.
4.XML標籤庫: 對XML文件處理和操作提供支持,包括XML節點的解析,迭代,基於XML數據的條件評估以及可擴展樣式語言轉換(Extensible StyleLanguage Transformations , XSLT)的執行.
5.函數標籤庫: 通過在EL表達式中調用函數標籤庫中的函數來實現特定的操作,例如:${fn:contains(sring,substring)},其功能是判斷string字符串中是否包含substring字符串.
JSTL標籤庫使用方法(forJSTL 1.0):
標籤庫 |
uri |
前綴 |
使用模式 |
Core標籤庫 |
http://java.sun.com/jstl/core |
c |
<c:tagname…/> |
I18N formatting標籤庫 |
http://java.sun.com/jstl/fmt |
fmt |
<fmt:tagname…/> |
Database access標籤庫 |
http://java.sun.com/jstl/sql |
sql |
<sql:tagname…/> |
XML Processing標籤庫 |
http://java.sun.com/jstl/xml |
x |
<x:tagname…/> |
Functions標籤庫 |
http://java.sun.com/jstl/functions |
fn |
<fn:tagname…/> |
JSTL標籤庫使用方法(forJSTL 1.1):
標籤庫 |
uri |
前綴 |
使用模式 |
Core標籤庫 |
http://java.sun.com/jsp/jstl/core |
c |
<c:tagname…/> |
http://java.sun.com/jsp/jstl/fmt |
fmt |
<fmt:tagname…/> |
|
Database access標籤庫 |
http://java.sun.com/jsp/jstl/sql |
sql |
<sql:tagname…/> |
XML Processing標籤庫 |
http://java.sun.com/jsp/jstl/xml |
x |
<x:tagname…/> |
Functions標籤庫 |
http://java.sun.com/jsp/jstl/functions |
fn |
<fn:tagname…/> |
說明:JSTL 1.0和JSTL 1.1的uri區別是JSTL1.1多了/jsp,例如:
JSTL 1.0:http://java.sun.com/jstl/core
JSTL 1.1:http://java.sun.com/jsp/jstl/core
二、 Core標籤庫
Core標籤庫,又被稱爲核心標籤庫,該標籤庫的工作是對於JSP頁面一般處理的封裝。該標籤庫包含14個標籤,分爲四類:
l 多用途核心標籤:<c:out>、<c:set>、<c:remove>、<c:catch>
l 條件控制標籤:<c:if>、<c:choose>、<c:when>、<c:otherwise>
l 循環控制標籤:<c:forEach>、<c:forTakens>
l URL相關標籤:<c:import>、<c:url>、<c:redirect>、<c:para>
在JSP頁面引入核心標籤庫的代碼爲:
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
下面將按照功能分類,分別講解每個標籤的功能和使用方式。
(一) 多用途核心標籤
1) out標籤
核心標籤庫中最爲基本的標籤就是<c:out>,用來顯示數據對象(字符串、表達式)的內容或結果,或者一個EL表達式的值。
使用Java腳本的方式爲:<% out.println("hello") %> <% =表達式 %>
使用JSTL標籤:<c:outvalue="字符串">
<c:out>標籤的使用有兩種語法格式。
【語法1】沒有body內容:
<c:outvalue=”要顯示的數據對象”[escapeXml=”true|false”] [default=”默認值”]/>
【語法2】有body內容:
<c:outvalue=”要顯示的數據對象”[escapeXml=”true|false”]>默認值
</c:out>
這兩種方式沒有本質的區別,只是格式上的差別。
<c:out>中各屬性的說明如下:
value :可以指定一個字符串作爲輸出內容,也可以指定爲EL表達式,例如:${3+5}.
escapeXml :類型爲boolean ,確定 , < , > , & , ‘ , “等字符在結構的字符串中是否被轉換成字符串實體代碼,默認值是true(即是否按html中的樣式進行輸出,設置true就是按照字符串原樣進行輸出,false就是按照html標識符進行輸出)
default value :可以是字符串,也可以是一個EL表達式或者jsp表達式,如果屬性(value)指定的表達式或者對象爲null,那麼將輸出這個defalut value部分的值.
提示:JSTL的使用是和EL表達式分不開的,EL表達式雖然可以直接將結果返回給頁面,但有時得到的結果爲空,<c:out>有特定的結果處理功能,EL的單獨使用會降低程序的易讀性,建議把EL的結果輸入放入<c:out>標籤中。
例:
<body>
<c:outvalue="<要顯示的數據對象(未使用轉義字符)>"escapeXml="true"default="默認值"></c:out><br/>
<c:outvalue="<要顯示的數據對象(使用轉義字符)>"escapeXml="false"default="默認值"></c:out><br/>
<c:outvalue="${null}"escapeXml="false">使用的表達式結果爲null,則輸出該默認值</c:out><br/>
</body>
2) set標籤
set標籤用來在某個範圍(request,session或者application)內設置值,或者設置某個對象的屬性值.
Set標籤使用格式如下:
1. 使用value 屬性在一個特定的範圍內指定某個變量的值,其使用格式如下:
<c:set var=”varName”value=”varValue” [scope=”page|request|session|application”]/>
2. 當使用value屬性在一個特定範圍內指定某各變量的值時,也可以包括body,他的作用與out標籤體的作用一樣,即value指定的值爲null時,默認使用體中指定的值,使用的格式如下:
<c:setvar=”varName” value=”varValue” [scope=”page|request|session|application”]>
default value
</c:set>
3.設置某一個特定對象屬性的使用格式如下:
<c:set property=”propertyName” target=”target” value=”value”/>
4.在設置某個特定對象的一個屬性時,也可以使用body,並且指定默認的值,使用格式如下:
<c:setproperty=”propertyName” target=”target” value=”value”>
default value
</c:set>
該標籤中的各屬性說明如下:
1. value : 該屬性指定變量或者對象中某個屬性的值,並且可以是一個表達式.
2. var : 變量名稱,value屬性指定的值就保存在這個變量中.
3. scope : 設定變量的有效範圍,如果不設置,默認爲page.
4. target : 設置屬性的一個對象,它必須是JavaBean或者java.util.Map對象.
5. property : 設置對象中的一個屬性.
3) remove標籤
remove標籤一般和set標籤配套使用,兩者是相對應的,remove標籤用於刪除某個變量或者屬性.
使用格式如下:
<c:remove var=”varName”[scope=”page|request|session|application”] />
Remove標籤中使用的各屬性說明如下:
1. scope : 設定這個需要刪除的變量的所在範圍.
2. var : 需要刪除的變量或者對象屬性的名稱.
如果沒有scope屬性,即採用默認值,就相當於調用PageContext.removeAttribute(varName)方法,如果指定了這個變量所在的範圍,那麼系統會調用PageContext.removeAttribute(varName,scope)方法.
4) catch標籤
catch標籤的功能和java中的try{…}catch{…}語句的功能很相似,它用於捕獲嵌入到其中間語句拋出的異常,這個標籤的使用格式如下:
<c:catchvar=”varName”>
相關操作語句
</c:catch> --如果操作語句中出現異常,則catch會將異常保存在varName變量中.
(二) 流程控制標籤
包括: if ,choose , when , otherwise等.
1) if標籤
這個標籤作用與java中的if語句作用相同,用於判斷條件語句,主要的使用格式如下
1. 在<c:if>體中不包括體的使用格式:
<c:if test=”checkCondition” var=”varName”scope=”page|request|session|application”/>
2. 當<c:if> 體中包括體時,使用格式如下:
<c:if test=”checkCondition” var=”varName”scope=”page|request|session|application”>
body content
</c:if>
標籤中使用的屬性說明:
test : 判斷條件的表達式,返回類型爲true或者 false;(也就是if的條件)
var : 這個變量用於保存test條件表達式判斷所返回的true或者false值
(if條件執行後所得到的boolean值將要保存在var變量中).
scope : 指定var變量所在的有效範圍.
2) choose , when ,otherwise標籤
這些標籤相當於java中的 switch ,case , default條件,使用實例如下:
<c:set var=”num”scope=”page” value=”admin”/>
<c:choose>
<c:whentest=”${num==’guest’}”>
<c:outvalue=”guest”/>
</c:when>
<c:whentest=”${num==’admin’}”>
<c:outvalue=”admin”/>
</c:when>
<c:otherwise>
<c:outvalue=”other”/>
</c:otherwise>
</c:choose>
運行jsp頁面後,輸出 admin
(三) 循環控制標籤
包括:<c:forEach>、<c:forTakens>
1) forEach迭代標籤
該標籤用來對一個collection集合中的一系列對象進行迭代輸出,並且可以指定迭代次數,一般的使用格式如下:
<c:forEachitems=”collection” var=”varName” [varstatue=”varStatusName”] [begin=”begin”][end=”end”] [step=”step”]>
Body content
</c:forEach>
這個標籤使用的屬性描述如下:
1. var: 也就是保存在collection集合類中的對象名稱.
2. items: 將要迭代的集合類名.
3. varStatus: 存儲迭代的狀態信息,可以訪問到迭代自身的信息.
4. begin: 如果指定了begin值,就表示從items[begin]開始迭代;如果沒有指定begin值,則從集合的第一個值開始迭代.
5. end: 表示迭代到集合的end位時結束,如果沒有指定end值,則表示一直迭代到集合的最後一位.
6. step: 指定迭代的步長.
例:
<%
String Items[] =newString[5];
Items[0]=”核心標籤庫”;
Items[1]=”國際化標籤庫”;
Items[2]=”SQL標籤庫”;
Items[3]=”XML標籤庫”;
Items[4]=”函數標籤庫”;
Request.setAttribute(“ItemName”,Items);
%>
<B><c:outvalue=”不指定begin和end的迭代:”/><B><br>
<c:forEachvar=”ItemName” items=”${Items}”>
<c:out value=”${ItemName}”/><br>
</c:forEach>
<B><c:outvalue=”指定begin和end的迭代:”/><B><br>
<c:forEach var=”ItemName” items=”${Items}” begin=”1” end=”3” step=”1”>
<c:out value=”${ItemName}”/><br>
</c:forEach>
<B><c:outvalue=”輸出整個迭代的信息:”/><B><br>
<c:forEach var=”ItemName” items=”${Items}” begin=”3” end=”4” step=”1”varStatus=”s”>
<c:out value=”${ItemName}”/>的四種屬性:<br>
所在位置即索引:<c:out value=”${s.index}” /> <br>
總共已迭代的次數:<c:out value=”${s.count}”/><br>
是否爲第一個位置:<c:out value=”${s.first}” /><br>
是否爲最後一個位置:<c:out value=”${s.last}”/>
</c:forEach>
代碼說明:
s.index 用來獲取計數器的值
s.count用來獲取這是第幾次循環
s.first 用來獲取是否是循環開始的第一次
s.last 用來獲取是否是循環的最後一次
first 和last都返回boolean值.
2) forTokens標籤
這個標籤的作用和Java中的StringTokenizer類的作用非常相似,通過items屬性來指定一個特定的字符串,然後通過delims屬性指定一種分隔符(可以同時指定多個),通過指定的分隔符把items屬性指定的字符串進行分組,與forEach標籤一樣,forTokens標籤也可以指定begin和end以及step屬性值.
使用格式如下:
<c:forTokens items=”stringOfTokens” delims=”delimiters”var=”varName” [varStatus=”varStatusName”] [begin=”begin”] [end=”end”][step=”step”]>
Body content
</c:forTokens>
標籤中的各個屬性描述如下:
1. var : 進行迭代的參數名稱.
2. items : 指定的進行標籤化的字符串.
3. varSatus : 每次迭代的狀態信息.
4. delims : 使用這個屬性指定的分隔符來分隔items指定的字符串.
5. begin : 開始迭代的位置.
6. end : 迭代結束的位置.
7. step : 迭代的步長.
例:
<c:out value=”forTokens標籤實例”/>
<h4>使用” | ”作爲分隔符</h4>
<c:forTokens var=”token”items=”bleu,rouge|vert,jaune|blanc,rouge” delims=”|”>
<c:outvalue=”${token}”/>
</c:forTokens>
<h4>使用” | , ”作爲分隔符</h4>
<c:forTokens var=”token”items=”bleu,rouge|vert,jaune|blanc,rouge” delims=”|,”>
<c:outvalue=”${token}”/>
</c:forTokens>
代碼說明:
delims=”|,” , 即使用”|”和”,”同時作爲分隔符進行使用.如果需要更多的分隔符就是使用 “|,./” 在引號內輸出.
(四) URL相關的標籤
URL相關的標籤主要用來將其他文件包含進來,或者提供頁面之間的重定位以及URL地址的生成,參數的輸出等.一般包括如下幾個標籤.
<c:import>標籤:與傳統JSP頁面重的<jsp:include>標籤類似.
<c:redirect>標籤:進行頁面的重定位.
<c:url> : 主要用來重寫URL地址.
<c:param> : 一般param標籤會與其他標籤一起配套使用,用於參數值的傳遞.
1)<c:import>標籤:
該標籤用於把其他今天文件包含到該文件當中,它與傳統的<jsp:include>相類似,不同的是<jsp:include>標籤只能用來包括該應用中的其他文件,而<c:import>還可以包含其他web應用中的文件,甚至是網絡上的資源所以它的功能更加強大.
使用格式如下:
<c:import url=”url” [context=”context”][var=”varName”] [scope=”page|request|session|application”][varReader=”varReader”] [charEncodion=”charEncoding”]>
Body content
</c:import>
標籤中的屬性描述如下:
url: 待引用靜態文件的URL地址.
context: 當採用相對路徑訪問一個外部靜態文件時,這裏的context指定這個外部文件的名稱.
var: 當使用字符串輸出時,把輸出的內容存儲在這個var指定的變量中.
scope: 指定var參數變量的有效範圍.
varReader: 這個屬性指定的參數變量類型是Reader,可以用於讀取文件的內容.
charEncoding: 引入文件所採用的字符編碼.
Import標籤即可以採用相對路徑也可以採用絕對路徑來引用本地點中的任何靜態文件,還可以使用絕對路徑引用外部站點中的靜態文,甚至可以是ftp站點中的文件,例如:<c:import var=”myurl” url=”http://www.163.com” />就是引用http://www.163.com站點的主頁面.
可以把引用文件中的內容賦值給var屬性指定的變量,然後進行讀取,也可以賦值給varReader指定的Reader類型的變量,然後進行相應的讀取.
有時引入的文件在本地顯示會出現亂碼,這時可以通過charEncoding來指定這些內容所採用的字符集編碼.
2) <c:redirect>和<c:param>標籤:
Redirect標籤用來進行頁面之間的重定向,它與傳統JSP程序重的<jsp:redirect>標籤功能相類似,param標籤是與redirect一起使用的,它用來進行參數值的傳遞,redirect標籤的使用格式如下:
<c:redirect url=”url”[context=”context”]/>
在redirect標籤中指定param參數的使用格式如下:
<c:redirect url=”url”[]context=”context”>
<c:paramname=”paramName” value=”value”/>
</c:redirect>
例: [通過創建c_redirect1.jsp 和c_redirect2.jsp 兩個文件說明]
c_redirect1.jsp文件內容如下:
<c:redirecturl=”c_redirect2.jsp” >
<c:paramname=”userName” value=”admin”/>
</c:redirect>
c_redirect2.jsp 文件內容如下:
<body>
userName=<c:outvalue=”${param.userName}”>
</body>
c_redirect1.jsp頁面文件內容不會顯示,因爲直接重定向到c_redirect2.jsp,重定向c_redirect2.jsp後,頁面中輸出 userName=admin
3) <c:url>標籤:
這個標籤主要用來重寫url地址,使用格式如下:
<c:urlvalue=”value” [context=”context”] [var=”varName”][scope=”page|request|session|application”] />
當進行參數傳遞時,使用格式如下:
<c:urlvalue=”value” [context=”context”] [var=”varName”][scope=”page|request|session|application”] >
<c:paramname=”paramName” value=”value” />
</c:url>
標籤中使用的屬性描述如下:
value: 將要處理的URL地址.
context: 當使用相對路徑方法指定外部文件時,這個屬性指定的是外在文件的名稱.
var: 給這個URL地址起一個標識.
Scope: 規定這個var屬性所指定變量的有效範圍.
創建一個c_url.jsp,其源代碼如下:
<%@ taglib prefix=”c”uri=”http://java.sun.com/jsp/jstl/core” %>
<c:url var=”url”value=”c_url2.jsp” scope=”session” >
<c:paramname=”userName” value=”admin”/>
<c:paramname=”password” value=”123456”/>
</c:url>
<c:outvalue=”${url}”/>
<a herf=’<c:outvalue=”${url}”/>’>Link to other page</a>
代碼說明:
url標籤可以指定一個變量(var屬性指定)來把url地址保存,並且可以指定這個變量的有效範圍爲session ,所以當需要用到這個url地址時,就可以使用session.getAttribute(varName)方法來獲取這個地址,所以一般需要重複使用同一個url地址纔會使用<c:url>標籤的功能.
三、 國際化( I18N )標籤庫
JSTL標籤提供了對國際化(I18N)的支持,它可以根據發出請求的客戶端地域的不同來顯示不同的語言。同時還提供了格式化數據和日期的方法。實現這些功能需要I18N格式標籤庫(I18N-capable formation tagsliberary)。
引入該標籤庫的方法爲:
<%@ tagliburi="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
I18N格式標籤庫提供了12個標籤,這些標籤從功能上可以劃分爲3類如下:
(1)數字日期格式化。formatNumber標籤、formatDate標籤、parseNumber標籤、parseDate標籤、timeZone標籤、setTimeZone標籤。
(2)讀取消息資源。bundle標籤、message標籤、setBundle標籤。
(3)國際化。setlocale標籤、requestEncoding標籤, param標籤。
(一) 數字日期格式化
數字日期格式化標籤共有6個,用來將數字或日期轉換成設定的格式。
1) <frm:formatNumber/>標籤
該標籤依據特定的區域將數字改變爲不同的格式來顯示。
【語法1】:
<frm:formatNumber value=”被格式化的數據”[type=”number|currency|percent”]
[pattern=”pattern”]
[currencyCode=”code”]
[currencySymbol=”symbol”]
[groupingUsed=”true|false”]
[maxIntergerDigits=”maxDigits”]
[minIntergerDigits=”minDigits”]
[maxFractionDigits=”maxDigits”]
[minFractionDigits=”minDigits”]
[var=”name”]
[scope=page|request|session|application]
/>
【語法2】:
<frm:formatNumber[type=”number|currency|percent”]
[pattern=”pattern”]
[currencyCode=”code”]
[currencySymbol=”symbol”]
[groupingUsed=”true|false”]
[maxIntergerDigits=”maxDigits”]
[minIntergerDigits=”minDigits”]
[maxFractionDigits=”maxDigits”]
[minFractionDigits=”minDigits”]
[var=”name”]
[scope=page|request|session|application]
>
被格式化的數據
<frm:formatNumber>
屬性說明如表9-4所示。
表9-4 <fmt:formatNumber>標籤參數說明
名稱 |
說明 |
EL |
類型 |
必須 |
默認值 |
value |
要格式化的數據 |
是 |
String |
是 |
無 |
type |
指定類型(單位、貨幣、百分比等)見表 |
是 |
String |
否 |
number |
pattern |
格式化的數據樣式 |
是 |
String |
否 |
無 |
currencyCode |
貨幣單位代碼 |
是 |
String |
否 |
無 |
cuttencySymbol |
貨幣符號($、¥) |
是 |
String |
否 |
無 |
groupingUsed |
是否對整數部分進行分組如(9,999) |
是 |
boolean |
是 |
true |
maxIntergerDigits |
整數部分最對顯示多少位數 |
是 |
int |
否 |
無 |
minIntergerDigits |
整數部分最少顯示多少位 |
是 |
int |
否 |
無 |
maxFractionDigits |
小數部分最多顯示多少位 |
是 |
int |
否 |
無 |
minFractionDigits |
小數部分最少顯示多少位 |
是 |
int |
否 |
無 |
var |
存儲格式化後的數據 |
否 |
String |
否 |
無 |
scope |
var的JSP範圍 |
否 |
String |
否 |
page |
Type屬性的類型應用見表9-5.
表9-5 Type的屬性類型
類型 |
說明 |
示例 |
number |
數字格式 |
0.8 |
currency |
當地貨幣 |
¥0.80 |
percent |
百分比格式 |
80% |
【示例代碼】:代碼9.14實現了對數字的格式化、貨幣的格式、貨幣的格式化。使用<frm:formatNumber>的各種屬性的設定。
代碼9.14 <fmt:formatNumber>標籤示例:fmtdemo01.jsp
<%@ page language="java"pageEncoding="gbk"%>
<%@ taglib prefix="c"uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt"uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
<title>I18N標籤庫</title>
</head>
<body>
<h4align="center"><c:out value="<frm:number>標籤的使用"></c:out></h4>
<hr>
<table border=1cellpadding="0" cellspacing="0"align="center">
<tr align="center">
<td width="100">類型 </td>
<td width="100">使用數據</td>
<td width="100">結果</td>
<td width="300">說明</td>
</tr>
<tr>
<td>數字格式化</td><td>108.75</td>
<td><fmt:formatNumber type="number"pattern="###.#">108.75</fmt:formatNumber></td>
<td>使用pattern可以定義顯示的樣式。本例設定爲###.#小數部分將使用四捨五入法。</td>
</tr>
<tr>
<td>數字格式化</td><td>9557</td>
<td><fmt:formatNumbertype="number"pattern="#.####E0">9557</fmt:formatNumber></td>
<td>使用科學計數法。</td>
</tr>
<tr>
<td>數字格式化</td><td>9557</td>
<td><fmt:formatNumbertype="number" >9557</fmt:formatNumber></td>
</td>
<td>使用默認分組。</td>
</tr>
<tr>
<td>數字格式化</td><td>9557</td>
<td><fmt:formatNumbertype="number" groupingUsed="false">9557</fmt:formatNumber></td>
<td>不使用分組。</td>
</tr>
<tr>
<td>數字格式化</td><td>9557</td>
<td><fmt:formatNumbertype="number" maxIntegerDigits="3">9557</fmt:formatNumber></td>
<td>使用位數限定,根據指定的位數顯示,其他數字忽略。例如:9不被顯示。</td>
</tr>
<tr>
<td>百分比格式化</td><td>0.98</td>
<td><fmt:formatNumbertype="percent">0.98</fmt:formatNumber></td>
<td>用百分比形式顯示一個數據。</td>
</tr>
<tr>
<td>貨幣格式化</td><td>188.88</td>
<td><fmt:formatNumbertype="currency" >188.8</fmt:formatNumber></td>
<td>將一個數據轉化爲貨幣形式輸出。</td>
</tr>
<tr>
<td>存儲數據</td><td>188.88</td>
<td><fmt:formatNumbertype="currency"var="money">188.8</fmt:formatNumber>
<c:outvalue="${money}"></c:out>
</td>
<td>存儲的money的值爲${money} </td>
</tr>
</table>
</body>
</html>
【代碼說明】:
(1)從應用角度可以把屬性分爲三類:數字格式化、貨幣格式化、百分比格式化。使用type指定類型。
(2)應用於數字格式化的屬性有:partten屬性、maxIntegerDigits屬性、minIntegerDigits屬性、maxFractionDigits屬性和minFactionDigits屬性。其中partten屬性在設定格式化樣式時會比較準確如:四捨五入、科學計數法的使用。而使用maIntegerDirgits等屬性時,只把設定位數以外的數字捨去。
(3)貨幣格式化可以使用數字格式化的所有屬性。如果有必要建議使用partten屬性。currencyCode屬性和currencySymbol只用於貨幣格式化。
(4)百分比格式化使用到的屬性爲type屬性、partten屬性,設定type屬性的類型爲percent即可。
(5)使用var屬性時,會將格式化後的值存在JSP的某個範圍內(一個String類型的字符串包括符號等)。<frm:forNumber>將不再輸出格式化後的值可以使用EL表達式輸出。
(6)通用屬性:type屬性、partten屬性、var屬性和scope屬性。
提示:如果給定的數據類型有錯誤將或產生異常。例如:給定的數據爲aa進行類型轉化,將使應用程序無法顯示。因此在實際應用中顯示的格式化應該放入<c:catch/>語句中。
2) <frm:parseNumber>標籤
將格式化後的數字、貨幣、百分比都轉化爲數字類型。
【語法1】:
<fmt:parseNumbervalue="number" [type=”number|currency|percent”]
[pattern=”pattern”]
[parseLocale=”locale”]
[intergerOnly=”true|false”]
[scope=”page|request|session|application”]
/>
【語法2】:
<fmt:parseNumber[type=”number|currency|percent”]
[pattern=”pattern”]
[parseLocale=”locale”]
[intergerOnly=”true|false”]
[scope=”page|request|session|application”]
>
Number
</fmt:parseNumber>
屬性說明見表9-6。
表9-6 <fmt:parseNumber>標籤參數說明
名稱 |
說明 |
EL |
類型 |
是否必須 |
默認值 |
value |
被解析的字符串 |
是 |
String |
是 |
無 |
type |
指定單位(數字、貨幣、百分比) |
是 |
String |
是 |
number |
pattern |
格式樣式 |
是 |
String |
否 |
無 |
parseLocale |
用來替代默認區域的設定 |
是 |
String, Java.util. Locale |
是 |
默認本地樣式 |
var |
存儲已經格式化的數據 |
否 |
String |
否 |
無 |
scope |
var變量的作用域 |
否 |
String |
是 |
page |
<fmt:parseNumber>可以看作是<fmt:formatNumber>的逆運算。相應的參數和類型的配置和使用<fmt:formatNumber>格式化時相同。
【示例代碼】:代碼9.15實現了從字符串中提取數據,並用合適的數據類型進行存儲(浮點性、整型等)。可以對轉換後的數據進行加法運算。
代碼9.15 <fmt:parseNumber>標籤示例:fmtdemo02.jsp
<%@ page language="java"pageEncoding="gbk"%>
<%@ taglib prefix="c"uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt"uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
<title>I18N標籤庫</title>
</head>
<body>
<h4 ><c:outvalue="<frm:parseNumber>標籤的使用"></c:out></h4>
<hr>
</body>
<fmt:formatNumbertype="currency"var="money">188.8</fmt:formatNumber>
<li>格式化前的數據爲:<c:out value="${money}"></c:out>
<fmt:parseNumber var="money"type="currency">${money}</fmt:parseNumber>
<li>格式化後的數據爲:<c:out value="${money}"></c:out>
<li>可以對格式化的後的數據進行運算:
<c:outvalue="${money+200}"></c:out>
<li>對百分比進行格式化98%爲:
<fmt:parseNumbertype="percent">98%</fmt:parseNumber>
</html>
【代碼解析】:
(1)首先使用<fmt:formatNumber>將188.8轉換爲字符串¥188.8並在page範圍內存儲一個String類型的變量,變量名爲money。
(2)使用<fmt:parseNumber>將¥188.8轉化爲浮點型的數據188.8並賦值爲變量money,
則變量money轉變爲一個浮點型的值188.8,對188.8進行加運算。
(3)直接對一個百分比數98%進行轉化。
提示:<fmt:parseNumber>屬性參數的配置和使用同<fmt:formatNumber>標籤使用的方式一樣。同時,在進行類型轉換時如果給出的類型不正確將會出現異常。例如在進行百分比轉化時如果沒有給type類型或者給出type類型但提供的數據中沒有%都會產生異常。因此在實際應用中用<c:catch/>捕獲異常。
3) <fmt:formatDate>標籤
該標籤主要用來格式化日期和時間。
【語法】:
<fmt: formatDate value=”date”[type=”time|date|both”]
[pattern=”pattern”]
[dateStyle=”default|short|medium|long|full”]
[timeStyle=”default|short|medium|long|full”]
[timeZone=”timeZone”]
[var=”name”]
[scope=”page|request|session|application”]
/>
參數說明見表9-7。
表9-7 <fmt:formatDate>標籤屬性說明
屬性名 |
說明 |
EL |
類型 |
必須 |
默認值 |
value |
將要格式化的日期對象。 |
是 |
Java.util.Date |
是 |
無 |
type |
顯示的部分(日期、時間或者兩者)。 |
是 |
String |
否 |
date |
partten |
格式化的樣式。 |
是 |
String |
否 |
無 |
dateStyle |
設定日期的顯示方式。 |
是 |
String |
否 |
default |
timeStyle |
設定時間的顯示方式。 |
是 |
String |
否 |
default |
timeZone |
設定使用的時區。 |
是 |
String |
否 |
當地所用時區 |
var |
存儲已格式化的日期或時間。 |
否 |
String |
否 |
無 |
scope |
指定var存儲的JSP範圍。 |
否 |
String |
否 |
無 |
其中type屬性參數說明見表9-8。
表9-8 type屬性參數說明
參數名 |
說明 |
time |
只顯示時間 |
date |
只顯示時期 |
both |
顯示日期和時間 |
【示例程序】:代碼9.16實現了對日期的格式化,使用了type、dateStyle、timeStyle等屬性。
代碼9.16 <fmt:formatDate>標籤示例:fmtdemo03.jsp
<%@ page language="java"pageEncoding="gbk"%>
<%@ taglib prefix="c"uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt"uri="http://java.sun.com/jsp/jstl/fmt" %>
<jsp:useBean id="date"class="java.util.Date"></jsp:useBean>
<html>
<head>
<title>I18N標籤庫</title>
</head>
<body>
<fmt:formatDatevalue="${date}"></fmt:formatDate><br>
<fmt:formatDatevalue="${date}"type="both"></fmt:formatDate><br>
<fmt:formatDatevalue="${date}" type="both" dateStyle="default"
timeStyle="default"></fmt:formatDate><br>
<fmt:formatDatevalue="${date}" type="both" dateStyle="short"
timeStyle="short"></fmt:formatDate><br>
<fmt:formatDatevalue="${date}" type="both" dateStyle="long"
timeStyle="long"></fmt:formatDate><br>
<fmt:formatDatevalue="${date}" type="both" dateStyle="full"
timeStyle="full"></fmt:formatDate><br>
<fmt:formatDatevalue="${date}" type="both" dateStyle="full"
timeStyle="full"></fmt:formatDate><br>
</body>
</html>
【代碼解析】:
(1)首先通過配置JavaBean在頁面上實例化java.util.Date對象。實現代碼如下:
<jsp:useBean id="date"class="java.util.Date"></jsp:useBean>
(2)對日期對象進行格式化時${date}是一個日期對象,如果給value設的值爲String時程序會報錯。
(3)設置type爲both時,將顯示日期和時間,同時示例中依次改變dateStyle和timeStyle的值作爲比較。
4) <fmt:parseDate>標籤
<fmt:parseDate>標籤主要將字符串類型的時間或日期轉化爲時間或日期對象。
【語法1】:
<fmt:parseDate value=”date”[type=”time|date|both”]
[pattern=”pattern”]
[parseLocale=”locale”]
[dateStyle=”default|short|medium|long|full”]
[timeStyle=”default|short|medium|long|full”]
[timeZone=”timezone”]
[var=”name”]
[scope=”page|request|session|application”]
/>
【語法2】:
<fmt:parseDate [type=”time|date|both”]
[pattern=”pattern”]
[parseLocale=”locale”]
[dateStyle=”default|short|medium|long|full”]
[timeStyle=”default|short|medium|long|full”]
[timeZone=”timezone”]
[var=”name”]
[scope=”page|request|session|application”]
>
Date
</fmt:parseDate>
【參數說明】參數說明見表9-9.
表9-9 <fmt:parseData>標籤屬性說明
屬性名 |
說明 |
EL |
類型 |
必須 |
默認值 |
value |
將要格式化的日期時間 |
是 |
String |
是 |
無 |
type |
字符串的類型(日期、時間或全部) |
EL |
String |
是 |
date |
pattern |
字符串使用的時間樣式 |
是 |
String |
是 |
無 |
parseLocale |
取代默認地區設定 |
是 |
String |
是 |
默認地區 |
dateStyle |
字符串使用的日期顯示方式 |
是 |
String |
否 |
default |
timeStyle |
字符串使用的時間顯示格式 |
是 |
String |
否 |
default |
timeZone |
使用的時區 |
是 |
String |
否 |
當地區時 |
var |
使用var定義的名字保存對象 |
否 |
String |
否 |
無 |
scope |
var的JSP範圍 |
否 |
String |
否 |
page |
【示例代碼】:代碼9.16實現了以下功能:首先,使用了<fmt:formatDate>把一個日期對象格式化成一個日期的字符串,並把該字符串以參數名爲a存儲page範圍內。其次,使用<fmt:parseDate>方法把a的值(字符串)格式化成一個Date並以參數名爲b存儲在page範圍內。最後,使用Java腳本證明生成的b爲對象。
代碼9.16:<fmt:formatDate>標籤示例:fmtdemo04.jsp
<%@ page language="java"pageEncoding="gbk"%>
<%@ taglib prefix="c"uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt"uri="http://java.sun.com/jsp/jstl/fmt" %>
<jsp:useBean id="date" class="java.util.Date"></jsp:useBean>
<html>
<head>
<title>I18N標籤庫</title>
</head>
<body>
<H4><c:outvalue="<frm:parseDate>標籤的使用"></c:out></H4>
<hr>
<fmt:formatDatevalue="${date}" var="a" type="both"
dateStyle="full"timeStyle="full"></fmt:formatDate>
<fmt:parseDate var="b"type="both" dateStyle="full" timeStyle="full">
${a}
</fmt:parseDate>
<%
out.println(pageContext.getAttribute("b").toString());
out.println("<br>");
out.println(pageContext.getAttribute("b").hashCode());
%>
</body>
</html>
【代碼解析】:
(1)使用<fmt:formatDate>把日期對象格式化成字符串。
(2)使用<fmt:parseDate>把字符串對象轉化爲日期對象,注意同(1)中的參數對比,可以發現兩者是一個互逆的過程。
(3)使用Java腳本進行測試Date對象的toString()方法可以輸出時間字符串。hashCode()可以得到一個對象的hashCode。該方法只能應用於對象,因此可以證明得到的是一個日期對象。
提示:<fmt:formatDate>和<fmt:parseDate>是相反的運算過程,可以對照學習。本例中的Java腳本的作用是爲了證明生成的的確是一個對象。
5) <fmt:setTimeZone>標籤
該標籤用於設定默認時區或者將時區存儲在指定的JSP範圍內。
【語法】:
<fmt:setTimeZone value=”value”[var=”name”][scope=”page|request|session|application”]/>
【參數說明】:見表9-10
表9-10 <fmt:setTimeZone>標籤屬性說明
參數名 |
說明 |
EL |
類型 |
必須 |
默認值 |
value |
使用的時區 |
是 |
String Java.util.TimeZone |
是 |
無 |
var |
使用var定義的參數名保存值 |
否 |
String |
否 |
無 |
scope |
存儲var的JSP範圍 |
否 |
String |
否 |
page |
value用來設定使用的時區,例如中國使用的時區爲CST,其他的還有EST、PST等。可以把時區存儲在指定的JSP範圍內,例如存儲在session中,用戶訪問的所有頁面都可以顯示使用的設定的時區下對應的時間。
【示例代碼】
<fmt:setTimeZone value=”EST”scope=”session”/>
提示:有關TimeZone的說明見JDK幫助文檔的java.util.TimeZone類。
6) <fmt:timeZone>標籤
該標籤主要用於設置標籤體內使用的時區。
【語法】:
<fmt:timeZone value=”timeZone”>
…..
</fmt:timeZone>
使用<fmt:timeZone></fmt:timeZone>只會應用到標籤體內使用的時區,對標籤外部將不產生影響。
(二) 讀取消息資源
讀取消息資源用到的標籤主要有4個:<fmt:message>標籤、<fmt:param>標籤、<fmt:bundle>標籤和<fmt:setBundle>標籤。主要用於從資源文件中讀取信息。
1) <fmt:bundle>標籤
該標籤主要用於將資源文件綁定於它的標籤體中的顯示。
【語法】:
<fmt:bundlebasename=”name”[prefix=”prefix”]>
….標籤主題
</fmt:bundle>
【參數說明】:見表9-11。
表9-11 <fmt:bundle>標籤屬性說明
參數名 |
說明 |
EL |
類型 |
必須 |
默認值 |
basename |
指定使用的資源文件的名稱 |
是 |
String |
是 |
無 |
prefix |
前置關鍵字 |
是 |
String |
否 |
無 |
2) <fmt:setBundle>標籤
該標籤主要用於綁定資源文件或者把資源文件保存在指定的JSP範圍內。
【語法】:
<fmt:setBundle basename=”name”[var=”name”]
[scope=”page|request|session|application”]
>
【參數說明】:見表9-12。
表9-12 <fmt:setBundle>標籤屬性說明
參數名 |
說明 |
EL |
類型 |
必須 |
默認值 |
basename |
指定使用的資源文件的名稱 |
是 |
String |
是 |
無 |
var |
指定將資源文件保存的名稱 |
否 |
String |
否 |
無 |
scope |
設定將資源文件保存的JSP範圍 |
否 |
String |
否 |
page |
3) <fmt:message>標籤
該標籤主要負責讀取本地資源文件,從指定的消息文本資源文件中讀取鍵值,並且可以將鍵值保存在指定的JSP範圍內。
【語法1】:
<fmt:messagekey=”keyName”[bundle=”bundle”]
[scope=”page|request|session|application”]
/>
【語法2】:
<fmt:messagekey=”keyName”[bundle=”bundle”]
[scope=”page|request|session|application”]
>
<fmt:param/>
</fmt:message>
【語法3】:
<fmt:messagekey=”keyName”[bundle=”bundle”]
[scope=”page|request|session|application”]
>
key<fmt:param/>
…
</fmt:message>
【參數說明】:見表9-13。
表9-13 <fmt:message>標籤屬性說明
參數名 |
說明 |
EL |
類型 |
必須 |
默認值 |
key |
指定鍵值的名稱(索引) |
是 |
String |
是 |
無 |
bundle |
指定消息文本的來源 |
是 |
LocalizationContext |
否 |
無 |
var |
指定存儲鍵值的變量名 |
否 |
String |
否 |
無 |
scope |
指定var的作用域 |
否 |
String |
否 |
page |
提示:建議此處的bundle使用EL表達式,因爲屬性bundle的類型爲LocalizationContext,而不是一個String類型的URL。
【示例代碼】:代碼9.17實現從指定的資源文件中讀取對應key的值。
首先編寫一個資源文件內容下
name=olive
password=01234
使用標籤從資源文件中讀取相應的值。
代碼9.17 <fmt:message>標籤示例:fmtdemo05.jsp
<%@ page language="java"pageEncoding="gbk"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt"uri="http://java.sun.com/jsp/jstl/fmt" %>
<jsp:useBean id="date"class="java.util.Date"></jsp:useBean>
<html>
<head>
<title>I18N標籤庫</title>
</head>
<body>
<H4><c:outvalue="資源文件讀取示例"></c:out></H4>
<hr>
<fmt:bundlebasename="message">
<c:out value="從message資源文件中得到的key爲name的值爲:"></c:out>
<fmt:messagekey="name" ></fmt:message>
</fmt:bundle>
<hr>
<fmt:setBundlebasename="message" var="m"/>
<fmt:message key="password"bundle="${m}"></fmt:message>
${m}
</body>
</html>
【代碼解析】:
(1)使用<fmt:bundle>標籤指定從message.properties文件中讀取值。
(2)使用<fmt:message>標籤讀取資源文件中key爲name的值。<fmt:message>標籤放在<fmt:bundle>標籤體內使用。
(3)使用<fmt:setBundle>標籤在page範圍綁定一個配置文件,以m爲參數名存儲。
(4)使用<fmt:message>標籤得到key爲password的值,此處指定資源文件的方式爲使用<fmt:message>標籤的bundle屬性來設定。
(5)輸出參數m的值,加深對bundle的理解。
<fmt:bundle>標籤中有一個prefix屬性,該標籤用來指明前綴。例如配置文件內容如下:
org.person.name=olive
org.personpassword=01234
如果不使用prefix標籤,在取值是要指明前綴。例如:
<fmt:bundle basename=”message”>
<fmt:messagekey=”org.person.name”></fmt:message>
<fmt:messagekey=”org.person.password”></fmt:message>
</fmt:bundle>
使用prefix屬性可以簡化取值時的代碼。
<fmt:bundle basename=”message”prefix=”org.person”>
<fmt:messagekey=”name”></fmt:message>
<fmt:message key=”password”></fmt:message>
</fmt:bundle>
4) <fmt:param>標籤
該標籤主要用於當<fmt:message>中資源文件中獲得鍵值時,動態的爲資源文件中的變量賦值。
【語法1】:
<fmt:param value=”value”/>
【語法2】:
<fmt:param >
…標籤主體
</fmt:param>
【示例代碼】:
(1)創建資源文件。在message.properties文件中增加一個key和value。
news={0} welcome to outwebsite!<br>today is :{1,date}
表達的含義是鍵news對應的是一個字符串,字符串中還有動態變量{0}表示第一個動態變量,{1,date}表示第二個動態變量並且該變量是一個日期類型的對象。
(2)通過標籤從資源文件中取出鍵值,並給動態變量賦值顯示在頁面。
代碼9.18 <fmt:param>標籤示例:fmtdemo06.jsp
<%@ page language="java"pageEncoding="gbk"%>
<%@ taglib prefix="c"uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt"uri="http://java.sun.com/jsp/jstl/fmt" %>
<jsp:useBean id="date"class="java.util.Date"></jsp:useBean>
<html>
<head>
<title>I18N標籤庫</title>
</head>
<body>
<H4><c:outvalue="<fmt:param>標籤的使用"></c:out></H4>
<hr>
<fmt:bundlebasename="message">
<fmt:messagekey="news">
<fmt:paramvalue="olive" />
<fmt:paramvalue="${date}"/>
</fmt:message>
</fmt:bundle>
</body>
</html>
【代碼解析】:
(1)使用<fmt:bundle>標籤把資源文件綁定在標籤體內。
(2)在<fmt:bundle>標籤體內使用<fmt:message>得到鍵值。
(3)使用<fmt:param>爲資源文件中的動態變量賦值。
提示:資源文件經過修改後,應用程序需要重載才能生效。
(三) 國際化
國際化這個分類中共包含兩個標籤:用於設定語言地區<fmt:setLocale/>和用於設定請求的字符編碼的<fmt:requestEncoding>標籤。
1) <fmt:setLocale/>標籤
<fmt:setLocale>標籤用來設定用戶語言區域。
【語法】:
<fmt:setLocale value=”locale”[variant=”variant”]
[scope=”page|request|session|application”]>
【參數說明】:見表9-14。
表9-14 <fmt:setLocale>標籤屬性說明
參數名 |
說明 |
EL |
類型 |
必須 |
默認值 |
value |
指定區域代碼 |
是 |
String java.util.Locale |
是 |
無 |
variant |
操作系統的類型 |
是 |
String |
是 |
無 |
scope |
設定時區的作用範圍 |
否 |
String |
是 |
page |
value屬性用來指定使用的語言代碼,可以從瀏覽器的【工具】---【Internet選項】---【語言】---【添加】中查看瀏覽器支持的語言種類及語言代碼。例如:中文(zh_cn)、臺灣(zh_tw)、香港(zh_mo)等。
【示例代碼】:代碼9.19實現了設定不同的區域代碼,根據不同的區域代碼瀏覽將顯示不同格式的日期。
代碼9.19 <fmt:setLocale>標籤示例:fmtdemo07.jsp
<%@ page language="java"pageEncoding="gbk"%>
<%@ taglib prefix="c"uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt"uri="http://java.sun.com/jsp/jstl/fmt" %>
<jsp:useBean id="date"class="java.util.Date"></jsp:useBean>
<html>
<head>
<title>I18N標籤庫</title>
</head>
<body>
<H4><c:outvalue="<fmt:setlocale>標籤的使用"></c:out></H4>
<hr>
<fmt:setLocalevalue="en_us" />
<fmt:formatDatevalue="${date}" type="both" dateStyle="full"timeStyle="full"/>
<hr>
<fmt:setLocalevalue="zh_cn" />
<fmt:formatDatevalue="${date}" type="both" dateStyle="full"timeStyle="full"/>
<hr>
<fmt:setLocalevalue="zh_TW"/>
<fmt:formatDatevalue="${date}" type="both" dateStyle="full"timeStyle="full"/>
</body>
</html>
【代碼解析】:
(1)瀏覽器默認跟您使用的操作系統的語言相同,因此默認值zh_cn。使用<fmt:setLocale/>標籤設置使用的語言爲en_us(英語)。使用<fmt:formateDate>格式化輸出的時間字符串,該標籤會根據不同的語言輸出不同的日期格式。
(2)使用的語言修改爲zh_cn,再次用格式化輸出。
(3)使用語言修改爲zh_TW,輸出格式化後的時間。
2)<fmt:requestEncoding>標籤
該標籤用於設定請求的編碼格式。功能同servletRequest.setCharacterEncoding()方法相同。
【語法】:
<fmt:requestEncoding[value=”charEncoding”]/>
【參數說明】:
value屬性用來指定使用的編碼集例如:gbk、gb2312等。當沒有給出value的值時將會自動搜索取尋找合適的編碼方式,因此能夠很好的解決中文亂碼問題。
四、 SQL標籤庫
JSTL提供了與數據庫相關操作的標籤,可以直接從頁面上實現數據庫操作的功能,在開發小型網站是可以很方便的實現數據的讀取和操作。下面詳細介紹這些標籤的功能和使用方法。
SQL標籤庫從功能上可以劃分爲兩類:
(1)、設置數據源標籤:<sql:setDataSource>
(2)、SQL指令標籤:<sql:query>,<sql:update>,<sql:param>,<sql:dateParam>,<sql:transaction>
引入SQL標籤庫的指令代碼爲:
<%@ taglib prefix="sql"uri="http://java.sun.com/jsp/jstl/sql" %>
(一) 設置數據源
1.<sql:setDataSource>標籤
使用<sql:setDataSource>標籤可以實現對數據源的配置。
【語法1】:直接使用已經存在的數據源。
<sql:setDataSourcedataSource=”dataSource”[var=”name”]
[scope=”page|request|session|application”]/>
【語法2】:使用JDBC方式建立數據庫連接。
<sql:setDataSource driver=”driverClass”url=”jdbcURL”
user=”username”
password=”pwd”
[var=”name”]
[scope=”page|request|session|application”]/>
【參數說明】:見表9-15
表9-15 <sql:DataSource>標籤屬性說明
參數名 |
說明 |
EL |
類型 |
必須 |
默認值 |
dataSource |
數據源 |
是 |
String Javax.sql.DataSource |
否 |
無 |
driver |
使用的JDBC驅動 |
是 |
String |
否 |
無 |
url |
連接數據庫的路徑 |
是 |
String |
否 |
無 |
user |
連接數據庫的用戶名 |
是 |
String |
否 |
無 |
password |
連接數據庫的密碼 |
是 |
String |
否 |
無 |
var |
指定存儲數據源的變量名 |
否 |
String |
否 |
無 |
scope |
指定數據源存儲的JSP範圍 |
否 |
String |
否 |
page |
提示:是否必須是相對的,比如說如果使用數據源則,driver、url等就不再被使用。如果使用JDBC則要用到driver、url、user、password屬性。
例如連接SQL Server需要進行如下配置:
Driver="com.microsoft.jdbc.sqlserver.SQLServerDriver"
url=”jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=pubs"
user=”sa”
password=””
使用<fmt:setDataSource>配置的代碼如下:
<fmt:setDataSourcedriver=”com.microsoft.jdbc.sqlserver.SQLServerDriver”
url=”jdbc.microsoft:sqlserver://localhost:1433;DatabaseName=pubs”
user=”sa”
password=””>
如果連接其他數據庫,只須把相對應的項修改即可。
提示:可以把數據連接的配置存入session中,如果再用到數據庫連接只須配置使用DataSource屬性。
(二) SQL指令標籤
JSTL提供了<sql:query>、<sql:update>、<sql:param>、<sql:dateParam>和<sql:transaction>這5個標籤,通過使用SQL語言操作數據庫,實現增加、刪除、修改等操作。下面將介紹這5個標籤的功能和使用方式。
1. <sql:query>標籤
<sql:query>標籤用來查詢數據。
【語法1】:
<sql:querysql=”sqlQuery” var=”name”
[scope=”page|request|session|application”]
[dataSource=”dateSource”]
[maxRow=”maxRow”]
[startRow=”starRow”]/>
【語法2】:
<sql:query var=”name”
[scope=”page|request|session|application”]
[dataSource=”dateSource”]
[maxRow=”maxRow”]
[startRow=”starRow”]
>
sqlQuery
</sql:query>
【屬性說明】:見表9-16。
表9-16 <sql:query>標籤屬性說明
參數名 |
說明 |
EL |
類型 |
必須 |
默認值 |
sql |
查詢數據的SQL語句 |
是 |
String |
是 |
無 |
dataSource |
數據源對象 |
是 |
String Javax.sql.DataSoutce |
否 |
無 |
maxRow |
設定最多可以暫存數據的行數 |
是 |
String |
否 |
無 |
startRow |
設定從那一行數據開始 |
是 |
String |
否 |
無 |
var |
指定存儲查詢結果的變量名 |
否 |
String |
是 |
無 |
scope |
指定結果的作用域 |
否 |
String |
否 |
page |
使用<sql:query>必須指定數據源,dataSource是可選的,如果未給定該屬性標籤會在page範圍內查找是否設置過數據源,如果沒有找到將拋出異常。
一般情況下使用<sql:setDateSource>標籤設置一個數據源存儲在session範圍中,當需要數據庫連接時使用dataSource屬性並實現數據庫的操作。
<sql:query>的var屬性是必須的用來存放結果集,如果沒有指定scope範圍則默認爲page,即在當前頁面我們可以隨時輸出查詢結果。結果集有一系列的屬性如表9-17所示。
maxRows和startRow屬性用來操作結果集,使用SQL語句首先吧數據放入內存中,檢查是否設置了startRow屬性,如果設置了就從starRow指定的那一行開始取maxRows個值,如果沒有設定則從第一行開始取。
表9-17 結果集參數說明
屬性名 |
類型 |
說明 |
rowCount |
int |
結果集中的記錄總數 |
Rows |
Java.util.Map |
以字段爲索引查詢的結果 |
rowsByIndex |
Object[] |
以數字爲作索引的查詢結果 |
columnNames |
String[] |
字段名稱數組 |
limitedByMaxRows |
boolean |
是否設置了maxRows屬性來限制查詢記錄的數量 |
提示:limitedByMaxRows用來判斷程序是否收到maxRows屬性的限制。並不是說設定了maxRows屬性,得到結果集的limitedByMaxRows的屬性都爲true,當取出的結果集小於maxRows時,則maxRows沒有對結果集起到作用此時也爲false。例如可以使用startRow屬性限制結果集的數據量。
結果集的作用就是定義了數據在頁面中的顯示方式。下面給出了結果集每個屬性的作用。
rowCount屬性。該屬性統計結果集中有效記錄的量,可以使用於大批量數據分頁顯示。
Rows屬性。等到每個字段對應的值。返回的結果爲:字段名={字段值···}
rowsByIndex屬性。常用得到數據庫中數據的方式,從有效行的第一個元素開始遍歷,到最後一個有效行的最後一個元素。
columnNames屬性。用於得到數據庫中的字段名。
limitedByMaxRows屬性。用於判斷是否受到了maxRows的限制。
【示例代碼】:代碼9.20給出了配置數據庫連接,和使用<sql:query>查詢數據以及結果集屬性的使用。
代碼9.20 數據庫示查詢示例:sqldemo01.jsp
<%@ taglibprefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglibprefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
<%@ pagecontentType="text/html;charset=GBK"%>
<html>
<head>
<title>JSTL:SQL標籤</title>
</head>
<body >
<h3>SQL標籤庫</h3>
<hr>
<sql:setDataSourcedriver="com.microsoft.jdbc.sqlserver.SQLServerDriver"
url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs"
user="sa" password="" />
<sql:queryvar="result" sql="select * from person"maxRows="2" startRow="1"/>
結果集的實質是:${result}<br>
得到的行數爲:${result.rowCount}<br>
是否收到了maxRows的限制:${result.limitedByMaxRows}
<hr>
<tableborder="1" align="center">
<tr><c:forEachvar="columnName" items="${result.columnNames}">
<td>
<c:outvalue="${columnName}"/>
</td>
</c:forEach></tr>
<c:forEachvar="row" items="${result.rowsByIndex}">
<tr>
<c:forEachvar="column" items="${row}">
<td><c:outvalue="${column}"/></td>
</c:forEach>
</tr>
</c:forEach>
</table>
</body>
</html>
【代碼解析】:
(1)配置數據源。使用<sql:dataSource>標籤配置數據源,因爲只共本頁使用因此存儲在默認的page範圍中。
(2)使用<sql:query>標籤進行數據庫查詢,並定義了maxRows和startRow屬性。並把結果集存儲於作用於page範圍的result變量。使用${result}輸出可以發現結果集就是一個ResultImpl類。
提示:在進行數據源配置時程序不會檢查數據庫連接是否配置正確,直接根據設定的數據庫及連接訪問,如果沒有找到則拋出操作的表異常,因此要放如<c:catch></c:catch>同時在編寫程序時一定要注意數據源是否配置正確。
(3)使用結果集的rowCount屬性得到記錄的總量。代碼爲:
${result.rowCount}
(4)使用結果集的limitedMaxRows屬性判斷是否收到maxRows設定的影響。代碼爲:
${result.limitedMaxRows}
(5)從結果集中得到數據庫中定義的所有的字段。${result.columnnames}得到的結果是一個字符串數組,因此需要使用<c:forEach>循環輸出。代碼如下:
<c:forEachvar="columnName" items="${result.columnNames}">
<c:outvalue="${columnName}"/>
</c:forEach>
(6)從結果集中得到所有的值。首先要遍歷每一行,然後遍歷每一行中的元素,因此需要循環嵌套。代碼如下:
<c:forEachvar="columnName" items="${result.columnNames}">
<c:outvalue="${columnName}"/>
</c:forEach>
<c:forEachvar="row" items="${result.rowsByIndex}">
<c:forEachvar="column" items="${row}">
<c:outvalue="${column}"/></td>
</c:forEach>
</c:forEach>
提示:在代碼解析中省略了html元素表格等標籤的元素,本示例適用於任何數據庫表,只要把數據庫的URL、使用的JDBC進行相應的配置和操作的數據表名進行相應的修改即可看到結果。
2. <sql:update>標籤
<sql:update>用來實現操作數據庫如:使用create、update、delete和insert等SQL語句,並返回影響記錄的條數。
【語法1】:SQL語句放在標籤屬性中。
<sql:update sql=”SQL語句” [var=”name”] [scope=”page|request|session|application”]
[dateSource=”dateSource”]/>
【語法2】:SQL語句放在標籤體內。
<sql:update [var=”name”][scope=”page|request|session|application”]
[dateSource=”dateSource”]
>
SQL語句
</sql:update>
【參數說明】:見表9-18。
表9-18 <sql:update>標籤屬性說明
參數名 |
說明 |
EL |
類型 |
必須 |
默認值 |
sql |
查詢數據的SQL語句 |
是 |
String |
是 |
無 |
dataSource |
數據源對象 |
是 |
String Javax.sql.DataSoutce |
否 |
無 |
var |
指定存儲查詢結果的變量名 |
否 |
String |
是 |
無 |
scope |
指定結果的作用域 |
否 |
String |
否 |
page |
提示:<sql:update>標籤的屬性同<sql:query>標籤的屬性相比只減少了maxRows和startRow2個屬性。其他參數用法一樣。
使用<sql:update>可以實現數據表的創建、插入數據、更行數據、刪除數據。使用時只須在標籤中放入正確的SQL語句即可,同時要捕獲可能產生的異常。本節只對一個簡單的插入操作進行說明。
【示例代碼】:代碼9.21實現了創建一個表、實現數據的插入。
代碼9.21 數據庫創建、數據插入示例:sqldemo02.jsp
<%@ taglibprefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglibprefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
<%@ pagecontentType="text/html;charset=GBK"%>
<html>
<head>
<title>JSTL:SQL標籤</title>
</head>
<body >
<h3>SQL標籤庫</h3>
<hr>
<sql:setDataSourcedriver="com.microsoft.jdbc.sqlserver.SQLServerDriver"
url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs"
user="sa" password="" />
實現數據庫表的創建<br>
<sql:update var="result1">
create table c_user (
id int primary key ,
name varchar(80),
sex varchar(80),
)
</sql:update>
<c:catchvar="error">
<sql:updatevar="result2" >
insert c_uservalues(05,'Linda','女')
insert c_uservalues(01,'Rom','男' )
</sql:update>
影響的記錄數爲:<c:outvalue="${result2}"></c:out>
</c:catch>
<c:outvalue="${error}"></c:out><br>
<hr>
</body>
</html>
【代碼解析】:
(1)配置數據源。
(2)使用<sql:update>標籤創建一個新表。
(3)向表中插入兩行數據。
提示:本示例也沒有針對固定的表進行操作,在使用時直接運行即可,如果使用的是其他數據庫,需要更改數據源配置和SQL語句部分修改。
3. <sql:param>標籤
<sql:param>標籤用於動態的爲SQL語句設定參數,同<sql:query>標籤共同使用。可以防止SQL注入作用類似於java.sql.PreparedStatement。
【語法1】:
<sql:paramvalue=”value”/>
【語法2】:
<sql:param>
Value
</sql:param>
【參數說明】:
value的作用爲SQL中的參數賦值。
【使用示例】:
<sql:queryvar=”result”>
select * from person where 序號=?
<sql:query>
4. <sql:dateParam>標籤
<sql:dataParam>標籤主要用於爲SQL標籤填充日期類型的參數值。
【語法】:
<sql:dateParamvalue=”date”[type=”timestamp|time|date”]/>
【參數說明】:
value屬性:java.util.Date類型的參數。
type屬性:指定填充日期的類型timestamp(全部日期和時間)、time(填充的參數爲時間)、date(填充的參數爲日期)。
5. <sql:transaction>標籤
<sql:transaction>標籤提供了數據操作的一種安全機制(即事務回滾),當操作數據庫的某條SQL語句發生異常時,取消<sql:transaction>標籤體中的所有操作,恢復原來的狀態,重新對數據庫進行操作。
【語法】:
<sql:transaction[dataSource=”dataSource”]
[isolation=”read_committed|read_uncommitted|repeatable|serializable”]
>
<sql:query>
<sql:uptade>
</sql:transation>
五、 XML標籤庫
JSTL的XML處理標籤庫提供XML剖析、取出元素與屬性和XSLT轉換等相關標籤。
引入XML標籤庫的格式:
<%@ tagliburi="http://java.sun.com/jsp/jstl/xml" prefix="x" %>
(一) XML核心標籤庫
1.<x:parse>標籤
<x:parse/>標籤用來解析指定的xml文件。
【語法1】:
<x:parse doc=”xmlDocument”
{var=”name”[scope=”page|request|session|application”]|varDom=”name”[scope=”page|request|session|application”]}
systemId=”systemId”
filter=”filter”
/>
【語法2】:
<x:parse
{var=”name”[scope=”page|request|session|application”]|varDom=”name”[scope=”page|request|session|application”]}
systemId=”systemId”
filter=”filter”
>
xmlDocument
</x:parse>
【參數說明】:見表9-20。
表9-20 <x:parse>標籤屬性說明
屬性名 |
說明 |
EL |
類型 |
必須 |
默認值 |
doc |
指定解析的xml文件 |
是 |
String/Reader |
是 |
無 |
var |
存儲解析後的xml文件 |
否 |
String |
否 |
無 |
scope |
指定var的JSP範圍 |
否 |
String |
否 |
page |
varDom |
以(org.w3c.dom.Doucemet)的形式存儲解析的xml文件 |
否 |
String |
否 |
無 |
scopeDom |
指定varDom的JSP範圍 |
否 |
String |
否 |
page |
systemId |
xml文件的url |
是 |
String |
否 |
無 |
filter |
解析xml文件的過濾器 |
否 |
Org.xml.sax.Filter |
否 |
無 |
提示:doc指定解析的xml文件並不是指定xml文件的路徑,而是同<c:import>共同使用,由<c:import>加載並存儲,然後使用<x:parse>解析。
例如:如果解析person.xml文件需要通過如下代碼實現對xml文件的解析。
<c:import var="docString"url="person.xml"/><!--引入person.xml文件-->
<x:parse var="doc"doc="${docString}"/>
<c:import>語句用來導入或存儲文件到JSP。如果不使用var來存儲,xml文件將顯式的出現在JSP文件中。
<x:parse>標籤只用來解析xml文件,並不顯示xml文件中的內容,如果想得到xml的節點元素或值需要使用<x:out>元素來實現。
2.<x:out>標籤
<x:out>標籤主要用來輸出xml的信息。
【語法】:
<x:outselect=”XpathExperssion”[excapeXml=”true|false”]>
【參數說明】:見表9-21。
表9-21 <x:out>標籤屬性說明
屬性名 |
說明 |
EL |
類型 |
必須 |
默認值 |
select |
指定使用的XPath語句 |
否 |
String |
是 |
無 |
escapeXml |
是否轉換特殊字符。如<等 |
否 |
boolean |
是 |
true |
提示:使用XPath語句需要用到xalan.jar支持包,可以從示例程序的lib中獲取,獲得直接從myEclipse中可以找到。
3.<x:set>標籤
<x:set>標籤用於將從xml文件節點解析的內容存儲到JSP屬性範圍中。
【語法】:
<x:set select=”XPathExperssion” var=”name”scope=”page|request|session|application”>
【參數說明】:
(1)select通過指定的XPath表達式語句獲取節點的值。
(2)var指定用於存儲值的變量名。
(3)指定var的JSP屬性範圍。
(二) XML流程控制
使用xml標籤庫的流程控制標籤可以迭代處理xml文件的內容,流程控制可以分爲以下兩個方面的內容:
(1)條件判斷。
(2)循環功能。
1.<x:if>
<x:if>主要用於條件判斷。
【語法1】:未含有本體內容。
<x:if select=”XPathExperssion”var=”name”[scope=”page|request|session|application”]/>
【語法2】:含有本體內容。
<x:if select=”XPathExperssion” var=”name”[scope=”page|request|session|application”]
>
Body內容
</x:if>
語法1只把根據條件表達式得到的結果的存儲在JSP範圍中,語法2根據<x:if>標籤根據條件表達式的結果決定是否執行本體內的代碼。
【參數說明】:
(1)select用來指定使用的XpathExperssion表達式。
(2)var設定標量名用來存儲表達式的結果。
(3)scope指定var存儲的JSP屬性範圍。
2.<x:choose>、<x:when>和<x:otherwise>標籤
同核心標籤庫的<c:choose>、<c:when>和<c:otherwise>標籤作用相似,只是使用的條件表達式不同。
<x;choose>是主標籤,<x:when>和<x:otherwise>放在<x:choose>標籤體內共同使用。
【語法】:
<x:choose>
<x:when>
<x:when>
<x:otherwise>
</x:choose>
其中只有<x:when>有屬性。
【語法】:
<x:when select=”XPathExperssion”>
3.<x:forEach>標籤
<x;forEach>標籤實現了對xml文檔的遍歷。
【語法】:
<x:forEachselect=”XPathExperssion”[var=”name”][varStartus=”StartusName”]
[begin=”begin”][end=”end”][step=”step”]
>
//標籤主體
</x:forEach>
【參數說明】:見表9-22。
表9-22 <x:forEach>標籤屬性說明
屬性名 |
說明 |
EL |
類型 |
必須 |
默認值 |
select |
指定使用的XPath語句 |
否 |
String |
是 |
無 |
var |
用於存儲表達式的結果 |
否 |
String |
否 |
無 |
varStatus |
用來存放循環到的變量的相關信息 |
否 |
String |
否 |
無 |
begin |
循環的起始位置 |
是 |
int |
否 |
無 |
end |
循環的終止位置 |
是 |
int |
否 |
無 |
(三) xml的文件轉換
<x:transform>和<x:param>能輕易使用XSLT樣式包裝xml文件,成爲另一種顯示方式。
1.<x:transform>標籤
使用該標籤可以輕鬆的實現xml到XSLT的轉化。
【語法1】:
<x:transform doc=”xmldoc”xslt=”XSLTStytlesheet”[docSystemId=”xmlsystemid”]
[result=”result”]
[var=”name”]
[scope=”scopeName”]
[xsltSystemId=”xsltsystemid”]/>
【語法2】:
<x:transform doc=”xmldoc”xslt=”XSLTStytlesheet”[docSystemId=”xmlsystemid”]
[result=”result”]
[var=”name”]
[scope=”scopeName”]
[xsltSystemId=”xsltsystemid”]
>
<x:param/>
</x:transform>
【語法3】:
<x:transform doc=”xmldoc”xslt=”XSLTStytlesheet”[docSystemId=”xmlsystemid”]
[result=”result”]
[var=”name”]
[scope=”scopeName”]
[xsltSystemId=”xsltsystemid”]
>
Xml文件內容
<x:param/>
</x:transform>
【參數說明】:見表9-23。
表9-23 <x:transform>標籤屬性說明
屬性名 |
說明 |
EL |
類型 |
必須 |
默認值 |
doc |
指定xml文件來源 |
是 |
String |
是 |
無 |
xslt |
轉化xml的樣式模板 |
是 |
String |
是 |
無 |
docSystemId |
xml文件的URI |
是 |
String |
否 |
無 |
xsltSystemId |
xslt文件的URI |
是 |
String |
否 |
無 |
result |
用來存儲轉換後的結果對象 |
是 |
java.xml.transform |
是 |
無 |
var |
以org.w3c.dom.Documet類型存儲轉換後的結果 |
否 |
String |
否 |
無 |
scope |
var的屬性範圍 |
否 |
String |
否 |
無 |
2.<x:param>標籤
該標籤用來爲<x:transform>標籤轉換參數。
【語法1】:
<x:param name=”name” value=”value”/>
【語法2】:
<x:param name=”name” value=”value”
>
Value
</x:param>
【參數說明】:
(1)name指定參數的名稱。
(2)value指定參數值。
六、 函數(function)標籤庫
引入函數(function)標籤庫的格式爲:
<%@ taglib prefix="fn"uri="http://java.sun.com/jsp/jstl/functions" %>
方法的描述:
函數 |
描述 |
fn:contains(string, substring) |
如果參數string中包含參數substring,返回true |
fn:containsIgnoreCase(string, substring) |
如果參數string中包含參數substring(忽略大小寫),返回true |
fn:endsWith(string, suffix) |
如果參數 string 以參數suffix結尾,返回true |
fn:escapeXml(string) |
將有特殊意義的XML (和HTML)轉換爲對應的XML character entity code,並返回 |
fn:indexOf(string, substring) |
返回參數substring在參數string中第一次出現的位置 |
fn:join(array, separator) |
將一個給定的數組array用給定的間隔符separator串在一起,組成一個新的字符串並返回。 |
fn:length(item) |
返回參數item中包含元素的數量。參數Item類型是數組、collection或者String。如果是String類型,返回值是String中的字符數。 |
fn:replace(string, before, after) |
返回一個String對象。用參數after字符串替換參數string中所有出現參數before字符串的地方,並返回替換後的結果 |
fn:split(string, separator) |
返回一個數組,以參數separator 爲分割符分割參數string,分割後的每一部分就是數組的一個元素 |
fn:startsWith(string, prefix) |
如果參數string以參數prefix開頭,返回true |
fn:substring(string, begin, end) |
返回參數string部分字符串, 從參數begin開始到參數end位置,包括end位置的字符 |
fn:substringAfter(string, substring) |
返回參數substring在參數string中後面的那一部分字符串 |
fn:substringBefore(string, substring) |
返回參數substring在參數string中前面的那一部分字符串 |
fn:toLowerCase(string) |
將參數string所有的字符變爲小寫,並將其返回 |
fn:toUpperCase(string) |
將參數string所有的字符變爲大寫,並將其返回 |
fn:trim(string) |
去除參數string 首尾的空格,並將其返回 |
舉例:
函數名 |
使用舉例 |
fn:contains(string, substring) |
<c:if test="${fn:contains(name, searchString)}"> |
fn:containsIgnoreCase(string, substring) |
<c:if test="${fn:containsIgnoreCase(name, searchString)}"> |
fn:endsWith(string, suffix) |
<c:if test="${fn:endsWith(filename, ".txt")}"> |
fn:escapeXml(string) |
${fn:escapeXml(param:info)} |
fn:indexOf(string, substring) |
${fn:indexOf(name, "-")} |
fn:join(array, separator) |
${fn:join(array, ";")} |
fn:length(item) |
${fn:length(shoppingCart.products)} |
fn:replace(string, before, after) |
${fn:replace(text, "-", "•")} |
fn:split(string, separator) |
${fn:split(customerNames, ";")} |
fn:startsWith(string, prefix) |
<c:if test="${fn:startsWith(product.id, "100-")}"> |
fn:substring(string, begin, end) |
${fn:substring(zip, 6, -1)} |
fn:substringAfter(string, substring) |
${fn:substringAfter(zip, "-")} |
fn:substringBefore(string, substring) |
${fn:substringBefore(zip, "-")} |
fn:toLowerCase(string) |
${fn.toLowerCase(product.name)} |
fn:toUpperCase(string) |
${fn.UpperCase(product.name)} |
fn:trim(string) |
${fn.trim(name)}
|
參考文獻:
【1】 http://chengwei2009.blog.163.com/blog/static/22868328200921810384692/
【2】 http://www.blogjava.net/maverick1003/articles/236575.html