閱讀298 返回首頁    go 阿裏雲 go 技術社區[雲棲]


JSTL-核心標簽庫

JSTL 全名為Java Server Pages Standard Tag LibraryJSP Standard Tag Library,它的中文名稱為JSP標準標簽函數庫。 Web 程序開發人員能夠利用JSTLEL來開發Web程序,取代傳統直接在頁麵上嵌入Java程序(Scripting)的做法,以提高程序可讀性、維護性和方便性。 

 

JSTL是一個標準的已製定好的標簽庫,可以應用於各種領域,如:基本輸入輸出、流程控製、循環、XML文件剖析、數據庫查詢及國際化和文字格式標準化的應用等。

JSTL所提供的標簽函數庫主要分為五大類:

1)核心標簽庫(Core tag library)

2I18N格式標簽庫 (I18N-capable formatting tag library)

3SQL標簽庫 (SQL tag library)

4XML標簽庫 (XML tag library)

5)函數標簽庫(Functions tag library)

 

JSTL

前綴

URI

核心標簽庫

c

https://java.sun.com/jsp/jstl/core

I18N格式標簽庫

fmt

https://java.sun.com/jsp/jstl/xml

SQL標簽庫

sql

https://java.sun.com/jsp/jstl/sql

XML標簽庫

xml

https://java.sun.com/jsp/jstl/fmt

函數標簽庫

fn

https://java.sun.com/jsp/jstl/functions


若要在JSP網頁中使用JSTL,一定要先做下麵這行聲明:

<%@ taglib prefix="c" uri="https://java.sun.com/jsp/jstl/core" %> 

 

核心標簽庫(Core tag library)


Core 標簽庫,又被稱為核心標簽庫,該標簽庫的工作是對於 JSP 頁麵一般處理的封裝。在該標簽庫中的標簽一共有 14 個,被分為了四類,分別是:

q        通用核心標簽:<c:out><c:set><c:remove><c:catch>

q        條件控製標簽:<c:if><c:choose><c:when> <c:otherwise>

q        循環控製標簽:<c:forEach><c:forTokens>

q        URL相關標簽:<c:import><c:url><c:redirect><c:param>

 

<c:out>

<c:out>主要用來顯示數據的內容,就像是<%= scripting-language %> 一樣,例如:Hello ! <c:out value="${username}" />

語法

語法1:沒有本體(body)內容

<c:out value="value" [escapeXml="{true|false}"] [default="defaultValue"] />

語法2:有本體內容

<c:out value="value" [escapeXml="{true|false}"]>

default value

</c:out>

屬性名稱

說明

EL

類型

必須

默認值

value

需要顯示出來的值

Y

Object

default

如果value的值為null則顯示default的值

Y

Object

escapeXml

是否轉換特殊字符,如:<轉換成&lt;

Y

boolean

true

 

注意

表格中的EL字段,表示此屬性的值是否可以為EL表達式,例如:Y表示attribute = "${表達式}"為符合語法的,N則反之。

 

Null 和錯誤處理

假若 valuenull,會顯示default的值;假若沒有設定default的值,則會顯示一個空的字符串。

說明

一般來說,<c:out>默認會將<>、’、” 和& 轉換為 &lt;&gt;&#039;&#034;&amp;

假若不想轉換時,隻需要設定<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.在網頁上顯示Hello JSP 2.0 !!

2.在網頁上顯示8

3.在網頁上顯示由窗體傳送過來的data參數之值,假若沒有data參數,或data參數的值為null時,則網頁上會顯示No Data

4.在網頁上顯示“<p>有特殊字符</p>”;

5.在網頁上顯示“有特殊字符”。

 

 

<c:set>

<c:set>主要用來將變量儲存至JSP範圍中或是JavaBean的屬性中。

語法

語法1:將value 的值儲存至範圍為scopevarName變量之中

<c:set value="value" var="varName" [scope="{ page|request|session|application }"]/>

語法2:將本體內容的數據儲存至範圍為scopevarName變量之中

<c:set var="varName" [scope="{ page|request|session|application }"]>

… 本體內容

</c:set>

語法3value 的值儲存至target 對象的屬性中

< c:set value="value" target="target" property="propertyName" />

語法4

將本體內容的數據儲存至target 對象的屬性中

<c:set target="target" property="propertyName">

… 本體內容

</c:set>

屬性

名稱

說明

EL

類型

必須

默認值

value

要被儲存的值

Y

Object

var

欲存入的變量名稱

N

String

