JSTL簡介:
標准標簽庫JSTL的全名為:Java Server Pages Standard Tag Library.
JSTL主要提供了5大類標簽庫:
1. 核心標簽庫: 為日常任務提供通用支持,如顯示和設置變量,重復使用一組項目,測試條件以及其他操作(如導入和重定向web頁面等).
2. 國際化(I18N)標簽庫: 支持多種語言的引用程序.
3. SQL標簽庫: 對訪問和修改數據庫提供標准化支持.
4. XML標簽庫: 對XML文件處理和操作提供支持,包括XML節點的解析,迭代,基於XML數據的條件評估以及可擴展樣式語言轉換(Extensible Style Language Transformations , XSLT)的執行.
5. 函數標簽庫: 通過在EL表達式中調用函數標簽庫中的函數來實現特定的操作,例如: ${fn:contains(sring,substring)},其功能是判斷string字符串中是否包含substring字符串.
JSTL標簽庫使用方法:
標簽庫 URI 前綴 使用模式
核心標簽庫 http://java.sun.com/jstl/core c <c:tagname…>
國際化標簽(I18N) http://java.sun.com/jstl/fmt fmt <fmt:tagname…>
SQL標簽庫 http://java.sun.com/jstl/sql sql <sql:tagname…>
XML標簽庫 http://java.sun.com/jstl/xml x <x:tagname…>
函數標簽庫 http://java.sun.com/jstl/functions fn <fn:tagname…>
核心標簽庫
核心標簽庫包括:out , set , remove , catch , if , choose , when 和 URL 等.
表達式操作標簽: 包括:out , set , remove , catch.
out標簽:
核心標簽庫中最為基本的標簽就是<c:out>,他可以在頁面中顯示一個字符串或者一個EL表達式的值,其功能與JSP中的<%= 表達式%>類似
使用格式如下:
<c: out value=”object” [escapeXml=”true|false”] />
這個標簽還可以有一個體,如下:
<c: out value=”object” [escapeXml=”true|false”] >defalut value</c:out>
這表示當value屬性指定的object值為null時,就會顯示體中指定的值,也就是default value的值,體中也可以是jsp代碼.
<c:out>中各屬性的說明如下:
1. value : 可以指定一個字符串作為輸出內容,也可以指定為EL表達式,例如:${3+5}.
2. escapeXml : 類型為boolean , 確定 , < , > , & , ‘ , “ 等字符在結構的字符串中是否被轉換成字符串實體代碼,默認值是true(就是是否按html中的樣式進行輸出,設置true就是按照字符串原樣進行輸出,false就是按照html標識符進行輸出)
3. default value : 可以是字符串,也可以是一個EL表達式或者jsp表達式,如果屬性(value)指定的表達式或者對象為null,那么將輸出這個defalut value部分的值.
set標簽:
set標簽用來在某個范圍(request,session或者application)內設置值,或者設置某個對象的屬性值.
Set標簽使用格式如下:
1. 使用value 屬性在一個特定的范圍內指定某個變量的值,其使用格式如下:
<c:set var=”varName” value=”varValue” [scope=”page|request|session|application”]/>
2. 當使用value屬性在一個特定范圍內指定某各變量的值時,也可以包括一個體,他的作用與out標簽體的作用一樣,即value指定的值為null時,默認使用體中指定的值,使用的格式如下:
<c:set var=”varName” value=”varValue” [scope=”page|request|session|application”]>
default value
</c:set>
3. 設置某一個特定對象屬性的使用格式如下:
<c:set property=”propertyName” target=”target” value=”value”/>
4. 在設置某個特定對象的一個屬性時,也可以使用一個體,並且指定默認的值,使用格式如下:
<c:set property=”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 : 設置對象中的一個屬性.
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)方法.
catch標簽
catch標簽的功能和java中的try{…}catch{…}語句的功能很相似,它用於捕獲嵌入到其中間語句拋出的異常,這個標簽的使用格式如下:
<c:catch var=”varName”>
相關操作語句
</c:catch> --如果操作語句中出現異常,則catch會將異常保存在 varName變量中.
流程控制標簽: 包括: if , choose , when , otherwise 等.
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變量所在的有效范圍.
choose , when , otherwise 標簽
這些標簽相當於java中的 switch , case , default 條件,使用實例如下:
<c:set var=”num” scope=”page” value=”admin”/>
<c:choose>
<c:when test=”${num==’guest’}”>
<c:out value=”guest”/>
</c:when>
<c:when test=”${num==’admin’}”>
<c:out value=”admin”/>
</c:when>
<c:otherwise>
<c:out value=”other”/>
</c:otherwise>
</c:choose>
運行jsp頁面后,輸出 admin
forEach迭代標簽
該標簽用來對一個collection集合中的一系列對象進行迭代輸出,並且可以指定迭代次數,一般的使用格式如下:
<c:forEach items=”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[] =new String[5];
Items[0]=”核心標簽庫”;
Items[1]=”國際化標簽庫”;
Items[2]=”SQL標簽庫”;
Items[3]=”XML標簽庫”;
Items[4]=”函數標簽庫”;
Request.setAttribute(“ItemName”,Items);
%>
<B><c:out value=”不指定begin和end的迭代:”/><B><br>
<c:forEach var=”ItemName” items=”${Items}”>
<c:out value=”${ItemName}” /><br>
</c:forEach>
<B><c:out value=”指定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:out value=”輸出整個迭代的信息:”/><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值.
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:out value=”${token}”/>
</c:forTokens>
<h4>使用” | , ”作為分隔符</h4>
<c:forTokens var=”token” items=”bleu,rouge|vert,jaune|blanc,rouge” delims=”|,”>
<c:out value=”${token}”/>
</c:forTokens>
代碼說明: delims=”|,” , 即使用”|”和”,”同時作為分隔符進行使用.如果需要更多的分隔符就是使用“|,./” 在引號內輸出.
URL相關的標簽:
URL相關的標簽主要用來將其他文件包含進來,或者提供頁面之間的重定位以及URL地址的生成,參數的輸出等.一般包括如下幾個標簽.
<c:import>標簽: 與傳統JSP頁面重的<jsp:include>標簽類似.
<c:redirect>標簽: 進行頁面的重定位.
<c:url> : 主要用來重寫URL地址.
<c:param> : 一般param標簽會與其他標簽一起配套使用,用於參數值的傳遞.
<c:import> 標簽:
該標簽用於把其他今天文件包含到該文件當中,它與傳統的<jsp:include>相類似,不同的是<jsp:include>標簽只能用來包括該應用中的其他文件,而<c:import>還可以包含外部站點中的靜態文件,所以它的功能更加強大.使用格式如下:
<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來指定這些內容所采用的字符集編碼.
<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:param name=”paramName” value=”value”/>
</c:redirect>
例: [通過創建c_redirect1.jsp 和 c_redirect2.jsp 兩個文件說明]
c_redirect1.jsp文件內容如下:
<c:redirect url=”c_redirect2.jsp” >
<c:param name=”userName” value=”admin”/>
</c:redirect>
c_redirect2.jsp 文件內容如下:
<body>
userName=<c:out value=”${param.userName}”>
</body>
c_redirect1.jsp頁面文件內容不會顯示,因為直接重定向到c_redirect2.jsp,重定向c_redirect2.jsp后,頁面中輸出 userName=admin
<c:url>標簽:
這個標簽主要用來重寫url地址,使用格式如下:
<c:url value=”value” [context=”context”] [var=”varName”] [scope=”page|request|session|application”] />
當進行參數傳遞時,使用格式如下:
<c:url value=”value” [context=”context”] [var=”varName”] [scope=”page|request|session|application”] >
<c:param name=”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:param name=”userName” value=”admin”/>
<c:param name=”password” value=”123456”/>
</c:url>
<c:out value=”${url}”/>
<a herf=’<c:out value=”${url}”/>’>Link to other page</a>
代碼說明: url標簽可以指定一個變量(var屬性指定)來把url地址保存,並且可以指定這個變量的有效范圍為session ,所以當需要用到這個url地址時,就可以使用session.getAttribute(varName)方法來獲取這個地址,所以一般需要重復使用同一個url地址才會使用<c:url>標簽的功能.
國際化( I18N )標簽庫
國際化標簽包括:
<fmt:setLocale>: 用於設置當前本地化環境,為對應的java類javax.servlet.jsp.jstl.fmt.locale配置參數值,這個指定的參數由jsp運行時維護,用於確定各個jstl標簽使用的本地化環境.
<fmt:bundle>: 指定消息資源使用的文件.
<fmt:message>: 顯示消失資源文件中指定key的消息,支持帶參數的消息.
<fmt:param>: 給帶參數的消息設置參數值.
<fmt:setBundle>: 設置消息資源文件.
設置本地化環境標簽<fmt:setLocale>
HTML請求到達服務器時,瀏覽器提供的HTTP首部可以指出用戶的首選本地化環境(可能是多個本地化環境的列表).這個列表放在Accept-Language HTTP首部中,jsp容器會訪問這個首部信息,如果沒有使用標簽<fmt:setLocale>明確地指出引用本地化環境,JSTL標簽就會使用這個列表中的首選本地化環境.
<fmt:setLocale>標簽專門用於設置當前本地化環境,基本使用格式如下:
<fmt:setLocale value=”…locale value…” [variant=”…variant value…”] [scope=”page|request|session|application”] />
<fmt:setLocale>標簽的屬性描述如下:
value: 這個屬性是必須設置的,它用來設置本地環境名,例如en_US 或者zh_HK.
variant: 這個屬性是可選的,而且很少使用.
scope: 指定value設置的本地化環境名的有效范圍,默認為page,即本頁面,如果把scope設置為session,則表示同一個用戶發出的所有請求都具有相同的本地化環境.
執行信息資源標簽<fmt:bundle>
一旦已經設置了web引用的本地化環境后,就可以使用<fmt:bundle>標簽了,其體重可以包括一些調用本地化文本的<fmt:message>標簽,使用格式如下:
<fmt:bundle basename=”…the bundle’s base name…” [prefix=”…prefix name…”]>
<fmt:message key=”…key name…”/>
</fmt:bundle>
屬性描述如下:
Basename: 資源文件(這里使用文件,而不是類)的基名,例如,某資源文件Res_zh_CN.property,則基名為Res.
prefix: 這個設置是可選的,如果指定這個屬性,就會為標簽體中嵌套的<fmt:message>標簽附加一個前綴.
當<fmt:bundle>標簽中嵌套<fmt:message>標簽時,這時<fmt:message>標簽默認使用<fmt:bundle>標簽中的basename所指定的資源文件.
獲取資源屬性值標簽<fmt:message>:
該標簽用於顯示本地化的文本,它通過key屬性來取得資源文件中相應的消息<fmt:message>標簽的一般使用格式如下:
<fmt:message key=”…name of property…” [bundle=”…resourceBundle…”][var=”…varible name…”] [scope=”…scope of var…”]/>
這個標簽從資源文件重獲取到一個消息,生成相應的一個本地化文本串,該便去重的屬性描述如下:
Key : 用於查找資源文件重相應的關鍵字名,它對應着一條特定的消息.
bundle: 如果設置了這個屬性,就會使用這個屬性指定的資源文件,否則若嵌套在<fmt:bundle>標簽重,就會直接使用<fmt:bundle>標簽重basename屬性指定的資源文件.
Var : 如果指定這個屬性,則把取出的消息字符串存儲在這個變量中.
Scope: 這個屬性指定了var設置變量的有效范圍,默認為page,然而也可以設置為session.
設置資源文件標簽<fmt:setBundle>
該標簽用於設置一個資源文件,並給定一個標記,以便可以通過<fmt:message>標准中指定bundle屬性值來取得這個資源文件中的消息,使用格式如下:
<fmt:setBundle basename=”…the bundle’s base name…” var=”…var name…” [scope=”page|request|session|application”]/>
標簽中的屬性描述如下:
basename : 該屬性與<fmt:message>標簽中的basename屬性類似.
Var : 給指定的資源文件取一個變量名,以便<fmt:message>標簽可以通過這個變量名來讀取資源文件中的消息
Scope: 設置var屬性指定的變量的有效范圍.
獲取參數值標簽<fmt:param>:
該標簽一般與<fmt:message>標簽配套使用,用來在獲取的消息中插入一個值.例如:資源文件中的一條消息如下:
密碼錯誤=”{0}的密碼錯誤”
<fmt:message>標簽首先使用key=”密碼錯誤”這個關鍵字找到以上這條消息,然后在<fmt:message>標簽中使用<fmt:param>標簽賦一個值來替代{0}部分.
<fmt:param>標簽的使用格式如下:
<fmt:message ……>
<fmt:param value=”value”/>
</fmt:message>
其中value屬性的值即為要的替代{0}部分的值.
函數(function)標簽庫:
函數標簽庫中的標簽基本分成兩種:
1. 長度度量函數,例如:fn.length(). [ fn.length(“”) 就為要輸出的格式表達式,結果輸出0 ]
2. 字符串操作函數.
各類函數標簽的功能:
1. fn:contains(string,substring): 如果參數string中包含substring,則返回true.
2. fn:containsIgnoreCase(string,substring): 如果參數string中包含substring,則返回true(忽略大小寫).
3. fn:endsWith(string,suffix): 如果參數string以參數suffix結尾,則返回true.
4. fn:escapeXml(string): 將由特殊意義的xml(和html)轉換成對應的XML character entity code並返回.
5. fn:indexOf(string,substring): 返回參數substring在string中第一次出現的位置.
6. fn:join(array,separator): 將一個給定的數組array用給定的間隔符separator串在一起,組成一個新的字符串並返回.
7. fn:length(item): 返回參數item中包含元素的數量,參數item的類型是數組,collection或者string,如果是string則返回string的字符數.
8. fn:replace(string,before,after): 返回一個String對象,用參數after字符串替換參數string中所有出現before字符串的地方,並返回替換后的結果.
9. fn:split(string,separator): 返回一個數組,以參數separator為分隔符分隔參數string,分隔后的每一部分就是數組的一個元素.
10. fn:startsWith(string,prefix): 如果參數string以參數prefix開頭,則返回true.
11. fn:substring(string,begin,end): 返回參數string的部分字符串,從參數begin開始到參數end結束,其中包括end位置的字符.
12. fn:substringAfter(string,substring): 返回參數substring在參數string中后面的那一部分字符串.
13. fn:substringBefore(string,substring): 返回參數substring在參數string中前面的那一部分字符串.
14. fn:toLowerCase(string): 將參數string的所有字符變為小寫,並返回.
15. fn:toUpperCase(string): 將參數string的所有字符變成大寫,並返回.
16. fn:trim(string): 將參數string的頭尾空格全部去除,並返回.
<logic:notEmpty> 標簽其本身具有多種功能:
一是判斷是否為 null 。
二是當它為 String 類型的變量時,判斷字符串長度是否為 0 。
三是當它為集合類型的變量時,利用集合類的 isEmpty 方法可以判斷是否是一個空的集合。
本示例既然要在替換后與替換前的工作一致,就應該對集合做兩個判斷:
一是該集合不為 null 。
二是該集合中的對象數量不為 0 。
“ !=null ”的 EL 表達式實現了集合實例不為 null 的判斷; fn:length() 函數實現了集合內對象數量不為 0 的判斷,兩個判斷用“ && ”連接起來就實現了 <logic:notEmpty> 標簽對於集合判斷的工作。