作者:禪樓望月
1 安裝JSTL1.1①需要將"jstl.jar"和"standard.jar"放在Web應(yīng)用的WEB-INF/lib目錄中。
②jsp頁面引用JSTL標(biāo)準(zhǔn)標(biāo)簽 <%@taglibjava.sun.com/jsp/jstl/core"%> ,若uri不知道是什么,則可以打開/java Resources/Libraies/web App Librarues目錄下的standars.jar包下META-INF目錄下c.tld(xml文件)里面查找,如圖所示:

③最后在頁面直接使用JSTL標(biāo)準(zhǔn)標(biāo)簽庫(kù)。
2 <c:out>用來顯示一個(gè)表達(dá)式的結(jié)果,與<%= %>作用相似。
<c:out>標(biāo)簽有如下屬性:
| 屬性 | 描述 | 是否必要 | 默認(rèn)值 |
|---|---|---|---|
| value | 要輸出的內(nèi)容 | 是 | 無 |
| default | 輸出的默認(rèn)值 | 否 | 主體中的內(nèi)容 |
| escapeXml | 是否忽略XML特殊字符 | 否 | true |
①顯式地聲明轉(zhuǎn)換XML實(shí)體

1 <div>2 <b>Tip of the Day:</b><br/><br/>3 <c:outvalue="${pageContent.rawHTML}"escapeXml="true"/>4 </div>View Code
②顯式地聲明不轉(zhuǎn)換XML實(shí)體
將escapeXml設(shè)置為false即可。
escapeXml默認(rèn)值為true。
以下5種字符需要轉(zhuǎn)換
字符 | < | > | & | ' | " |
字符實(shí)體碼 | < | > | & | & | " |
<c:out value="<hr>原樣輸出HTML標(biāo)簽<hr>" escapeXml="true"/><br> <c:out value="<hr>轉(zhuǎn)換HTML標(biāo)簽并輸出<hr>" escapeXml="false"/>


使用EL輸出用戶輸入的內(nèi)容會(huì)存在"跨域攻擊"的危險(xiǎn)
跨域攻擊是指,一個(gè)用戶使用你的web應(yīng)用作為傳輸機(jī)制向另一個(gè)用戶的web瀏覽器發(fā)動(dòng)攻擊。
用<c:out>則可以避免這種情況。
2.1 NULL值的處理EL遇到NULL值什么也不會(huì)打印。但是<c:out>可以設(shè)置默認(rèn)值:
value值為NULL時(shí),默認(rèn)值
<c:out value="${null }"default="houhou"></c:out><br>3 循環(huán)<c:forEach><c:forEach>標(biāo)簽有如下屬性:
| 屬性 | 描述 | 是否必要 | 默認(rèn)值 |
|---|---|---|---|
| items | 要被循環(huán)的信息 | 否 | 無 |
| begin | 開始的元素(0=第一個(gè)元素,1=第二個(gè)元素) | 否 | 0 |
| end | 最后一個(gè)元素(0=第一個(gè)元素,1=第二個(gè)元素) | 否 | Last element |
| step | 每一次迭代的步長(zhǎng) | 否 | 1 |
| var | 代表當(dāng)前條目的變量名稱 | 否 | 無 |
| varStatus | 代表循環(huán)狀態(tài)的變量名稱 | 否 | 無 |
Servlet中:

1 package jstl; 2 import java.io.IOException; 3 import javax.servlet.*; 4 import javax.servlet.http.*; 5 public class jstlServlet extendsHttpServlet{ 6 public void doGet(HttpServletRequest request,HttpServletResponse response) 7 throwsServletException,IOException{ 8 response.setContentType("text/html"); 9 String[] movieList={"A","B","C"};10 request.setAttribute("movieList", movieList);11 getServletContext().getRequestDispatcher("/UseJSTL.jsp").forward(request, response);12 }13 publicvoid doPost(HttpServletRequest request,HttpServletResponse response)14 throwsServletException,IOException{15 doGet(request, response);16 }17 }View CodeJSP中:

1 <%@ page language="java"import="java.util.*" pageEncoding="utf-8" %> 2 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 </head> 7 <body> 8 <table> 9 <c:forEachvar="movie"items="${movieList }">10 <tr>11 <td>${movie }</td>12 </tr>13 </c:forEach>14 </table>15 </body>16 </html>View Code打印出的結(jié)果:


還可用一個(gè)可選屬性(varStatus)得到計(jì)數(shù)器

1 <tablestyle="border:solid 1px red">2 <c:forEachvar="movie"items="${movieList }"varStatus="movieLoopCount">3 <tr>4 <tdstyle="border:solid 1px red">${movie}</td>5 <tdstyle="border:solid 1px red">count:${movieLoopCount.count }</td>6 </tr>7 </c:forEach>8 </table>View Code

