天天看點

JSTL-核心标簽庫

jstl 全名為java server pages standard tag library(jsp

standard tag library),它的中文名稱為jsp标準标簽函數庫。 web

程式開發人員能夠利用jstl和el來開發web程式,取代傳統直接在頁面上嵌入java程式(scripting)的做法,以提高程式可讀性、維護性和友善性。 

jstl是一個标準的已制定好的标簽庫,可以應用于各種領域,如:基本輸入輸出、流程控制、循環、xml檔案剖析、資料庫查詢及國際化和文字格式标準化的應用等。

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

(1)核心标簽庫(core tag library)

(2)i18n格式标簽庫

(i18n-capable formatting tag library)

(3)sql标簽庫

(sql tag library)

(4)xml标簽庫

(xml tag library)

(5)函數标簽庫(functions tag library)

jstl

字首

uri

核心标簽庫

c

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

i18n格式标簽庫

fmt

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

sql标簽庫

sql

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

xml标簽庫

xml

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

函數标簽庫

fn

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

若要在jsp網頁中使用jstl,一定要先做下面這行聲明:

<%@ taglib prefix="c" uri="http://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的值

escapexml

是否轉換特殊字元,如:<轉換成<

boolean

true

注意

表格中的el字段,表示此屬性的值是否可以為el表達式,例如:y表示attribute

= "${表達式}"為符合文法的,n則反之。

null

和錯誤處理

假若

value為null,會顯示default的值;假若沒有設定default的值,則會顯示一個空的字元串。

一般來說,<c:out>預設會将<、>、’、”

和& 轉換為

<、>、'、"和

&。

假若不想轉換時,隻需要設定<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

的值儲存至範圍為scope的

varname變量之中

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

文法2:将本體内容的資料儲存至範圍為scope的

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

… 本體内容

</c:set>

文法3:将value

的值儲存至target

對象的屬性中

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

文法4:

将本體内容的資料儲存至target

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

屬性

名稱

要被儲存的值

var

欲存入的變量名稱

n

string

scopevar

變量的jsp範圍

page

target

為一javabean或java.util.map對象

property

指定target對象的屬性

<c:set var="number" scope="request" value="${1 + 1}" />

<c:set var="number" scope="session" />

${3 + 5}

<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;若不為

時,則将 ${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 }"] />

欲移除的變量名稱

scope

var變量的jsp範圍

<c:remove>必須要有var屬性,即要被移除的屬性名稱,scope則可有可無,例如:

<c:remove var="number" scope="session" />

将number變量從session範圍中移除。若我們不設定scope,則<c:remove>将會從page、

request、session及application中順序尋找是否存在名稱為number的資料,若能找到時,則将它移除掉,反之則不會做任何的事情。

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

<c:catch>

<c:catch>主要用來處理産生錯誤的異常狀況,并且将錯誤資訊儲存起來。

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

… 欲抓取錯誤的部分

</c:catch>

用來儲存錯誤資訊的變量

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

誤,可以将錯誤資訊儲存至varname變量中,例如:

<c:catch var="message">

//可能發生錯誤的部分

另外,當錯誤發生在<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}"]/>

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

具體内容

</c:if>

test

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

用來儲存test運算後的結果,即true或false

<c:choose>

<c:choose>本身隻當做<c:when>

和<c:otherwise>

的父标簽。

本體内容( <when>和

<otherwise> )

</c:choose>

限制

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

·空白

·1或多個

<c:when>

·0或多個

<c:otherwise>

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

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

<c:when test="testcondition" >

本體内容

</c:when>

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

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

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

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

false時,則不會執行。

在同一個

<c:choose>中,當所有

<c:when>的條件都沒有成立時,則執行<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必須大于等于

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

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

·假若items為null

時,則表示為一空的集合對象

·假若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>

</body>

</html>

<c:foreach>除了支援數組之外,還有标準j2se 的集合類型,例如:arraylist、list、linkedlist、vector、stack和set 等等;另外還包括java.util.map 類的對象.

<c:foreach>并不隻是用來浏覽集合對象而已,讀者可以從文法2中發現,items并不存在,但是當沒有使用items屬性時,就一定要使用begin和end這兩個屬性。

<title>ch7 - core_foreach2.jsp</title>

<h2><c:out value=" 循環" /></h2>

<c:foreach begin="1" end="10" var="item" >

上述範例中,我們并沒有執行浏覽集合對象,隻是設定begin 和end 屬性的值,這樣它就

變成一個普通的循環。此範例是将循環設定為:從1 開始跑到10,總共會重複循環10 次,并

且将數字放到item 的屬性當中. 

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

另外,<c:foreach>還提供varstatus屬性,主要用來存放現在指到之成員的相關資訊。例如:

varstatus="s",那麼将會把資訊存放在名稱為s的屬性當中。varstatus屬性還有另外四個屬性:index、count、first和last,它們各自代表的意義如表:

意義

index

number

現在指到成員的索引

count

總共已經指到成員的總數

first

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

last

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

可以使用varstatus 屬性取得循環正在浏覽之成員的資訊,下面為一個簡單的範例: 

<h2><c:out value="<c:foreach> varstatus 的四種屬性" /></h2>

<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>

還有一個例子,要擷取:http://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: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" >

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

<c:fortokens items="a,b;c-d,e" delims=",;-" var="item" >

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

<c:foreach items="a,b,c,d,e" var="item" >

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

原帖位址:http://www.cnblogs.com/fskjb/archive/2009/07/05/1517164.html