JSTL標籤詳細教程之——核心庫
JSTL(JSP Standard Tag Library,JSP標準標籤庫),目前最新版本是1.2,包括四個標籤庫(core、format、xml、sql),這一篇主要講解JSTL的核心庫即core標籤庫,核心庫標籤共有14個,從功能可以分為四大類:邏輯控制、表示式控制、迴圈判斷、URL操作。
一、開發前準備。
1、確保classpath下有standard.jar,jstl.jar。
2、在JSP檔案的頂部引入
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
3、已掌握EL表示式的基本語法,若未掌握,可以先看這裡 二、核心庫標籤的分類。
表示式類 :out、set、remove、catch
邏輯控制類:if、choose、when、otherwise
迴圈判斷類:forEach、forTokens
URL操作類 :import、url、redirect、param
三、表示式類標籤。
1、out標籤(向頁面輸出值)
語法
<c:out value="value" [escapeXml="{true|false}"] [default="defaultValue"] /></c:out>
名稱 | 說明 | EL支援 | 必須 | 預設值 |
---|---|---|---|---|
value | 轉出的值 | 是 | 是 | 無 |
escapeXml | 是否轉義特殊字元和編譯html標籤 | 否 | 否 | true |
default | 預設輸出的值 | 否 | 否 | 無 |
2、set標籤(給變數賦值)<c:out value="普通值"></c:out> <!-- 普通值 --> <c:out value="${no}" default="預設值"></c:out> <!-- 預設值(當value為EL表示式,並且表示式的結果為null時顯示預設值) --> <c:out value="<、>、'、"、&" escapeXml="false"></c:out> <!-- <、>、'、"、& (false時轉義特殊字元) --> <c:out value="<、>、'、"、&"></c:out> <!-- <、>、'、"、& (預設不轉義) --> <c:out value="<a href='www.xiaoed.com'>小耳朵的個人部落格</a>" escapeXml="false"></c:out> <!-- 小耳朵的個人部落格(false時編譯html標籤) --> <c:out value="<a href='www.xiaoed.com'>小耳朵的個人部落格</a>"></c:out> <!-- <a href='www.xiaoed.com'>小耳朵的個人部落格</a> -->
語法1:設定值到scope範圍的變數中
<c:set value="value" var="varName" [scope="{ page|request|session|application }"]/></c:set>
語法2:設定值到JavaBean或Map的屬性中
<c:set value="value" target="target" property="propertyName" /></c:set>
名稱 | 說明 | EL支援 | 必須 | 預設值 |
value | 要被儲存的值 | 是 | 否 | 無 |
var | 儲存值的名稱 | 否 | 否 | 無 |
scope | 儲存值的範圍 | 否 | 否 | page |
target | JavaBean或者java.util.Map的名稱 | 是 | 否 | 無 |
property | target物件的屬性 | 是 | 否 | 無 |
說明:target非空時,property不能為空,且target和var同時存在時只有一個生效。
<c:set var="item1" value="1"></c:set>${item1}
<!-- 1 -->
<c:set var="item2">2</c:set>${item2}
<!-- 2 -->
<c:set var="item3" value="1">2</c:set>${item3}
<!-- 報錯,這兩個位置不能同時設定 -->
<c:set var="item4" value="page" scope="page"></c:set>
<c:set var="item4" value="request" scope="request"></c:set>
<c:set var="item4" value="session" scope="session"></c:set>
<c:set var="item4" value="application" scope="application"></c:set>
${item4}<!-- page -->
<c:set target="${user}" value="userName" property="name"></c:set>${user.name}
<!-- userName -->
<c:set target="${map}" value="value" property="key"></c:set>${map.key}
<!-- value -->
3、remove標籤(與set相反,刪除變數)
語法:
<c:remove var="varName" [scope="{ age|request|session|application }"] />
名稱 | 說明 | EL支援 | 必須 | 預設值 |
---|---|---|---|---|
var | 要刪除的變數名 | 否 | 是 | 無 |
scope | 要刪除變數的範圍 | 否 | 是 | 全部 |
<c:set var="item" value="request" scope="request"></c:set>
<c:set var="item" value="page" scope="page"></c:set>
<c:set var="item" value="session" scope="session"></c:set>
<c:set var="item" value="application" scope="application"></c:set>${item} -
<c:remove var="item" />${item}
<!-- page - (預設刪除全部的) -->
<c:set var="item2" value="request" scope="request"></c:set>
<c:set var="item2" value="page" scope="page"></c:set>
<c:set var="item2" value="session" scope="session"></c:set>
<c:set var="item2" value="application" scope="application"></c:set>${item2} -
<c:remove var="item2" scope="page"/>${item2}
<!-- page - request (只刪除page範圍內的)-->
4、catch標籤(捕捉異常,儲存異常資訊)
語法:
<c:catch [var="varName"] > 異常部分 </c:catch>
名稱 | 說明 | EL支援 | 必須 | 預設值 |
---|---|---|---|---|
var | 異常資訊儲存的變數名 | 否 | 否 | 無 |
<c:catch var="ex">
<% int i = 1/0; %>
</c:catch>
${ex}<!-- java.lang.ArithmeticException: / by zero -->
四、邏輯控制類標籤。
1、if標籤(單一的if判斷,沒有else)
語法:
<c:if test="testCondition" [var="varName"] [scope="{page|request|session|application}"]>條件成立時的輸出內容</c:if>
名稱 | 說明 | EL支援 | 必須 | 預設值 |
---|---|---|---|---|
test | 判斷條件 | 是 | 是 | 無 |
var | 判斷結果儲存的變數名 | 否 | 否 | 無 |
scope | 變數的儲存範圍 | 否 | 否 | page |
<c:set var="name" value="張三"></c:set>
<c:if test="${name=='張三'}" var="var1" scope="page">我是張三</c:if>
<c:if test="${name=='賊九'}" var="var2">賊九也是張三</c:if>
var1:${var1} -- var2:${var2}
<!-- 我是張三 var1:true -- var2:false -->
2、choose、when、otherwise標籤(巢狀使用相當於if-elseif-else)
語法:
<c:choose>
<c:when test="">
前面的條件都不成立但此條件成立時輸出
</c:when>
<c:when test="">
前面的條件都不成立但此條件成立時輸出
</c:when>
......
<c:otherwise>
前面的條件都不成立時才輸出
</c:otherwise>
</c:choose>
名稱 | 說明 | EL支援 | 必須 | 預設值 |
---|---|---|---|---|
test | 判斷條件 | 支援 | 是 | 無 |
<c:set var="score" value="60"></c:set>
<c:choose>
<c:when test="${score<60}">
差
</c:when>
<c:when test="${score==60}">
剛好
</c:when>
<c:when test="${score>=60}">
很好
</c:when>
<c:otherwise>
沒考
</c:otherwise>
</c:choose>
<!-- 剛好 -->
五、迴圈判斷類標籤。
1、forEach標籤(迴圈遍歷)
語法1:遍歷集合,類似(String s : new String[]{"a","b"})
<c:forEach items="collection" [var="varName"] [varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"]>
輸出內容
</c:forEach>
語法2:迴圈指定次數,類似(int i=0;i<5;i++)
<c:forEach [var="varName"] [varStatus="varStatusName"] begin="begin" end="end" [step="step"]>
輸出內容
</c:forEach>
forEach引數說明
名稱 | 說明 | EL支援 | 必須 | 預設值 |
---|---|---|---|---|
items | 遍歷的集合物件 | 是 | 否 | 無 |
var | 每次遍歷的物件 | 否 | 否 | 無 |
varStatus | 遍歷的相關資訊 | 否 | 否 | 無 |
begin | 開始的位置(正數) | 是 | 否 | 0 |
end | 結束的位置(正數) | 是 | 否 | 集合長度 |
step | 遍歷的步長(正數) | 是 | 否 | 1 |
名稱 | 型別 | 說明 |
---|---|---|
index | number | 遍歷物件的索引,從0開始 |
count | number | 總共迴圈的次數,從1開始 |
first | boolean | 本次迴圈遍歷的是否是集合的第一個元素 |
end | boolean | 本次迴圈遍歷的是否是集合的最後一個元素 |
<c:forEach var="i" varStatus="ii" begin="0" end="10" step="3">
第${ii.count}次迭代,索引:${ii.index},值是:${i},是否是第1個:${ii.first},是否是最後 一個:${ii.last}<br>
</c:forEach>
<!--
第1次迭代,索引:0,值是:0,是否是第1個:true,是否是最後 一個:false
第2次迭代,索引:3,值是:3,是否是第1個:false,是否是最後 一個:false
第3次迭代,索引:6,值是:6,是否是第1個:false,是否是最後 一個:false
第4次迭代,索引:9,值是:9,是否是第1個:false,是否是最後 一個:true
-->
遍歷List
<%
List<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
list.add("E");
list.add("F");
request.setAttribute("list",list);
%>
<c:forEach items="${list}" var="l" varStatus="ll" begin="1" end="5" step="2">
第${ll.count}次迭代,索引:${ll.index},值是:${l},是否是第1個:${ll.first},是否是最後 一個:${ll.last}<br>
</c:forEach>
<!--
第1次迭代,索引:1,值是:B,是否是第1個:true,是否是最後 一個:false
第2次迭代,索引:3,值是:D,是否是第1個:false,是否是最後 一個:false
第3次迭代,索引:5,值是:F,是否是第1個:false,是否是最後 一個:true
-->
遍歷Map
<%
Map<String,String> map = new HashMap<String,String>();
map.put("key1", "value1");
map.put("key2", "value2");
map.put("key3", "value3");
request.setAttribute("map",map);
%>
<c:forEach items="${map}" var="m">
key:${m.key},value:${m.value}<br>
</c:forEach>
<!--
key:key3,value:value3
key:key2,value:value2
key:key1,value:value1
-->
遍歷Set
<%
Set<String> set = new HashSet<String>();
set.add("大");
set.add("壞");
set.add("蛋");
request.setAttribute("set",set);
%>
<c:forEach items="${set}" var="s">
${s}
</c:forEach>
<!-- 壞 蛋 大 -->
2、forTokens標籤(字串拆分,相當於String的split方法)
語法:
<c:forTokens items="str" delims="selStr" [var="varName"]
[varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"]>
輸出內容
</c:forTokens>
引數說明
名稱 | 說明 | EL支援 | 必須 | 預設值 |
---|---|---|---|---|
items | 要被拆分的字串的 | 是 | 是 | 無 |
delims | 用來拆分的字串 | 否 | 是 | 無 |
var | 儲存每次拆分的字串 | 否 | 否 | 無 |
varStatus | 第次拆分的相關資訊 | 否 | 否 | 無 |
begin | 起始位置 | 是 | 否 | 0 |
end | 終止位置 | 是 | 否 | 被拆分後的長度 |
step | 步長 | 是 | 否 | 1 |
<c:forTokens items="你,是,我,的,小,蘋,果" delims="," var="i" varStatus="ii">
${i}
</c:forTokens>
<!-- 你 是 我 的 小 蘋 果 -->
五、URL操作類標籤。
1、import標籤(把其他資原始檔引用到本頁面,類似jsp:include,區別在於可以引用任意地方的資源,不限於本專案)
語法:<c:import url="url" [context="context"] [var="varName"] [scope="{page|request|session|application}"] [charEncoding="charEncoding"] [varReader="varReaderName"]>
<span style="white-space:pre"> <c:param>...</span>
</c:import>
名稱 | 說明 | EL支援 | 必須 | 預設值 |
---|---|---|---|---|
url | 要引入資源的URL | 是 | 是 | 無 |
context | URL為相對路徑時的根目錄 | 否 | 否 | 當前專案目錄 |
var | 資原始檔內容儲存物件的名字 | 否 | 否 | 無 |
scope | 儲存範圍 | 否 | 否 | page |
charEncoding | 檔案編碼 | 否 | 否 | 無 |
varReader | 儲存匯入內容的Java.io.Reader物件 | 否 | 否 | 無 |
說明:
1、引入的資原始檔不限於jsp、html也可是txt等。
2、url可以是絕對路徑,也可是相對路徑。
3、此操作容易出異常,建議放在<c:catch></c:catch>中捕獲。
<c:import url="www.xiaoed.com"></c:import>
<!-- 輸出頁面內容(黑色) -->
<c:import url="www.xiaoed.com" var="varUrl" scope="page"></c:import>
<!-- 沒有輸出 -->
<c:import url="www.xiaoed.com" var="varUrl"></c:import>
<a style="color: red;">${varUrl}</a>
<!-- 輸出頁面內容(紅色) -->
<c:import url="/imp.txt" charEncoding="UTF-8" context="/jstl"></c:import>
<!-- 我是Txt(黑色) -->
2、url標籤(在JSP頁面中構造一個URL地址,實現URL重寫)
語法:param是給url傳遞引數
<c:url value="value" [context="context"] var =“varName" [scope="page|request|session|application"]>
<c:param>...
</c:url>
名稱 | 說明 | EL支援 | 必須 | 預設值 |
---|---|---|---|---|
value | 要構造的URL,絕對或相對路徑 | 是 | 是 | 無 |
var | 構造好的URL儲存的物件名稱 | 否 | 否 | 無 |
context | URL為相對路徑時的根目錄 | 否 | 否 | 當前專案目錄 |
scope | 儲存物件的儲存範圍 | 否 | 否 | page |
c:param | 向URL傳遞引數 | 是 | 否 | 無 |
<c:url value="www.xiaoed.com"></c:url>
<!-- www.xiaoed.com -->
<c:url value="www.xiaoed.com" var="urlName"></c:url>
<!-- 沒有輸出 -->
<c:url value="www.xiaoed.com" var="urlName" scope="page"></c:url>
<a style="color: green;">${urlName}</a>
<!-- www.xiaoed.com(綠色) -->
<c:url value="/index.jsp" context="/jstl"></c:url>
<!-- /jstl/index.jsp -->
<c:url value="www.xiaoed.com">
<c:param name="n1" value="v1"></c:param>
<c:param name="n2" value="v2"></c:param>
</c:url>
<!-- www.xiaoed.com?n1=v1&n2=v2 -->
3、redirect標籤(重定向到指定URL)語法:
<c:redirect url=”url”[context=”context”]>
<c:param>...
</c:redirect>
名稱 | 說明 | EL支援 | 必須 | 預設值 |
---|---|---|---|---|
url | 要重定向的URL地址 | 是 | 是 | 無 |
context | URL為相對路徑時的根目錄 | 否 | 否 | 當前專案目錄 |
param | 向URL傳遞引數 | 是 | 否 | 無 |
<c:redirect url="/imp.jsp" context="/jstl">
<c:param name="name" value="value"></c:param>
</c:redirect>
<!-- 跳轉頁面的URL http://localhost:8080/jstl/imp.jsp?name=value -->
4、param標籤(與import、url、redirect聯合使用)語法:
<c:param name="name" value="value"></c:param>
與import、url、redirect聯合使用,用來傳遞引數。JSTL核心庫標籤的用法基本上都寫到了,若各位發現有誤的地方,請在評論中評出,多謝!format、xml、sql這三個標籤庫的講解也會在接下來的幾篇部落格中給出。本文的程式碼下載請點這裡