scopevar

變量的JSP範圍

N

String

page

target

為一JavaBeanjava.util.Map對象

Y

Object

property

指定target對象的屬性

Y

String

範例

<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)運算後的結果來當做value的值。

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

RequestSessionApplication中順序尋找是否存在名稱為number的數據,若能找到時,則將它移除掉,反之則不會做任何的事情。

注意:當不指定scope時,回remove掉從page到application的var指定的變量。


<c:catch>

<c:catch>主要用來處理產生錯誤的異常狀況,並且將錯誤信息儲存起來。

語法

<c:catch [var="varName"] >

… 欲抓取錯誤的部分

</c:catch>

屬性

名稱

說明

EL

類型

必須

默認值

var

用來儲存錯誤信息的變量

N

String

說明

<c:catch>主要將可能發生錯誤的部分放在<c:catch></c:catch>之間。如果真的發生錯

誤,可以將錯誤信息儲存至varName變量中,例如:

<c:catch var="message">

//可能發生錯誤的部分

</c:catch>

另外,當錯誤發生在<c:catch></c:catch>之間時,則隻有<c:catch></c:catch>之間的程序會被中止忽略,但整個網頁不會被中止。 


<c:if>

<c:if>的用途就和我們一般在程序中用的if一樣。

語法

語法1:沒有本體內容(body)

<c:if test="testCondition" [var="varName"] [scope="{page|request|session|application}"]/>

語法2:有本體內容

<c:if test="testCondition" [var="varName"][scope="{page|request|session|application}"]>

具體內容

</c:if>

屬性

名稱

說明

EL

類型

必須

默認值

Test

如果表達式的結果為true,則執行本體內容,false則相反

Y

boolean

var

用來儲存test運算後的結果,即truefalse

N

String

scope

var變量的JSP範圍

N

String

page

 


<c:choose>

<c:choose>本身隻當做<c:when> <c:otherwise> 的父標簽。

語法

<c:choose>

本體內容( <when><otherwise> )

</c:choose>

限製

<c:choose>的本體內容隻能有:

·空白

·1或多個 <c:when>

·0或多個 <c:otherwise>

說明

若使用<c:when><c:otherwise>來做流程控製時,兩者都必須為<c:choose>的子標簽.



<c:when>

<c:when>的用途就和我們一般在程序中用的when一樣。

語法

<c:when test="testCondition" >

本體內容

</c:when>

屬性

名稱

說明

EL

類型

必須

默認值

Test

如果表達式的結果為true,則執行本體內容,false則相反

Y

boolean

 

限製

<c:when>必須在<c:choose></c:choose>之間

在同一個<c:choose>中時,<c:when>必須在<c:otherwise>之前

說明

<c:when>必須有test屬性,當test中的表達式結果為true時,則會執行本體內容;如果為

false時,則不會執行。

 


<c:otherwise>

在同一個 <c:choose>中,當所有 <c:when>的條件都沒有成立時,則執行<c:otherwise>

本體內容。

語法

<c:otherwise>

本體內容

</c:otherwise>



<c:forEach>

<c:forEach>為循環控製,它可以將集合(Collection)中的成員循序瀏覽一遍。運作方式為當

條件符合時,就會持續重複執行<c:forEach>的本體內容。

語法1:迭代一集合對象之所有成員

<c:forEach [var="varName"] items="collection" [varStatus="varStatusName"] [begin="begin"][end="end"] [step="step"]>

本體內容

< /c:forEach>

語法2:迭代指定的次數

<c:forEach [var="varName"] [varStatus="varStatusName"] begin="begin" end="end"

[step="step"]>

本體內容

</c:forEach>

限製

·假若有begin屬性時,begin必須大於等於 0

·假若有end屬性時,必須大於begin

·假若有step屬性時,step必須大於等於0

Null 和錯誤處理

·假若itemsnull 時,則表示為一空的集合對象

·假若begin大於或等於items時,則迭代不運算


<html>
<head>
<title>CH7 - Core_forEach.jsp</title>
</head>
<body>
<h2><c:out value="<c:forEach> 的用法" /></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" >
${item}</br>
</c:forEach>
</body>
</html>


<c:forEach>除了支持數組之外,還有標準J2SE 的集合類型,例如:ArrayList、List、LinkedList、Vector、Stack和Set 等等;另外還包括java.util.Map 類的對象.

<c:forEach>並不隻是用來瀏覽集合對象而已,讀者可以從語法2中發現,items並不存在
,但是當沒有使用items屬性時,就一定要使用beginend這兩個屬性。

 