<c:forEach>可以嵌套,如:
Servlet中:

JSP中:

關(guān)于步長(zhǎng):

還可以有begin和end屬性來選取集合的一個(gè)子集。
對(duì)map和set的迭代:

4 <c:iftest=""> 沒有else的if<c:if>標(biāo)簽有如下屬性:
| 屬性 | 描述 | 是否必要 | 默認(rèn)值 |
|---|---|---|---|
| test | 條件 | 是 | 無 |
| var | 用于存儲(chǔ)條件結(jié)果的變量 | 否 | 無 |
| scope | var屬性的作用域 | 否 | page |


判斷不為空
該標(biāo)簽沒有else屬性。那么怎么來表示if……else……呢?5 <c:choose> 代替if……else…… <c:choose>標(biāo)簽沒有屬性。
<c:when>標(biāo)簽只有一個(gè)屬性,在下表中有給出。
<c:otherwise>標(biāo)簽沒有屬性。
<c:when>標(biāo)簽的屬性如下:
| 屬性 | 描述 | 是否必要 | 默認(rèn)值 |
|---|---|---|---|
| test | 條件 | 是 | 無 |

<c:choose>可以沒有<c:otherwise>
<c:set>標(biāo)簽有如下屬性:
| 屬性 | 描述 | 是否必要 | 默認(rèn)值 |
|---|---|---|---|
| value | 要存儲(chǔ)的值 | 否 | 主體的內(nèi)容 |
| target | 要修改的屬性所屬的對(duì)象 | 否 | 無 |
| property | 要修改的屬性 | 否 | 無 |
| var | 存儲(chǔ)信息的變量 | 否 | 無 |
| scope | var屬性的作用域 | 否 | Page |
<jsp:setProperty> 只能設(shè)置bean的屬性。但是<c:set>可以設(shè)置任何東西的值。
<c:set> 有兩版本:① var 版本,用來設(shè)置屬性變量;②target 版本,用來bean性質(zhì)或Map值,但是不能用來向數(shù)組或列表中增加元素。
① var 版本
<c:setvar=""scope=""value=""/> 使用var來定義變量。

②target 版本

<c:set> 要點(diǎn)
7 <c:remove> 移除一個(gè)變量①不能同時(shí)有var和target。
②scope是可選的,默認(rèn)值為頁面(page)作用域,即,沒有scope時(shí),只會(huì)在頁面(page)作用域中查找。
③如果value為null,則var指定的屬性將被刪除
④若var屬性不存在,則會(huì)創(chuàng)建一個(gè)新屬性,但僅當(dāng)value不為null時(shí)才會(huì)創(chuàng)建新屬性。
⑤若target表達(dá)式為null,容器拋異常。
⑥若target表達(dá)式不是bean或map,容器拋異常。
⑦若target表達(dá)式是一個(gè)bean,但是這個(gè)bean沒有與property匹配的屬性,容器拋異常。EL表達(dá)式${bean.notAProperty}也會(huì)拋異常
<c:remove>標(biāo)簽有如下屬性:
| 屬性 | 描述 | 是否必要 | 默認(rèn)值 |
|---|---|---|---|
| var | 要移除的變量名稱 | 是 | 無 |
| scope | 變量所屬的作用域 | 否 | 所有作用域 |
<c:import>標(biāo)簽有如下屬性:
| 屬性 | 描述 | 是否必要 | 默認(rèn)值 |
|---|---|---|---|
| url | 需要檢索和引入的頁面的URL | 是 | 無 |
| context | / 緊接著一個(gè)本地網(wǎng)絡(luò)應(yīng)用程序的名稱 | 否 | 當(dāng)前應(yīng)用程序 |
| charEncoding | 所引入的數(shù)據(jù)的字符編碼集 | 否 | ISO-8859-1 |
| var | 用于存儲(chǔ)所引入的文本的變量 | 否 | Print to page |
| scope | var屬性的作用域 | 否 | Page |
| varReader | 可選的用于提供java.io.Reader對(duì)象的變量 | 否 | 無 |
第一種:靜態(tài)導(dǎo)入<%@include file="/index.jsp"%>
第二種:動(dòng)態(tài)導(dǎo)入<jsp:includepage="index.jsp"/>
第三種:動(dòng)態(tài)導(dǎo)入<c:importurl="http://www.baidu.com"/>
在請(qǐng)求時(shí)將URL屬性值制定的內(nèi)容增加到當(dāng)前頁面。與<jsp:include>非常相似但是功能更加強(qiáng)大。前兩種被被包含的頁面不能超出本站范圍,但是<c:import可以。
也可以利用<c:param傳參數(shù)。
9 強(qiáng)大的<c:url><c:param>可以滿足所有超鏈接需求<c:param>標(biāo)簽用于在<c:url>標(biāo)簽中指定參數(shù),而且與URL編碼相關(guān)。
在<c:param>標(biāo)簽內(nèi),name屬性表明參數(shù)的名稱,value屬性表明參數(shù)的值。
<c:param>標(biāo)簽有如下屬性:
| 屬性 | 描述 | 是否必要 | 默認(rèn)值 |
|---|---|---|---|
| name | URL中要設(shè)置的參數(shù)的名稱 | 是 | 無 |
| value | 參數(shù)的值 | 否 | Body |
<c:url>標(biāo)簽有如下屬性:
| 屬性 | 描述 | 是否必要 | 默認(rèn)值 |
|---|---|---|---|
| value | 基礎(chǔ)URL | 是 | 無 |
| context | 本地網(wǎng)絡(luò)應(yīng)用程序的名稱 | 否 | 當(dāng)前應(yīng)用程序 |
| var | 代表URL的變量名 | 否 | Print to page |
| scope | var屬性的作用域 | 否 | Page |
<c:url>可以自動(dòng)實(shí)現(xiàn)URL重寫。
Servlet的URL重寫:

JSP的URL重寫:

URL編碼:
URL通常需要編碼。意思是,把不安全/保留的字符替換為其他字符,然后再在服務(wù)器端完成解碼。
例子:
加入U(xiǎn)RL中不能包含空格,但是可用一個(gè)+“+”來代替。
<c:url>不會(huì)自動(dòng)對(duì)URL編碼。
10 說說錯(cuò)誤頁面在無法保證一個(gè)錯(cuò)誤都沒有的情況下,更友好的解決方式是建立一個(gè)錯(cuò)誤響應(yīng)頁面,然后使用page指令配置錯(cuò)誤頁面。
①設(shè)計(jì)一個(gè)錯(cuò)誤響應(yīng)頁面:

②為有可能出現(xiàn)錯(cuò)誤的頁面配置錯(cuò)誤頁面:

問題來了---->我是不是得花很大的功夫?yàn)槊恳粋€(gè)jsp配置錯(cuò)誤頁面呢?如果想為不同的錯(cuò)誤制定不同的錯(cuò)誤頁面怎辦呢?
在DD中可以根據(jù)<exception-type>或HTTP狀態(tài)碼<error-code>聲明錯(cuò)誤頁面。
聲明一個(gè)“普通”型錯(cuò)誤頁面。

這樣就為整個(gè)Web應(yīng)用中所有部分設(shè)置了默認(rèn)的錯(cuò)誤頁面。

當(dāng)要為單個(gè)JSP設(shè)置一個(gè)特定的錯(cuò)誤頁面,在該JSP的page指令的errorPage屬性覆蓋這個(gè)設(shè)置即可。
為更明確的一個(gè)異常聲明錯(cuò)誤頁面。

根據(jù)一個(gè)HTTP狀態(tài)碼聲明錯(cuò)誤頁面

當(dāng)一個(gè)頁面聲明為錯(cuò)誤頁面時(shí),該頁面立即得到一個(gè)其他頁面沒有的對(duì)象:exception

自己能通過程序生成錯(cuò)誤碼嗎?
可以!!!調(diào)用HttpServletResponse的sendError方法,它會(huì)告訴容器生成錯(cuò)我,就好像是容器自己生成的一樣。如果已經(jīng)根據(jù)這個(gè)錯(cuò)誤碼配置了一個(gè)要發(fā)送給客戶端的錯(cuò)誤頁面,客戶就會(huì)得到這個(gè)錯(cuò)誤頁面。錯(cuò)誤碼也成為狀態(tài)碼,他們指的是同一個(gè)東西。
11 JSP的異常捕捉<c:catch>相當(dāng)于try塊(注意沒有catch塊)<c:catch>標(biāo)簽有如下屬性:
| 屬性 | 描述 | 是否必要 | 默認(rèn)值 |
|---|---|---|---|
| var | 用來儲(chǔ)存錯(cuò)誤信息的變量 | 否 | None |
應(yīng)該將有風(fēng)險(xiǎn)的EL或標(biāo)記調(diào)用(或其他部分)包在的<c:catch>體中。異常就會(huì)在這里被捕獲。一旦有異常發(fā)生,控制就會(huì)跳至<c:catch>標(biāo)記體的后面。

在<c:catch>標(biāo)記結(jié)束后訪問異常該怎么辦?

