天天看點

⑤早起的鳥兒有蟲吃-JSTL核心标簽庫[收藏]介紹

  jstl 全名為java server pages standard tag library(jsp standard tag library),它的中文名稱為jsp 标準标簽函數庫。 web 程式開發人員能夠利用jstl和el來開發web 程式,取代傳統直接在頁面上嵌入java程式(scripting)的做法,以提高程式可讀性、維護性和友善性。 jstl是一個标準的已制定好的标簽庫,可以應用于各種領域,如:基本輸入輸出、流程控制、循環、xml檔案剖析、資料庫查詢及國際化和文字格式标準化的應用等。jstl所提供的标簽函數庫主要分為五大類:

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 标簽庫,又被稱為核心标簽庫,該标簽庫的工作是對于 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>主要用來顯示資料的内容,就像是 <%= 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>主要用來将變量儲存至jsp範圍中或是javabean的屬性中。

文法1:将 value 的值儲存至範圍為scope 的 varname 變量之中

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

文法2:将本體内容的資料儲存至範圍為scope 的 varname 變量之中

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

null 時,則将 ${param.username}的值存入user(javabean)的name 屬性(setter 機制)。

上述範例的3.中,假若 ${param.number}為null時,則表示移除request範圍的number變量。

<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 [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>的用途就和我們一般在程式中用的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: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>的用途就和我們一般在程式中用的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:otherwise>

<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

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

·假若begin 大于或等于items 時,則疊代不運算

<c:foreach>除了支援數組之外,還有标準j2se 的集合類型,例如:arraylist、list、

linkedlist、vector、stack和set 等等;另外還包括java.util.map 類的對象.

<c:foreach>并不隻是用來浏覽集合對象而已,讀者可以從文法2中發現,items并不存在

,但是當沒有使用items 屬性時,就一定要使用begin 和end 這兩個屬性。

上述範例中,我們并沒有執行浏覽集合對象,隻是設定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 屬性取得循環正在浏覽之成員的資訊,下面為一個簡單的範例:

還有一個例子:

我要擷取:http://localhost:8080/t/index.jsp?a=123&b=256&com=297中的參數清單按如下:

鍵com:297

鍵b:256

鍵a:123

可以結合el表單式實作:

<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>的範例:

上面範例執行後,将會在網頁中輸出abcde。它會把符号“,”當做分割的标記,拆成5 個部分,也就是執行循環5 次,但是并沒有将a,b,c,d,e 中的“,”顯示出來。items 也可以放入el 的表達式,如下:

這個範例将會在網頁上列印1234567899,也就是把123-456-7899以“-”當做分割标記,将字元串拆為3

份,每執行一次循環就将浏覽的部分放到名稱為item 的屬性當中。delims

不隻指定一種字元來分割字元串,它還可以一次設定多個分割字元串用的字元。如下面這個範例:

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

上述範例同樣也會在網頁輸出abcde。<c:foreach>并沒有delims這個屬性,是以<c:foreach>無法設

定分割字元串用的字元,而<c:foreach>分割字元串用的字元隻有“,”,這和使

用<c:fortokens>,delims

屬性設為“,”的結果相同。是以如果使用<c:fortokens>來分割字元串,功能和彈性上會比使用<c:foreach>

來得較大。