日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

EL 表達式tag - 遲卻懂的日志 - 網(wǎng)易博客

 西門獨孤 2011-01-14

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)址會變成如下:

http://java.?test=1234   

范例

下面為一用到<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ù)。。。。。。。。

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多