<html>
<head>
<title>CH7 - Core_forEach2.jsp</title>
</head>
<body>
<h2><c:out value=" 循環" /></h2>
<c:forEach begin="1" end="10" var="item" >
${item}</br>
</c:forEach>
</body>
</html>

上述範例中,我們並沒有執行瀏覽集合對象,隻是設定begin 和end 屬性的值,這樣它就
變成一個普通的循環。此範例是將循環設定為:從1 開始跑到10,總共會重複循環10 次,並
且將數字放到item 的屬性當中. 

begin主要用來設定在集合對象中開始的位置(注意:第一個位置為0);end 用來設定結束的位置;而step 則是用來設定現在指到的成員和下一個將被指到成員之間的間隔.

另外,<c:forEach>還提供varStatus屬性,主要用來存放現在指到之成員的相關信息。例如: varStatus="s",那麼將會把信息存放在名稱為s的屬性當中。varStatus屬性還有另外四個屬性:indexcountfirstlast,它們各自代表的意義如表:

屬性

類型

意義

index

number

現在指到成員的索引

count

number

總共已經指到成員的總數

first

boolean

現在指到的成員是否為第一個成員

last

boolean

現在指到的成員是否為最後一個成員


可以使用varStatus 屬性取得循環正在瀏覽之成員的信息,下麵為一個簡單的範例: 

<html>
<head>
</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>

還有一個例子,要獲取:https://localhost:8080/t/index.jsp?a=123&b=256&com=297中的參數列表按如下:

鍵com:297
鍵b:256
鍵a:123

可以結合EL表單式實現:

<c:forEach items="${param}" var="b">
        鍵${b.key}:${b.value }<br/>
</c:forEach>



<c:forTokens> 

<c:forTokens> 用來瀏覽一字符串中所有的成員,其成員是由定義符號(delimiters)所分隔的。
語法:
<c:forTokens   items="stringOfTokens"

        delims="delimiters"

        [var="varName"]

        [varStatus="varStatusName"]

        [begin="begin"]

        [end="end"]

        [step="step"]>
本體內容
</c:forTokens>  


var       用來存放現在指到的成員N String 否無
items   被迭代的字符串Y String 是無
delims       定義用來分割字符串的字符N String 是無
varStatus  用來存放現在指到的相關成員信息N String 否無
begin         開始的位置Y int 否0
end            結束的位置Y int 否最後一個成員
step    每次迭代的間隔數Y int 否1

說明
<c:forTokens>的begin、end、step、var 和varStatus 用法都和<c:forEach>一樣,因此,筆者在這裏就隻介紹items 和delims 兩個屬性:items 的內容必須為字符串;而delims 是用來分割items 中定義的字符串之字符。

下麵為一個典型的<c:forTokens>的範例:

<c:forTokens items="A,B,C,D,E" delims="," var="item" >
${item}
</c:forTokens>

 

上麵範例執行後,將會在網頁中輸出ABCDE。它會把符號“,”當做分割的標記,拆成5 個部分,也就是執行循環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>

 

這個範例將會在網頁上打印1234567899,也就是把123-456-7899以“-”當做分割標記,將字符串拆為3 份,每執行一次循環就將瀏覽的部分放到名稱為item 的屬性當中。delims 不隻指定一種字符來分割字符串,它還可以一次設定多個分割字符串用的字符。如下麵這個範例:

<c:forTokens items="A,B;C-D,E" delims=",;-" var="item" >
${item}
</c:forTokens>


此範例會在網頁輸出ABCDE,也就是說,delims 可以一次設定所有想當做分割字符串用的字符。其實用<c:forEach>也能做到分割字符串,寫法如下:

<c:forEach items="A,B,C,D,E" var="item" >
${item}
</c:forEach>


上述範例同樣也會在網頁輸出ABCDE。<c:forEach>並沒有delims這個屬性,因此<c:forEach>無法設定分割字符串用的字符,而<c:forEach>分割字符串用的字符隻有“,”,這和使用<c:forTokens>,delims 屬性設為“,”的結果相同。所以如果使用<c:forTokens>來分割字符串,功能和彈性上會比使用<c:forEach>來得較大。


原帖地址:https://www.cnblogs.com/Fskjb/archive/2009/07/05/1517164.html

最後更新:2017-04-02 22:16:12

  上一篇:go 我的所有技術博客以及聲明
  下一篇:go 對話:關於委托的進一步討論