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