EL 表達式tag<%@ taglib prefix="c" uri="http://java./jsp/jstl/core" %>
分 類 功能分類 標簽名稱 Core 表達式操作 out set remove catch 流程控制 if choose when otherwise 迭代操作 forEach forTokens
分 類 功能分類 標簽名稱 Core URL操作 import param url redirect <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 類 型 必 須 默認值 value 需要顯示出來的值 Y Object 是 無 default 如果value的值為null,則顯示default的值 Y Object 否 無 escapeXml 是否轉(zhuǎn)換特殊字符,如:< 轉(zhuǎn)換成 < Y boolean 否 true 注意:假若value為null,會顯示default的值;假若沒有設定default的值,則會顯示一個空的字符串。 說明 一般來說,<c:out>默認會將 <、>、’、” 和 & 轉(zhuǎn)換為 <、>、'、" 和 &。假若不想轉(zhuǎn)換時,只需要設定<c:out>的escapeXml屬性為fasle就可以了(見表7-3)。 表7-3 字符 Entity < < > > ’ ' ” " & & 范例 <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+1的結(jié)果2儲存到number變量中。如果<c:set>沒有value屬性,此時value之值在<c:set>和</c:set>之間,本體內(nèi)容看下面的范例: <c:set var="number" scope="session"> <c:out value="${1+1}" /> </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變量中; 3. 假若 ${param.number}為null時,則移除Request范圍的number變量;若${param.number}不為null時,則將 ${param.number}的值存入Request范圍的number變量中; 4.假若 ${param.Username}為null時,則設定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 }"] /> 屬性 名 稱 說 明 EL 類型 必須 默認值 var 欲移除的變量名稱 N String 是 無 scope var變量的JSP范圍 N String 否 page 說明 <c:remove>必須要有var屬性,即要被移除的屬性名稱,scope則可有可無,例如: c:remove var="number" scope="session" /> 將number變量從Session范圍中移除。若我們不設定scope,則<c:remove>將會從Page、Request、Session及Application中順序?qū)ふ沂欠翊嬖诿Q為number的數(shù)據(jù),若能找到時,則將它移除掉,反之則不會做任何的事情。 范例 <%@ page contentType="text/html;charset=GB2312" %> <%@ taglib prefix="c" uri="http://java./jsp/jstl/core" %> <html> <head> <title>CH7 - Core_set_remove.jsp</title> </head> <body> <h2><c:out value="<c:set>和<c:remove> 的用法" /></h2> <c:set scope="page" var="number"> <c:out value="${1+1}"/> </c:set> <c:set scope="request" var="number"> <%= 3 %> </c:set> <c:set scope="session" var="number"> 4 </c:set> 初始設置 <table border="1" width="30%"> <tr> <th>pageScope.number</th> <td><c:out value="${pageScope.number}" default="No Data" /></td> </tr> <tr> <th>requestScope.number</th> <td><c:out value="${requestScope.number}" default="No Data" /></td>
</tr> <tr> <th>sessionScope.number</th> <td><c:out value="${sessionScope.number}" default="No Data" /></td> </tr> </table></br> <c:out value='<c:remove var="number" scope="page" />之后'/> <c:remove var="number" scope="page" /> <table border="1" width="30%"> <tr> <th>pageScope.number</th> <td><c:out value="${pageScope.number}" default="No Data" /></td> </tr> <tr> <th>requestScope.number</th> <td><c:out value="${requestScope.number}" default="No Data" /></td> </tr> <tr> <th>sessionScope.number</th> <td><c:out value="${sessionScope.number}" default="No Data" /></td> </tr> </table></br> <c:out value='<c:remove var="number" />之后'/> <c:remove var="number" /> <table border="1" width="30%"> <tr> <th>pageScope.number</th> <td><c:out value="${pageScope.number}" default="No Data" /></td> </tr> <tr> <th>requestScope.number</th> <td><c:out value="${requestScope.number}" default="No Data" /></td> </tr> <tr> <th>sessionScope.number</th> <td><c:out value="${sessionScope.number}" default="No Data" /></td> </tr> </table> </body> 一開始各在Page、Request和Session三個屬性范圍中儲存名稱為number的變量。然后先使用<c:remove var="number" scope="page" />把Page中的number變量移除,最后再使用<c:remove var="number" />把所有屬性范圍中number的變量移除。 <c:catch> <c:catch>主要用來處理產(chǎn)生錯誤的異常狀況,并且將錯誤信息儲存起來 語法 <c:catch [var="varName"] > … 欲抓取錯誤的部分 </c:catch> 屬性 名 稱 說 明 EL 類型 必須 默認值 var 用來儲存錯誤信息的變量 N String 否 無 說明 <c:catch>主要將可能發(fā)生錯誤的部分放在<c:catch>和</c:catch>之間。如果真的發(fā)生錯誤,可以將錯誤信息儲存至varName變量中,例如: <c:catch var="message"> : //可能發(fā)生錯誤的部分 </c:catch> 另外,當錯誤發(fā)生在<c:catch>和</c:catch>之間時,則只有<c:catch>和</c:catch>之間的程序會被中止忽略,但整個網(wǎng)頁不會被中止。 范例 <%@ page contentType="text/html;charset=GB2312 " %> <%@ taglib prefix="c" uri="http://java./jsp/jstl/core" %> <html> <head> <title>CH7 - Core_catch.jsp</title> </head> <body> <h2><c:out value="<c:catch> 的用法" /></h2> <c:catch var="error_Message"> <% String eFormat = "not number"; int i = Integer.parseInt(eFormat); %> </c:catch> ${error_Message} </body> 輸出結(jié)果 <c:catch>的用法 java.lang.NumberFormatException:For input string:"number" 如果把<c:catch>拿掉,會輸出如下 流程控制========================================== 流程控制分類中包含四個標簽:<c:if>、<c:choose>、<c:when>和<c:otherwise> <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> 屬性 名 稱 說 明 EL 類 型 必 須 默認值 test 如果表達式的結(jié)果為true,則執(zhí)行本體內(nèi)容,false則相反 Y boolean 是 無 var 用來儲存test運算后的結(jié)果,即true或false N String 否 無 scope var變量的JSP范圍 N String 否 page 說明 <c:if> 標簽必須要有test屬性,當test中的表達式結(jié)果為true時,則會執(zhí)行本體內(nèi)容;如果為false,則不會執(zhí)行。例如:${param.username = = 'admin'},如果param.username等于admin時,結(jié)果為true;若它的內(nèi)容不等于admin時,則為false。 接下來看下列的范例: <c:if test="${param.username = = 'admin' }"> ADMIN您好!! //body部分 </c:if> 如果名稱等于admin,則會顯示"ADMIN您好!! "的動作,如果相反,則不會執(zhí)行<c:if>的body部分,所以不會顯示"ADMIN您好!! //body部分"。另外<c:if>的本體內(nèi)容除了能放純文字,還可以放任何JSP程序代碼(Scriptlet)、JSP 標簽或者HTML碼。 除了test屬性之外,<c:if>還有另外兩個屬性var和scope。當我們執(zhí)行<c:if>的時候,可以將這次判斷后的結(jié)果存放到屬性var里;scope則是設定var的屬性范圍。哪些情況才會用到var和scope這兩個屬性呢?例如:當表達式過長時,我們會希望拆開處理,或是之后還須使用此結(jié)果時,也可以用它先將結(jié)果暫時保留,以便日后使用。 流程控制待續(xù) 迭代操作========================================== 迭代(Iterate)操作主要包含兩個標簽:<c:forEach>和<c:forTokens> <c:forEach> <c:forEach> 為循環(huán)控制,它可以將集合(Collection)中的成員循序瀏覽一遍。運作方式為當條件符合時,就會持續(xù)重復執(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> 屬性 名 稱 說 明 EL 類型 必須 默認值 var 用來存放現(xiàn)在指到的成員 N String 否 無 items 被迭代的集合對象 Y Arrays Collection Iterator Enumeration Map String 否 無 varStatus 用來存放現(xiàn)在指到的相關(guān)成員信息 N String 否 無 begin 開始的位置 Y int 否 0 end 結(jié)束的位置 Y int 否 最后一個成員 step 每次迭代的間隔數(shù) Y int 否 1 限制 ·假若有begin屬性時,begin必須大于等于 0 ·假若有end屬性時,必須大于begin 范例 String atts[] = new String [5]; atts[0]="hello"; atts[1]="this"; atts[2]="is"; atts[3]="a"; atts[4]="pen"; request.setAttribute("atts", atts); %> <c:forEach items="${atts}" var="item" begin="1" end="4" step="2" > ${item}</br> </c:forEach> </body> <c:forEach>中指定的集合對象atts將會從第2個成員開始到第5個成員,并且每執(zhí)行一次循環(huán)都會間隔一個成員瀏覽。因此結(jié)果是只顯示atts[1]和atts[3]的內(nèi)容 另外,<c:forEach>還提供varStatus屬性,主要用來存放現(xiàn)在指到之成員的相關(guān)信息。例如:我們寫成varStatus="s",那么將會把信息存放在名稱為s的屬性當中。varStatus屬性還有另外四個屬性:index、count、first和last,它們各自代表的意義如下 屬 性 類 型 意 義 index number 現(xiàn)在指到成員的索引 count number 總共指到成員的總數(shù) first boolean 現(xiàn)在指到的成員是否為第一個成員 last boolean 現(xiàn)在指到的成員是否為最后一個成員 我們可以使用varStatus屬性取得循環(huán)正在瀏覽之成員的信息,下面為一個簡單的范例 <%@ page contentType="text/html;charset=GB2312" %> <%@ taglib prefix="c" uri="http://java./jsp/jstl/core" %> <html> <head> <title>CH7 - Core_forEach3.jsp</title> </head> <body> <h2><c:out value="<c:forEach> varStatus 的四種屬性" /></h2> <% String atts[] = new String [5]; atts[0]="hello"; atts[1]="this"; atts[2]="is"; atts[3]="a"; atts[4]="pen"; request.setAttribute("atts", atts); %> <c:forEach items="${atts}" var="item"varStatus="s"> <h2><c:out value="${item}"/>的四種屬性:</h2> index:${s.index}</br> count:${s.count}</br> first:${s.first}</br> last:${s.last}</br> </c:forEach> </body> </html> <c:forTokens> <c:forTokens> 用來瀏覽一字符串中所有的成員,其成員是由定義符號(delimiters)所分隔的。 語法 <c:forTokens items="stringOfTokens" delims="delimiters" [var="varName"] [varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"]> 本體內(nèi)容 </c:forTokens> 屬性 說明 <c:forTokens>的begin、end、step、var和varStatus用法都和<c:forEach>一樣,因此,筆者在這里就只介紹items和delims兩個屬性:items的內(nèi)容必須為字符串;而delims是用來分割items中定義的字符串之字符。 范例 <c:forTokens items="A,B,C,D,E" delims="," var="item" > ${item} </c:forTokens> 上面范例執(zhí)行后,將會在網(wǎng)頁中輸出ABCDE。它會把符號“,”當做分割的標記,拆成5個部分,也就是執(zhí)行循環(huán)5次,但是并沒有將A,B,C,D,E中的“,”顯示出來。items也可以放入EL的表達式,如下: <% 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以“-”當做分割標記,將字符串拆為3份,每執(zhí)行一次循環(huán)就將瀏覽的部分放到名稱為item的屬性當中。delims不只指定一種字符來分割字符串,它還可以一次設定多個分割字符串用的字符。如下面這個范例: <c:forTokens items="A,B;C-D,E" delims=",;-" var="item" > ${item} </c:forTokens> 此范例會在網(wǎng)頁輸出ABCDE,也就是說,delims可以一次設定所有想當做分割字符串用的字符。其實用<c:forEach>也能做到分割字符串,寫法如下 <c:forEach items="A,B,C,D,E" var="item" > ${item} </c:forEach> 上述范例同樣也會在網(wǎng)頁輸出ABCDE。<c:forEach>并沒有delims這個屬性,因此<c:forEach>無法設定分割字符串用的字符,而<c:forEach>分割字符串用的字符只有“,”,這和使用<c:forTokens>,delims屬性設為“,”的結(jié)果相同。所以如果使用<c:forTokens>來分割字符串,功能和彈性上會比使用<c:forEach>來得較大。 URL操作 ============================================================= JSTL包含三個與URL操作有關(guān)的標簽,它們分別為:<c:import>、<c:redirect>和<c:url>。它們主要的功能是:用來將其他文件的內(nèi)容包含起來、網(wǎng)頁的導向,還有url的產(chǎn)生 <c:import>也支持FTP協(xié)議,假設現(xiàn)在有一個FTP站臺,地址為ftp.javaworld.com.tw,它里面有一個文件data.txt,那么可以寫成如下方式將其內(nèi)容顯示出來: <c:import url="ftp://ftp.cse.yzu.edu.tw/data.txt" /> 如果是使用相對地址,假設存在一個文件名為Hello.jsp,它和使用<c:import>的網(wǎng)頁存在于同一個webapps的文件夾時,<c:import>的寫法如下: <c:import url="Hello.jsp" /> 如果以“/”開頭,那么就表示跳到web站臺的根目錄下,以Tomcat為例,即webapps目錄。假設一個文件為hello.txt,存在于webapps/examples/images里,而context為examples,可以寫成以下方式將hello.txt文件包含進我們的JSP頁面之中: <c:import url="images/hello.txt" /> 接下來如果要包含在同一個服務器上,但并非同一個web站臺的文件時,就必須加上context屬性。假設此服務器上另外還有一個web站臺,名為others,others站臺底下有一個件夾為jsp,且里面有index.html這個文件,那么就可以寫成如下方式將此文件包含進來: 文 <c:import url="/jsp/index.html" context="/others" />
注意 被包含文件的web站臺必須在server.xml中定義過,且<Context>的crossContext屬性值必須為true,這樣一來,others目錄下的文件才可以被其他 web站臺調(diào)用。 erver.xml的設定范例如下: s : <Context path="/others" docBase="others" debug="0" reloadable="true" crossContext="true"/> : 除此之外,<c:import>也提供var和scope屬性。當var屬性存在時,雖然同樣會把其他文件的內(nèi)容包含進來,但是它并不會輸出至網(wǎng)頁上,而是以String的類型儲存至varName中。scope則是設定varName的范圍。儲存之后的數(shù)據(jù),我們在需要用時,可以將它取出來,代碼如下: <c:import url="/images/hello.txt" var="s" scope="session" /> 我們可以把常重復使用的商標、歡迎語句或者是版權(quán)聲明,用此方法儲存起來,想輸出在網(wǎng)頁上時,再把它導入進來。假若想要改變文件內(nèi)容時,可以只改變被包含的文件,不用修改其他網(wǎng)頁。 另外,可以在<c:import>的本體內(nèi)容中使用<c:param>,它的功用主要是:可以將參數(shù)傳遞給被包含的文件,它有兩個屬性name和value,如表 名 稱 說 明 EL 類 型 必 須 默認值 name 參數(shù)名稱 Y String 是 無 value 參數(shù)的值 Y String 否 本體內(nèi)容 這兩個屬性都可以使用EL,所以我們寫成如下形式: <c:import url="http://java." > <c:param name="test" value="1234" /> </c:import> 這樣的做法等于是包含一個文件,并且所指定的網(wǎng)址會變成如下: 范例 下面為一用到<c:import>、<c:param>及屬性范圍的范例 Core_import.jsp <%@ page contentType="text/html;charset=GB2312" %> <%@ taglib prefix="c" uri="http://java./jsp/jstl/core" %> <html> <head> <title>CH7 - Core_import.jsp</title> </head> <body> <h2><c:out value="<c:import> 的用法" /></h2> <c:set var="input1" value="使用屬性范圍傳到Core_imported.jsp中" scope="request"/>包含core_imported.jsp中<hr/> <c:import url="Core_imported.jsp"charEncoding="GB2312" > <c:param name="input2" value="使用<c:param>傳到Core_imported.jsp中"/> </c:import><hr/> ${output1} </body> </html> 程序中,分別使用<c:set>和<c:param>來傳遞參數(shù)。 Core_imported.jsp <%@ page contentType="text/html;charset=GB2312" %> <%@ taglib prefix="c" uri="http://java./jsp/jstl/core" %> <%@ taglib prefix="fmt" uri="http://java./jsp/jstl/fmt" %> <html> <head> <title>CH7 - Core_imported.jsp</title> </head> <body> <fmt:requestEncoding value="GB2312" /> <c:set var="output1" value="使用屬性范圍傳到Core_import.jsp中" scope="request"/> ${input1}</br> <c:out value="${param.input2}" escapeXml="true" /> </body> </html> Core_imported.jsp是被包含的文件,它會把從Core_import.jsp傳來的參數(shù)分別輸出到頁面上,必須注意的是input1參數(shù)是使用屬性范圍來傳遞的,因此可以直接用${input1}來得到參數(shù),而input2則必須使用${param.input2}來得到參數(shù)。 此外,筆者還使用<c:set>來傳遞值給Core_import.jsp,這就是<c:param>無法做到的動作,<c:param>只能從包含端拋給被包含端,但是在屬性范圍中,可以讓包含端也能得到被包含端傳來的數(shù)據(jù) Core_import.jsp的執(zhí)行結(jié)果如圖 待續(xù)。。。。。。。。 |
|