核心标签库(转)
JSTL核心標(biāo)簽庫包含了一組用于實現(xiàn)WEB應(yīng)用中的通用操作的標(biāo)簽,JSP規(guī)范為核心標(biāo)簽庫建議的前綴名為c。
1.3.1 ?<c:out>標(biāo)簽
<c:out> 標(biāo)簽用于輸出一段文本內(nèi)容到pageContext對象當(dāng)前保存的“out”對象中,在通常情況下,pageContext對象當(dāng)前保存的“out”對象 的數(shù)據(jù)是輸出到客戶端瀏覽器,所以,<c:out> 標(biāo)簽通常用于輸出一段文本內(nèi)容到客戶端瀏覽器。如果<c:out> 標(biāo)簽輸出的文本內(nèi)容中包含了需要進行轉(zhuǎn)義的HTML特殊字符,例如,<、>、'、"、&等,<c:out> 標(biāo)簽?zāi)J(rèn)對它們按表1.2進行HTML編碼轉(zhuǎn)換后再進行輸出,這樣就可以在瀏覽器中顯示出這些字符。
表1.2 特殊字符轉(zhuǎn)換
<c:out>標(biāo)簽標(biāo)簽有兩種語法格式:
語法1,沒有標(biāo)簽體的情況:
<c:out value="value"
???? [escapeXml="{true|false}"]
? ?? [default="defaultValue"] />
語法2,有標(biāo)簽體的情況,在標(biāo)簽體中指定輸出的默認(rèn)值:
<c:out value="value"
? ?? [escapeXml="{true|false}"] >
? default value
</c:out>
<c:out>標(biāo)簽的屬性說明如表1.3所示。
表1.3? <c:out>標(biāo)簽的屬性
| 屬性名 | 是否支持EL | 屬性類型 | 屬 性 描 述 |
| value | true | Object | 指定要輸出的內(nèi)容 |
| escapeXml | true | Boolean | 指定是否將>、<、&、'、" 等特殊字符進行HTML編碼轉(zhuǎn)換后再進行輸出。默認(rèn)值為true |
| default | true | Object | 指定如果value屬性的值為null時所輸出的默認(rèn)值 |
?
當(dāng)且僅當(dāng)value屬性的值為null時,<c:out> 標(biāo)簽輸出默認(rèn)值;如果沒有指定默認(rèn)值,默認(rèn)為空字符串。<c:out> 標(biāo)簽的標(biāo)簽體的內(nèi)容用于指定輸出的默認(rèn)值,如果value屬性的值不為null,即使標(biāo)簽體部分不為空,標(biāo)簽體的內(nèi)容也不會被輸出。如果value屬性不 是指向一個java.io.Reader對象,<c:out> 標(biāo)簽將調(diào)用這個對象的toString方法,然后輸出獲得的字符串內(nèi)容。如果value屬性指向一個java.io.Reader對 象,<c:out> 標(biāo)簽將從這個Reader對象中讀取數(shù)據(jù)后進行輸出,當(dāng)有大量數(shù)據(jù)要被輸出時,將這些數(shù)據(jù)以Reader對象的形式提供給<c:out>標(biāo)簽 進行輸出,將會極大提高系統(tǒng)性能。當(dāng)采用escapeXml屬性的默認(rèn)設(shè)置值true時,<c:out>標(biāo)簽將對要輸出的特殊字符按表1.2 進行轉(zhuǎn)換;如果將escapeXml屬性設(shè)置為false,<c:out>標(biāo)簽將不對要輸出的特殊字符進行轉(zhuǎn)換,而是直接輸出這些特殊字符。
例程1-3是<c:out> 標(biāo)簽的一個演示例子程序。
例程1-3? c_out1.jsp
?
?
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=gb2312" %>
<%
? session.setAttribute("test_session", "testValue_session");
%>
直接輸出一個字符串:
<c:out value="test" default="123456" /><br /><hr />
輸出Web域中不存在的屬性的值:<br />
<c:out value="${test_request}" default="這個屬性不存在"/><br /><hr />
輸出Web域中的test_session屬性的值:<br />
<c:out value="${test_session}" />
?
?
例程1-3的運行結(jié)果如圖1.1所示。
圖1.1
例程1-4和例程1-5是兩個用于演示<c:out>標(biāo)簽的escapeXml屬性的例子程序,例程1-4沒有設(shè)置escapeXml屬性,例程1-5將escapeXml屬性設(shè)置為了false。
例程1-4? c_out2.jsp
?
?
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:out value="${null}" >
? <meta http-equiv="refresh" content="0;url=http://www.it315.org" />
</c:out>
?
?
例程1-5 c_out3.jsp
?
?
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:out value="${null}" escapeXml="false">
? <meta http-equiv="refresh" content="0;url=http://www.it315.org" />
</c:out>
?
?
例程1-4和例程1-5的運行結(jié)果分別如圖1.2和圖1.3所示。
圖1.2
圖1.3
1.3.2 ?<c:set>標(biāo)簽
<c:set>標(biāo)簽用于設(shè)置各種Web域中的屬性,或者設(shè)置Web域中的java.util.Map類型的屬性對象或JavaBean類型的屬性對象的屬性。<c:set>標(biāo)簽有四種語法格式:
語法1,使用value屬性設(shè)置指定域中的某個屬性的值:
<c:set value="value"
???? var="varName"
???? [scope="{page|request|session|application}"] />
語法2,在標(biāo)簽體中設(shè)置指定域中的某個屬性的值:
<c:set var="varName"
???? [scope="{page|request|session|application}"]>
? body content
</c:set>
語法3,使用value屬性設(shè)置Web域中的一個屬性對象的某個屬性:
<c:set value="value"
???? target="target"
???? property="propertyName" />
語法4,在標(biāo)簽體中設(shè)置Web域中的一個屬性對象的某個屬性性:
<c:set target="target"
???? property="propertyName">
? body content
</c:set>
<c:set>標(biāo)簽的屬性說明如表1.4所示。
表1.4 <c:set>標(biāo)簽的屬性
| 屬性名 | 是否支持EL | 屬性類型 | 屬 性 描 述 |
| value | true | Object | 用于指定屬性值 |
| var | false | String | 用于指定要設(shè)置的Web域?qū)傩缘拿Q |
| scope | false | String | 用于指定屬性所在的Web域 |
| target | true | Object | 用于指定要設(shè)置屬性的對象,這個對象必須是JavaBean對象或java.util.Map對象 |
| property | true | string | 用于指定當(dāng)前要為對象設(shè)置的屬性名稱 |
?
如果使用第1種語法格式時的value屬性值為null,或者使用第2種語法格式時的標(biāo)簽體內(nèi)容為空,<c:set>標(biāo)簽將從scope屬性指定的域范圍中刪除var屬性指定的屬性。
在第3種語法格式和第4語法格式中,如果target屬性的值是java.util.Map對象,property屬性表示該Map對象的關(guān)鍵字, 如果Map對象沒有指定的關(guān)鍵字,就給Map對象增加指定的關(guān)鍵字;如果target屬性的值是JavaBean對象,property屬性表示 JavaBean對象的屬性,如果value的類型與JavaBean屬性的類型不匹配時,會根據(jù)EL的轉(zhuǎn)換規(guī)則自動進行轉(zhuǎn)換。當(dāng)使用第3種語法格式或第 4種語法格式時,如果target屬性的值為null(即target屬性指定的對象不存在),或者target屬性的值是一個JavaBean對象,但 該JavaBean中不存在property屬性指定的屬性,<c:set>標(biāo)簽將拋出異常。如果使用第3種語法格式時value屬性的值為 null,或者使用第4種語法格式時標(biāo)簽體的內(nèi)容為空,如果target屬性的值是一個java.util.Map對象,就從Map對象中刪除 property屬性指定的關(guān)鍵字對應(yīng)的項;如果target屬性的值是一個JavaBean對象,就將JavaBean的相應(yīng)屬性的值設(shè)置為null。
例程1-6是使用<c:set>標(biāo)簽設(shè)置某個Web域中的屬性的一個演示例子程序。
例程1-6 c_set1.jsp
?
?
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=gb2312" %>
<c:set var="userName" scope="session">
? zxx
</c:set>
輸出session 作用域中的userNamer屬性的值:
<c:out value="${userName}" /><br /><hr />
輸出session 作用域中的bookname屬性的值:
<c:set var="bookname" scope="session" />
<c:out value="${bookname}" />
?
?
例程1-6的運行結(jié)果如圖1.4所示。
圖1.4
例程1-7是使用<c:set>標(biāo)簽設(shè)置UserBean對象和Map對象的屬性的一個演示例子程序。
例程1-7? c_set2.jsp
?
?
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=gb2312" %>
<%@ page import="java.util.HashMap" %>
<jsp:useBean id="user" class="org.it315.UserBean" />
<%??
? HashMap preferences = new HashMap();
? session.setAttribute("preferences",preferences);
%>
設(shè)置和輸出UserBean對象的userName屬性值:
<c:set value="zxx" target="${user}" property="userName" />
<c:out value="${user.userName}" /><br /><hr />
設(shè)置和輸出UserBean對象的password屬性值:
<c:set target="${user}" property="password" />
<c:out value="${user.password}" /><br /><hr />
設(shè)置和輸出Map對象的color關(guān)鍵字的值:
<c:set target="${preferences}" property="color" value="${param.color}" />
<c:out value="${preferences.color}" />
?
?
在瀏覽器地址欄輸入如下地址訪問例程1-7:
? http://localhost:1010/JSTL/c_set2.jsp?color=green
例程1-7的運行結(jié)果如圖1.5所示。
圖1.5
1.3.3 ?<c:remove>標(biāo)簽
<c:remove>標(biāo)簽用于刪除各種Web域中的屬性,其語法格式如下:
<c:remove var="varName"
???? [scope="{page|request|session|application}"] />
var屬性用于指定要刪除的屬性的名稱,scope屬性用于指定要刪除的屬性所屬的Web域,它們的值都不能接受動態(tài)值。如果沒有指定scope屬性,<c:remove>標(biāo)簽就調(diào)用PageContext.removeAttribute(varName)方法,否則就調(diào)用PageContext.removeAttribute(varName, scope) 方法。<c:remove>與<c:set>標(biāo)簽第一種語法格式的value屬性值為null時的作用相同。
例程1-1是使用<c:remove>標(biāo)簽的一個演示例子程序。
例程1-1 c_remove.jsp
?
?
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=gb2312" %>
<c:set value="org.it315" var="company" scope="request" />
<c:set var="passWord" scope="session">
? a123456a
</c:set>
在沒有使用 <c:remove> 標(biāo)簽之前,變量的值為:<br />
company:<c:out value="${company}" /><br />
passWord:<c:out value="${passWord}" /><br />
<c:remove var="company" scope="request" />
<!--c:set var="company" scope="request" 此行與黑體字的一行作用是一樣的/-->
<c:remove var="passWord" scope="session" /><hr />
在使用 <c:remove> 標(biāo)簽之后,變量的值為:<br />
company:<c:out value="${company}" /><br />
passWord:<c:out value="${passWord}" />
?
?
例程1-1的運行結(jié)果如圖1.6所示。
圖1.6
1.3.4 ?<c:catch>標(biāo)簽
<c:catch>標(biāo)簽用于捕獲嵌套在標(biāo)簽體中的內(nèi)容拋出的異常,其語法格式如下:
<c:catch [var="varName"]>
? nested actions
</c:catch>
var屬性用于標(biāo)識<c:catch>標(biāo)簽捕獲的異常對象,其值是一個靜態(tài)的字符串,不支持動態(tài)屬性 值。<c:catch>標(biāo)簽將捕獲的異常對象以var指定的名稱保存到page這個Web域中,如果沒有指定var屬性, 則<c:catch>標(biāo)簽僅捕獲異常,不在page域保存異常對象。如果<c:catch>標(biāo)簽體中的內(nèi)容沒有拋出異 常,<c:catch>標(biāo)簽將從page域中刪除var屬性指定的屬性。
<c:catch>標(biāo)簽可以捕獲任何標(biāo)簽拋出的異常,并且可以同時處理多個標(biāo)簽拋出的異常,這樣,可以對JSP頁面的異常進行統(tǒng)一處 理,顯示給用戶一個更友好的頁面。JSP處理異常的通用機制是出現(xiàn)重要異常后跳轉(zhuǎn)到錯誤處理頁面,建議盡量不要用<c:catch>標(biāo)簽來代 替JSP的錯誤處理機制,只對一些次要異常才使用<c:catch>標(biāo)簽進行捕獲處理。
例程1-9是使用<c:catch>標(biāo)簽進行異常捕獲處理的一個演示例子程序。
例程1-9 ?c_catch.jsp
?
?
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=gb2312" %>
<c:catch var="myex">
<%
? int i = 0;
? int j = 10;
? out.println(j + "/" + i + "=" + j/i);
%>
</c:catch>
異常:<c:out value="${myex}" /><br />
異常 myex.getMessage:<c:out value="${myex.message}" /><br />
異常 myex.getCause:<c:out value="${myex.cause}" /><br />
異常 myex.getStackTrace:<c:out value="${myex.stackTrace}" />
?
?
在例程1-9中,<c:catch>標(biāo)簽內(nèi)嵌套的腳本元素拋出了異常,<c:catch var="myex">將捕獲到這個異常,調(diào)用<c:out value="${myex.message}" />,相當(dāng)于調(diào)用<%=myex.getMessage()%>。例程1-9的運行結(jié)果如圖1.7所示。
圖1.7
1.3.5? <c:if>標(biāo)簽
JSP頁面的顯示邏輯中也經(jīng)常需要進行條件判斷,<c:if>標(biāo)簽可以構(gòu)造簡單的“if-then”結(jié)構(gòu)的條件表達式,如果條件表達式的結(jié)果為真就執(zhí)行標(biāo)簽體部分的內(nèi)容。<c:if>標(biāo)簽有兩種語法格式:
語法1,沒有標(biāo)簽體的情況:
<c:if test="testCondition" var="varName"
???? [scope="{page|request|session|application}"] />
語法2,有標(biāo)簽體的情況,在標(biāo)簽體中指定要執(zhí)行的內(nèi)容:
<c:if test="testCondition" [var="varName"]
???? [scope="{page|request|session|application}"]>
? body content
</c:if>
<c:if>標(biāo)簽的屬性說明如表1.5所示。
表1.5 ??<c:if>標(biāo)簽的屬性
| 屬性名 | 是否支持EL | 屬性類型 | 屬 性 描 述 |
| test | true | boolean | 決定是否處理標(biāo)簽體中的內(nèi)容的條件表達式 |
| var | false | String | 用于指定將test屬性的執(zhí)行結(jié)果保存到某個Web域中的某個屬性的名稱 |
| scope | false | String | 指定將test屬性的執(zhí)行結(jié)果保存到哪個Web域中 |
?
對于語法2,如果指定了<c:if>標(biāo)簽的scope屬性,則必須指定var屬性。
例程1-10是使用<c:if>標(biāo)簽的一個演示例子程序。
例程1-10 ?c_if.jsp
?
?
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=gb2312" %>
<jsp:useBean id="user" class="org.it315.UserBean" />
<c:set value="${param.count}" target="${user}" property="visitCount" />
<c:if test="${user.visitCount == 1}">
? 這是您第一次訪問本網(wǎng)站,歡迎您!
</c:if>
?
?
在瀏覽器地址欄輸入如下地址訪問例程1-10:
? http://localhost:1010/JSTL/c_if.jsp?count=1
例程1-10的運行結(jié)果如圖1.1所示。
圖1.1
1.3.6? <c:choose>標(biāo)簽
<c:choose>標(biāo)簽用于指定多個條件選擇的組合邊界,它必須與<c:when> 和<c:otherwise>標(biāo)簽一起使用。使用<c:choose>,<c:when> 和<c:otherwise>三個標(biāo)簽,可以構(gòu)造類似 “if-else if-else” 的復(fù)雜條件判斷結(jié)構(gòu)。
<c:choose>標(biāo)簽沒有屬性,在它的標(biāo)簽體內(nèi)只能嵌套一個或多個<c:when>標(biāo)簽和0個或一 個<c:otherwise>標(biāo)簽,并且同一個<c:choose>標(biāo)簽中的所有<c:when>子標(biāo)簽必須出現(xiàn) 在<c:otherwise>子標(biāo)簽之前。如果<c:choose>標(biāo)簽內(nèi)嵌套一個<c:when>標(biāo)簽 和<c:otherwise>標(biāo)簽,就相當(dāng)于“if-else”的條件判斷結(jié)構(gòu);如果<c:choose>標(biāo)簽內(nèi)嵌套多 個<c:when>標(biāo)簽和一個<c:otherwise>標(biāo)簽,就相當(dāng)于“if-else if-else”標(biāo)簽。
<c:when>標(biāo)簽只有一個test屬性,該屬性的值為布爾類型。test屬性支持動態(tài)值,其值可以是一個條件表達式,如果條件表達 式的值為true,就執(zhí)行這個<c:when>標(biāo)簽體的內(nèi)容。<c:when>標(biāo)簽體的內(nèi)容可以是任意的JSP代 碼。<c:otherwise>標(biāo)簽沒有屬性,它必須作為<c:choose>標(biāo)簽的最后分支出現(xiàn)。
當(dāng)JSP頁面中使用<c:choose>標(biāo)簽時,嵌套在<c:choose>標(biāo)簽內(nèi)的test條件成立的第一 個<c:when>標(biāo)簽的標(biāo)簽體內(nèi)容將被執(zhí)行和輸出。當(dāng)且僅當(dāng)所有的<c:when>標(biāo)簽的test條件都不成立時,才執(zhí)行和輸 出<c:otherwise>標(biāo)簽的標(biāo)簽體內(nèi)容。如果所有的<c:when>標(biāo)簽的test條件都不成立,并 且<c:choose>標(biāo)簽內(nèi)沒有嵌套<c:otherwise>標(biāo)簽,則不執(zhí)行任何操作。
例程1-11是使用<c:choose>、<c:when>、<c:otherwise>標(biāo)簽的一個演示例子程序。
例程1-11 c_choose.jsp
?
?
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=gb2312" %>
<c:set value="${param.count}" var="count" />
<c:choose>
? <c:when test="${count == 0}">
???? 對不起,沒有符合您要求的記錄。
? </c:when>
? <c:otherwise>
???? 符合您要求的記錄共有${count}條.
? </c:otherwise>
</c:choose>
?
?
在瀏覽器地址欄輸入如下地址訪問例程1-11:
? http://localhost:1010/JSTL/c_choose.jsp?count=0
例程1-11的運行結(jié)果如圖1.9所示。如果將參數(shù)count的值修改為10,則運行結(jié)果如圖1.10所示。
?
?
圖1.9
圖1.10
?
例程1-12是一個綜合使用<c:if>標(biāo)簽和<c:choose>等標(biāo)簽的例子程序,在這個例子程序中,首先使 用<c:if>標(biāo)簽判斷表單提交的方式是否是POST,如果是,就再使用<c:choose>等標(biāo)簽根據(jù)表單提交的內(nèi)容進行不同 的處理。
例程1-12? c_customLogic.jsp
?
?
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:if test="${pageContext.request.method=='POST'}">
??? <c:choose>
???????? <c:when test="${param.favor == 'computer'}">
?????????????? Your favourite course is <b>computer</b>.
???????? </c:when>
???????? <c:otherwise>
?????????????? Your favourite course is <i>other</i>.
???????? </c:otherwise>
??? </c:choose>
</c:if>
<form method="POST">What is your favourite course?<br/>
<input type="text" name="favor" />
<input type="submit" value="submit" />
</form>
?
?
在瀏覽器地址欄中直接訪問c_customLogic.jsp的運行結(jié)果如圖1.11所示,在文本框中輸入“computer”,單擊其中的submit按鈕后的運行結(jié)果如圖1.12所示。
圖1.11
圖1.12
1.3.7? <c:forEach>標(biāo)簽
JSP頁面的顯示邏輯中也經(jīng)常需要對集合對象進行循環(huán)迭代操作,<c:forEach>標(biāo)簽用于對一個集合對象中的元素進行循環(huán)迭代操作,或者按指定的次數(shù)重復(fù)迭代執(zhí)行標(biāo)簽體中的內(nèi)容。<c:forEach>標(biāo)簽有兩種語法格式:
語法1,在集合對象中迭代:
<c:forEach [var="varName"]
? ?? ?? items="collection"
? ?? ?? [varStatus="varStatusName"]
? ?? ?? [begin="begin"] [end="end"] [step="step"]>
? body content
</c:forEach>
語法2,迭代固定的次數(shù):
<c:forEach [var="varName"]
??????? [varStatus="varStatusName"]
??????? begin="begin" end="end" [step="step"]>
? body content
</c:forEach>
<c:forEach>標(biāo)簽的屬性說明如表1.6所示。
表1.6? <c:forEach>標(biāo)簽的屬性
| 屬性名 | 是否支持EL | 屬性類型 | 屬 性 描 述 |
| var | false | String | 指定將當(dāng)前迭代到的元素保存到page這個Web域中的屬性名稱 |
| items | true | 任何支持的類型 | 將要迭代的集合對象 |
| varStatus | false | String | 指定將代表當(dāng)前迭代狀態(tài)信息的對象保存到page這個Web域中的屬性名稱 |
| begin | true | int | 如果指定items屬性,就從集合中的第begin個元素開始進行迭代,begin的索引值從0開始編號;如果沒有指定items屬性,就從begin指定的值開始迭代,直到end值時結(jié)束迭代 |
| end | true | int | 參看begin屬性的描述 |
| step | true | int | 指定迭代的步長,即迭代因子的迭代增量 |
?
在使用<c:forEach>標(biāo)簽時,需要注意如下幾點說明:
l? 如果指定begin屬性,其值必須大于或等于零;
l? 如果指定步長(step屬性),其值必須大于或等于1;
l? 如果items屬性的值為null,則要處理的集合對象為空,這時不執(zhí)行迭代操作;
l? 如果指定的begin屬性的值大于或等于集合對象的長度,不執(zhí)行迭代操作;
l? 如果指定的end屬性的值小于begin屬性的值,不執(zhí)行迭代操作;
?
<c:forEach>標(biāo)簽的items屬性的值支持下面的數(shù)據(jù)類型:
l? 任意類型的數(shù)組
l? java.util.Collection
l? java.util.Iterator
l? java.util.Enumeration
l? java.util.Map
l? String
items屬性還支持與數(shù)據(jù)庫有關(guān)的數(shù)據(jù)類型java.sql.ResultSet(包括javax.sql.RowSet),這 些數(shù)據(jù)類型將在1.5 節(jié)的數(shù)據(jù)庫標(biāo)簽中進行介紹。對字符串的迭代操作通常使用<c:forTokens>標(biāo)簽或JSTL函數(shù),例如fn:split和 fn:jion,JSTL函數(shù)將在1.7節(jié)進行介紹。
轉(zhuǎn)載于:https://www.cnblogs.com/forevernight/p/3498103.html
總結(jié)
- 上一篇: 【翻译】Pro.Silverlight.
- 下一篇: 面试题(转的)