正確的做法是:

<c:forTokens>標(biāo)簽與<c:forEach>標(biāo)簽有相似的屬性,不過<c:forTokens>還有另一個(gè)屬性:
| 屬性 | 描述 | 是否必要 | 默認(rèn)值 |
|---|---|---|---|
| delims | 分隔符 | 是 | 無 |
13 <c:redirect>重定向c:redirect標(biāo)簽有如下屬性:
| 屬性 | 描述 | 是否必要 | 默認(rèn)值 |
|---|---|---|---|
| url | 目標(biāo)URL | 是 | 無 |
| context | 緊接著一個(gè)本地網(wǎng)絡(luò)應(yīng)用程序的名稱 | 否 | 當(dāng)前應(yīng)用程序 |
<c:redirect url="http://www.w3cschool.cc"/>14 理解TLD
TLD描述了兩個(gè)主要的內(nèi)容:定制標(biāo)記和EL函數(shù)。EL函數(shù)我們?cè)贓L中已經(jīng)講過了。

怎么知道屬性的類型呢?
<attribute>有一個(gè)可選屬性,<type>它取一個(gè)完全限定類名作為類型。
標(biāo)記體<body-content>里面能放什么內(nèi)容呢?
可以放4種內(nèi)容:
①empty:這個(gè)標(biāo)記不能有體。
②scriptless:這個(gè) 標(biāo)記不能有腳本元素,但可以是模板文本和EL,還可以是定制和標(biāo)準(zhǔn)動(dòng)作。
③tagdependent:標(biāo)記體要看作是純文本,所以不會(huì)計(jì)算EL,也不會(huì)觸發(fā)標(biāo)記/動(dòng)作。
④JSP:能在放在JSP中的東西都能放在這里。
對(duì)于<body-content>內(nèi)容為empty,我們?cè)趺凑{(diào)用標(biāo)記?有3種方法:
①標(biāo)記以斜線"/"結(jié)尾,省略結(jié)束標(biāo)記。
②在開始標(biāo)記和結(jié)束標(biāo)記之間不要放任何內(nèi)容。
③在開始標(biāo)記和結(jié)束標(biāo)記之間放<jsp:attribute>標(biāo)記
容器在那些地方查找TLD呢?在4個(gè)位置查找:
15 實(shí)現(xiàn)一個(gè)定制標(biāo)記處理器①直接在WEB-INF目錄中查找。
②直接在WEB-INF的一個(gè)子目錄中查找
③在WEB-INF/lib下一個(gè)JAR文件中的META-INF中查找。
④在WEB-INF/lib下一個(gè)JAR文件中的META-INF目錄中的子目錄中查找。
首先我們建立一個(gè)TLD,設(shè)置我們自定義的標(biāo)簽:

1 <?xml version="1.0" encoding="ISO-8859-1"?> 2 <!DOCTYPE taglib 3 PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" 4 "http://java.sun.com/j2ee/dtd/web-jsptaglibrary_1_2.dtd"> 5 <taglib> 6 <tlib-version>1.0</tlib-version> 7 <jsp-version>1.2</jsp-version> 8 <short-name>RandomTags</short-name> 9 <uri>randomThings</uri>10 <description>11 A simple tab library for the examples12 </description>13 <tag>14 <name>advice</name>15 <tag-class>jstl.AdvisorTagHandler</tag-class>16 <body-content>empty</body-content>17 <description>18 random advice19 </description>20 <attribute>21 <name>user</name>22 <required>true</required>23 <rtexprvalue>true</rtexprvalue>24 </attribute>25 </tag>26 </taglib>View Code
完成工作的Java類:

注意:再采用EL函數(shù)時(shí),要?jiǎng)?chuàng)建一個(gè)有公共靜態(tài)方法的Java類,并且該方法的名字可以自己取,再在TLD中映射即可,但是在利用定制標(biāo)記是,該方法名不能自定義,只能是doTag。
判斷是否為空或是否為null
16. JSTL 判斷對(duì)象是否為空<C:IF 判斷對(duì)象或集合是否為空判斷集合和對(duì)象是否為空:
list為集合,user為對(duì)象名

1 <c:if test="${empty user}">無user信息!TODO...</c:if>為空2 <c:if test="${!empty list}">list集合不為空判斷,TODO...</c:if>非空View Code<S:IF 判斷對(duì)象是否為空
1 <s:if test="null==user||user.isEmpty()">2 集合為空3 </s:if><s:else>4 集合不為空5 </s:else>View Code
或者

1 <s:if test="null!=user&&!user.isEmpty()">2 集合不為空3 </s:if>View Code
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注