JSTL 全名為Java Server Pages Standard Tag Library(JSP Standard Tag Library),它的中文名稱為JSP 標(biāo)準(zhǔn)標(biāo)簽函數(shù)庫。 Web 程序開發(fā)人員能夠利用JSTL和EL來開發(fā)Web 程序,取代傳統(tǒng)直接在頁面上嵌入Java程序(Scripting)的做法,以提高程序可讀性、維護(hù)性和方便性。 JSTL是一個標(biāo)準(zhǔn)的已制定好的標(biāo)簽庫,可以應(yīng)用于各種領(lǐng)域,如:基本輸入輸出、流程控制、循環(huán)、XML文件剖析、數(shù)據(jù)庫查詢及國際化和文字格式標(biāo)準(zhǔn)化的應(yīng)用等。JSTL所提供的標(biāo)簽函數(shù)庫主要分為五大類: (1)核心標(biāo)簽庫 (Core tag library) (2)I18N 格式標(biāo)簽庫 (I18N-capable formatting tag library) (3)SQL 標(biāo)簽庫 (SQL tag library) (4)XML 標(biāo)簽庫 (XML tag library) (5)函數(shù)標(biāo)簽庫 (Functions tag library)
若要在JSP 網(wǎng)頁中使用JSTL ,一定要先做下面這行聲明: < %@ taglib prefix="c" uri="http://java./jsp/jstl/core" %>
核心標(biāo)簽庫 (Core tag library) Core 標(biāo)簽庫,又被稱為核心標(biāo)簽庫,該標(biāo)簽庫的工作是對于 JSP 頁面一般處理的封裝。在該標(biāo)簽庫中的標(biāo)簽一共有 14 個,被分為了四類,分別是: q 通用核心標(biāo)簽: <c:out> 、 <c:set> 、 <c:remove> 、 <c:catch> 。 q 條件控制標(biāo)簽: <c:if> 、 <c:choose> 、 <c:when> 、 <c:otherwise> 。 q 循環(huán)控制標(biāo)簽: <c:forEach> 、 <c:forTokens> 。 q URL 相關(guān)標(biāo)簽: <c:import> 、 <c:url> 、 <c:redirect> 、 <c:param> 。 <c:out> <c:out>主要用來顯示數(shù)據(jù)的內(nèi)容,就像是 <%= scripting-language %> 一樣,例如:Hello ! <c:out value="${username}" /> 語法 語法1:沒有本體(body)內(nèi)容 <c:out value="value" [escapeXml="{true|false}"] [default="defaultValue"] /> 語法2:有本體內(nèi)容 <c:out value="value" [escapeXml="{true|false}"]> default value </c:out>
注意 表格中的EL字段,表示此屬性的值是否可以為EL 表達(dá)式,例如:Y表示 attribute = "${表達(dá)式}"為符合語法的,N 則反之。
Null 和錯誤處理 · 假若 value為null,會顯示default 的值;假若沒有設(shè)定default的值,則會顯示一個空 的字符串。 說明 一般來說,<c:out>默認(rèn)會將 <、>、’、” 和 & 轉(zhuǎn)換為 <、>、'、" 和 &。 假若不想轉(zhuǎn)換時,只需要設(shè)定<c:out>的escapeXml 屬性為fasle 就可以了。 范例 <c:out value="Hello JSP 2.0 !! " /> <c:out value="${ 3 + 5 }" /> <c:out value="${ param.data }" default="No Data" /> <c:out value="<p>有特殊字符</p>" /> <c:out value="<p>有特殊字符</p>" escapeXml="false" /> 1.在網(wǎng)頁上顯示 Hello JSP 2.0 !! ; 2.在網(wǎng)頁上顯示 8; 3.在網(wǎng)頁上顯示由窗體傳送過來的data 參數(shù)之值,假若沒有data 參數(shù),或data 參數(shù)的值為null 時,則網(wǎng)頁上會顯示No Data; 4.在網(wǎng)頁上顯示“<p>有特殊字符</p>”; 5.在網(wǎng)頁上顯示“有特殊字符”。
<c:set> <c:set>主要用來將變量儲存至JSP范圍中或是JavaBean的屬性中。 語法 語法1:將 value 的值儲存至范圍為scope 的 varName 變量之中 <c:set value="value" var="varName" [scope="{ page|request|session|application }"]/> 語法2:將本體內(nèi)容的數(shù)據(jù)儲存至范圍為scope 的 varName 變量之中 <c:set var="varName" [scope="{ page|request|session|application }"]> … 本體內(nèi)容 </c:set> 語法3:將 value 的值儲存至 target 對象的屬性中 < c:set value="value" target="target" property="propertyName" /> 語法4: 將本體內(nèi)容的數(shù)據(jù)儲存至 target 對象的屬性中 <c:set target="target" property="propertyName"> … 本體內(nèi)容 </c:set> 屬性
范例 <c:set var="number" scope="request" value="${1 + 1}" /> <c:set var="number" scope="session" /> ${3 + 5} </c:set> <c:set var="number" scope="request" value="${ param.number }" /> <c:set target="User" property="name" value="${ param.Username}" /> 1.將2 存入Request 范圍的number 變量中; 2.將8 存入Session 范圍的number 變量中;<c:set>是把本體(body)運算后的結(jié)果來當(dāng)做value的值。 3.假若 ${param.number}為null 時,則移除Request 范圍的number 變量;若${param.number}不為null 時,則將 ${param.number}的值存入Request 范圍的number 變量中; 4.假若 ${param.Username}為null 時,則設(shè)定User(JavaBean)的name 屬性為null;若不為 null 時,則將 ${param.Username}的值存入User(JavaBean)的name 屬性(setter 機制)。 注意 上述范例的3.中,假若 ${param.number}為null時,則表示移除Request范圍的number變量。 <c:remove> <c:remove>主要用來移除變量。 語法 <c:remove var="varName" [scope="{ page|request|session|application }"] /> 屬性
說明 <c:remove>必須要有var 屬性,即要被移除的屬性名稱,scope 則可有可無,例如: <c:remove var="number" scope="session" /> 將number 變量從Session 范圍中移除。若我們不設(shè)定scope,則<c:remove>將會從Page、 Request、Session 及Application 中順序?qū)ふ沂欠翊嬖诿Q為number 的數(shù)據(jù),若能找到時,則將它移除掉,反之則不會做任何的事情。 注意:當(dāng)不指定scope時,回remove掉從page到application的var指定的變量 <c:catch> <c:catch>主要用來處理產(chǎn)生錯誤的異常狀況,并且將錯誤信息儲存起來。 語法 <c:catch [var="varName"] > … 欲抓取錯誤的部分 </c:catch> 屬性
說明 <c:catch>主要將可能發(fā)生錯誤的部分放在<c:catch>和</c:catch>之間。如果真的發(fā)生錯 誤,可以將錯誤信息儲存至varName 變量中,例如: <c:catch var="message"> : //可能發(fā)生錯誤的部分 </c:catch> 另外,當(dāng)錯誤發(fā)生在<c:catch>和</c:catch>之間時,則只有<c:catch>和</c:catch>之間的程序 會被中止忽略,但整個網(wǎng)頁不會被中止。 <c:if> <c:if>的用途就和我們一般在程序中用的if 一樣。 語法 語法1:沒有本體內(nèi)容(body) <c:if test="testCondition" [var="varName"] [scope="{page|request|session|application}"]/> 語法2:有本體內(nèi)容 <c:if test="testCondition" [var="varName"] [scope="{page|request|session|application}"]> 具體內(nèi)容 </c:if> 屬性
<c:choose> <c:choose>本身只當(dāng)做 <c:when> 和 <c:otherwise> 的父標(biāo)簽。 語法 <c:choose> 本體內(nèi)容( <when> 和 <otherwise> ) </c:choose> 限制 <c:choose>的本體內(nèi)容只能有: ·空白 ·1 或多個 <c:when> ·0 或多個 <c:otherwise> 說明 若使用<c:when>和<c:otherwise>來做流程控制時,兩者都必須為<c:choose>的子標(biāo)簽. <c:when> <c:when>的用途就和我們一般在程序中用的when 一樣。 語法 <c:when test="testCondition" > 本體內(nèi)容 </c:when> 屬性
限制 ☆ <c:when>必須在<c:choose>和</c:choose>之間 ☆ 在同一個<c:choose>中時,<c:when>必須在<c:otherwise>之前 說明 <c:when>必須有test 屬性,當(dāng)test中的表達(dá)式結(jié)果為true時,則會執(zhí)行本體內(nèi)容;如果為 false時,則不會執(zhí)行。 <c:otherwise> 在同一個 <c:choose> 中,當(dāng)所有 <c:when> 的條件都沒有成立時,則執(zhí)行<c:otherwise> 的 本體內(nèi)容。 語法 <c:otherwise> 本體內(nèi)容 </c:otherwise>
<c:forEach> 為循環(huán)控制,它可以將集合(Collection)中的成員循序瀏覽一遍。運作方式為當(dāng) 條件符合時,就會持續(xù)重復(fù)執(zhí)行<c:forEach>的本體內(nèi)容。 語法1:迭代一集合對象之所有成員 <c:forEach [var="varName"] items="collection" [varStatus="varStatusName"] [begin="begin"][end="end"] [step="step"]> 本體內(nèi)容 < /c:forEach> 語法2:迭代指定的次數(shù) <c:forEach [var="varName"] [varStatus="varStatusName"] begin="begin" end="end" [step="step"]> 本體內(nèi)容 </c:forEach> 限制 ·假若有begin 屬性時,begin 必須大于等于 0 ·假若有end 屬性時,必須大于begin ·假若有step 屬性時,step 必須大于等于0 Null 和錯誤處理 ·假若items 為null 時,則表示為一空的集合對象 ·假若begin 大于或等于items 時,則迭代不運算
![]() <c:forEach>除了支持?jǐn)?shù)組之外,還有標(biāo)準(zhǔn)J2SE 的集合類型,例如:ArrayList、List、 ,但是當(dāng)沒有使用items 屬性時,就一定要使用begin 和end 這兩個屬性。
![]() 上述范例中,我們并沒有執(zhí)行瀏覽集合對象,只是設(shè)定begin 和end 屬性的值,這樣它就 begin主要用來設(shè)定在集合對象中開始的位置(注意:第一個位置為0);end 用來設(shè)定結(jié)束的位置;而step 則是用來設(shè)定現(xiàn)在指到的成員和下一個將被指到成員之間的間隔. 另外,<c:forEach>還提供varStatus 屬性,主要用來存放現(xiàn)在指到之成員的相關(guān)信息。例如: varStatus="s",那么將會把信息存放在名稱為s的屬性當(dāng)中。varStatus屬性還有另外四個屬性:index、count、first 和last,它們各自代表的意義如表:
我們可以使用varStatus 屬性取得循環(huán)正在瀏覽之成員的信息,下面為一個簡單的范例:
![]()
還有一個例子: 我要獲?。篽ttp://localhost:8080/t/index.jsp?a=123&b=256&com=297中的參數(shù)列表按如下: 鍵com:297 可以結(jié)合EL表單式實現(xiàn): <c:forEach items="${param}" var="b"> 鍵${b.key}:${b.value }<br/> </c:forEach>
<c:forTokens> <c:forTokens> 用來瀏覽一字符串中所有的成員,其成員是由定義符號(delimiters)所分隔的。 delims="delimiters" [var="varName"] [varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"]>
說明 <c:forTokens items="A,B,C,D,E" delims="," var="item" >
${item} </c:forTokens> 上面范例執(zhí)行后,將會在網(wǎng)頁中輸出ABCDE。它會把符號“,”當(dāng)做分割的標(biāo)記,拆成5 個部分,也就是執(zhí)行循環(huán)5 次,但是并沒有將A,B,C,D,E 中的“,”顯示出來。items 也可以放入EL 的表達(dá)式,如下: <%
String phoneNumber = "123-456-7899"; request.setAttribute("userPhone", phoneNumber); %> <c:forTokens items="${userPhone}" delims="-" var="item" > ${item} </c:forTokens> 這個范例將會在網(wǎng)頁上打印1234567899,也就是把123-456-7899以“-”當(dāng)做分割標(biāo)記,將字符串拆為 3 份,每執(zhí)行一次循環(huán)就將瀏覽的部分放到名稱為item 的屬性當(dāng)中。delims 不只指定一種字符來分割字符串,它還可以一次設(shè)定多個分割字符串用的字符。如下面這個范例: <c:forTokens items="A,B;C-D,E" delims=",;-" var="item" >
${item} </c:forTokens> 此范例會在網(wǎng)頁輸出ABCDE,也就是說,delims 可以一次設(shè)定所有想當(dāng)做分割字符串用的字符。其實用<c:forEach>也能做到分割字符串,寫法如下: <c:forEach items="A,B,C,D,E" var="item" >
${item} </c:forEach> 上述范例同樣也會在網(wǎng)頁輸出ABCDE。<c:forEach>并沒有delims這個屬性,因 此<c:forEach>無法設(shè)定分割字符串用的字符,而<c:forEach>分割字符串用的字符只有“,”,這和使 用<c:forTokens>,delims 屬性設(shè)為“,”的結(jié)果相同。所以如果使用<c:forTokens>來分割字符串,功能和彈性上會比使用<c:forEach> 來得較大 |
|