JSTL 核心標籤庫 使用(轉)

在JSP的開發中,迭代是常常要使用到的操做。例如,逐行的顯示查詢的結果等。在早期的JSP中,一般使用Scriptlets來實現Iterator或者Enumeration對象的迭代輸出。如今,經過JSTL的迭代標籤能夠在很大的程度上簡化迭代操做。
 JSTL所支持的迭代標籤有兩個,分別是<c:forEach>和<c:forTokens>。在這裏介紹的是<c:forEach>標籤。
 簡單點說,<c:forEach>標籤的做用就是迭代輸出標籤內部的內容。它既能夠進行固定次數的迭代輸出,也能夠依據集合中對象的個數來決定迭代的次數。html

           <c:forEach>標籤的語法定義以下所示。java

                    <c:forEach var="name" items="expression" varStatus="name"sql

                            begin="expression" end="expression" step="expression">數據庫

                             body contentexpress

                    </c:forEach>數組

           <c:forEach>標籤具備如下一些屬性:session

l            var:迭代參數的名稱。在迭代體中可使用的變量的名稱,用來表示每個迭代變量。類型爲String。app

l            items:要進行迭代的集合。對於它所支持的類型將在下面進行講解。jsp

l            varStatus:迭代變量的名稱,用來表示迭代的狀態,能夠訪問到迭代自身的信息。ide

l            begin:若是指定了items,那麼迭代就從items[begin]開始進行迭代;若是沒有指定items,那麼就從begin開始迭代。它的類型爲整數。

l            end:若是指定了items,那麼就在items[end]結束迭代;若是沒有指定items,那麼就在end結束迭代。它的類型也爲整數。

l            step:迭代的步長。

           <c:forEach>標籤的items屬性支持Java平臺所提供的全部標準集合類型。此外,您可使用該操做來迭代數組(包括基本類型數組)中的元素。它所支持的集合類型以及迭代的元素以下所示:

l            java.util.Collection:調用iterator()來得到的元素。

l            java.util.Map:經過java.util.Map.Entry所得到的實例。

l            java.util.Iterator:迭代器元素。

l            java.util.Enumeration:枚舉元素。

l            Object實例數組:數組元素。

l            基本類型值數組:通過包裝的數組元素。

l            用逗號定界的String:分割後的子字符串。

l            javax.servlet.jsp.jstl.sql.Result:SQL查詢所得到的行。

           不管是對整數仍是對集合進行迭代,<c:forEach>的varStatus屬性所起的做用相同。和var屬性同樣,varStatus用於建立限定了做用域的變量(改變量只在當前標籤體內起做用)。不過,由varStatus屬性命名的變量並不存儲當前索引值或當前元素,而是賦予javax.servlet.jsp.jstl.core.LoopTagStatus類的實例。該類包含了一系列的特性,它們描述了迭代的當前狀態,以下這些屬性的含義以下所示:

l            current:當前此次迭代的(集合中的)項。

l            index:當前此次迭代從0開始的迭代索引。

l            count:當前此次迭代從1開始的迭代計數。

l            first:用來代表當前這輪迭代是否爲第一次迭代,該屬性爲boolean類型。

l            last:用來代表當前這輪迭代是否爲最後一次迭代,該屬性爲boolean類型。

l            begin:begin屬性的值。

l            end:end屬性的值

l            step:step屬性的值

下面就來看一個個基本的例子,表格隔行背景色變化
<c:forEach var="item" items="${contents}" varStatus="status">
            <tr <c:if test="${status.count%2==0}">bgcolor="#CCCCFE"</c:if> align="left">
            xxx
            </tr>
</c:forEach>

JSTL是一個標準的已
制定好的標籤庫,能夠應用於各類領域,如:基本輸入輸出,流程控制,循環,XML文件剖析,數據庫查
詢以及國際化和文字格式標準化的應用等。JSTL所提供的標籤庫分爲如下五大類:
核心標籤庫(Core tag Liabry)主要有:基本輸入輸出,流程控制,迭代操做和URL操做。
在JSP中使用JSTL中的標籤庫時,必須使用<%@taglib%>指令,而且設定prefix和uri的值得,一般設定:
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
這樣就可使用核心標籤庫了。

.表達式操做
表達式操做分類中包含四個標籤: <c:out>,<c:set>,<c:remove>和<c:catch>
<c:out>:重要用來顯示數據的內容,相似與<%=scripting-language%>。它的語法以下:
語法1: 沒有body內容
<c:out value="value" [escapeXml="{true|false}"] [default="defaultValue"]/>

語法2: 有body內容
<c:out value="value"   [escapeXml="{true|false}"]>
   default value
</c:out>

Attribute
-----------------------------------------------------------------------------------------------------------------------
名稱                       說明                                          EL      類型      必須        默認值
value                   須要顯示的值                                     Y       Object     是           無
default                若是value值爲null,則顯示default的值               Y       Object     否           無
escapeXml         是否轉換特殊字符,如: <轉換爲&It                       Y       Object     否           true
----------------------------------------------------------------------------------------------------------------------
Null和錯誤說明
倘若value爲null,會顯示default的值;倘若沒有設定default的值,則會顯示一個空的字符串。

<c:set>:主要用來把變量存儲至JSP範圍或是JavaBean的屬性中。
語法1: 沒有body
將value的值存儲至範圍爲scope的varName變量之中
<c:set value="value" var="varName" [scope="{page|request|session|application}"]/>

語法2: 有body
將body內容存儲至範圍爲scope的varName變量之中
<c:set value="value" [scope="{page|request|session|application}"]>
   body.....
</c:set>

語法3: 將value的值存儲至target對象屬性中
<c:set value="value" target="target" property="propertyNmae"/>

語法4: 將body內容的數據存儲至target對象屬性中
<c:set target="target" property="propertyNmae">
body....
</c:set>

Attribute
----------------------------------------------------------------------------------------
名稱                     說明                                EL      類型       必須       默認值
value              要被存儲的值                              Y       Object       否           無
var                 欲存入的變量名                           N       String       否           無
scope             var變量的JSP範圍                           N       String       否          page
target             爲一JavaBean或java.util.Map對象           Y       Object       否           無
property         指定target對象屬性                          Y       String       否           無
------------------------------------------------------------------------------------------
Null 和 錯誤處理:
語法3和語法4會產生異常錯誤,有如下兩種狀況:
.target 爲null
.target 不是java.util.Map或JavaBean對象
倘若value爲null時:將由存儲變量改成移除變量
.語法1: 由var和scope所定義的變量,將被移除
     .若scope已指定時,則PageContext.removeAttribute(varName,scope);
     .若scope未指定時,則PageContext.removeAttribute(varName);
.語法3: 
     .倘若target爲Map時,則Map.remove(property);
     .倘若target爲JavaBean時,propertye指定的屬性爲null
注意: var和scope這兩個屬性不能使用表達式來表示,咱們不能寫成 scope="${ourScope}"或var="${a}"

<c:remove>:主要用來移除變量。
語法:
<c:remove var="varName" [scope="{page|request|session|application}"]/>

Attribute
----------------------------------------------------------------------------------------
名稱                  說明                            EL      類型      必須        默認值
var              欲移除變量的名稱                     N       String      是           無
scope            var變量的JSP範圍                     N       String      否          page
----------------------------------------------------------------------------------------
說明:
<c:remove>必需要有var屬性,即要被移除的屬性名稱,scope則無關緊要,如:
<c:remove var="username" scope="session"/>
將username變量從session範圍移除。若咱們不設定scope,則<c:remove>會移除全部範圍名稱爲username
的數據。

<c:catch>:主要用來處理產生錯誤的異常狀況,而且將信息保存起來。
語法:
<c:catch [var="varName"]>
...欲抓取錯誤的部分...
</c:catch>

Attribute
----------------------------------------------------------------------------------------
名稱                  說明                            EL      類型      必須        默認值
var            用來存儲錯誤信息的變量                 N       String        否           無
-----------------------------------------------------------------------------------------
說明:
<c:catch>主要將可能發生錯誤的部分放在<c:catch>和</c:catch>之間。若是真的發生錯誤,可將錯誤
信息保存至變量varName標量中,如:
<c:catch var="message">
     //可能發生錯誤的部分
</catch>
另外,當錯誤發生<c:catch>和</c:catch>之間時,只有<c:catch>和</c:catch>之間的程序會被停止忽
略,但整個網頁不會被停止。

流程控制
流程控制分類中包含四個標籤:<c:if>,<c:choose>,<c:when>和<c:otherwise>。

<c:if>:的用途和咱們在通常程序中寫的if同樣。
語法:
語法1:沒有body
<c:if test="testCondition" var="varName" [scope="{page|request|session|application}"]/>

語法2: 有body
<c:if test="testCondition" [var="varName"] [scope="{page|request|session|appliation}"]>
   ...body....
</c:if>

Attribute
------------------------------------------------------------------------------------------------------------------------
名稱                            說明                                              EL      類型         必須        默認值
test                    若是表達式的結果爲true則執行body,false則相反               Y       boolean        是            無
var                    用來存儲test運算後的結果,即true或false                     N      String           否            無
scope                var變量的JSP範圍                                              N      String           否           page
------------------------------------------------------------------------------------------------------------------------
說明:
<c:if>標籤必需要有test屬性,body裏除了能是靜態文本以外能夠是任何JSP代碼,標籤或HTML代碼。

<c:choose>:自己只看成<c:when>和<c:otherwise>的父標籤。
語法:
<c:choose>
   body(<when>和<otherwise>)
</c:choose>
限制:
<c:choose>的本地內容只能有:
.空白
.1或多個<c:when>
.0或多個<c:otherwise>
如:
<c:choose>

<c:when test="${condition1}">
    condition1 爲 true
</c:when>

<c:when test="${condition2}">
    condition2 爲 true
</c:when>

<c:otherwise>
    condition1和conditon2都爲false
</<c:otherwise >

</c:choose>
說明:
在同一個<c:choose>中,假如全部的<c:when>的test都不爲true時,則執行<c:otherwise>的本體內容。
在同一個<c:choose>中,倘若有好幾個<c:when>都會true時,只能有一個<c:when>成立。

迭代操做
迭代(Iterator)操做主要包含兩個標籤: <c:forEach>和<c:forTokens>。

<c:forEach>爲循環控制,它能夠將集合(Collection)中的成員循序瀏覽一遍。運作方式爲當條件符合
時,就會持續重複執行<c:forEach>的body內容。
語法:
語法1: 迭代一集合對象之全部成員
<c:forEach [var="varName"] items="collection" [varStatus="varStatusName"]
            [begin="begin"] [end="end"] [step="step"]>
...body內容.....
<c:forEach>

語法2: 迭代指定的次數
<c:forEach [var="varName"] [varStatus="varStatusName"]
            begin="begin" end="end" [step="step"]>
...body內容.....
<c:forEach>

Attribute
--------------------------------------------------------------------------------------------------------------------------
名稱                  說明                                     EL      類型              必須        默認值
var           用來存放如今指到的成員                           N       String             否            無

                                                                       Arrays
                                                                       Collection
                                                                       Iterator           否            無
items          被迭代的集合對象                                Y       Enumeration            
                                                                         Map
                                                                       String

varStatus      用來存放到指到的相關成員信息                    N         String            否            無
begin            開始的位置                                    Y           int             否            0
end               結束的位置                                   Y           int              否            最後一個成員
setp              每次迭代的間隔數                             Y           int              否             1
-------------------------------------------------------------------------------------------------------------------------
Null 和 錯誤處理
.倘若items爲null時,則表示爲一空的集合對象
.倘若begin大於或等於items時,則迭代不運算
注意:
varName的範圍只存在<c:forEach>的本體中,若是超出了本題,則不能取得varName的值。如:
<c:forEach items="${atts}" var="item">
</c:forEach>
${item}</br>
${item}則不會顯示item的內容。<c:forEach>除了支持數組以外,還有標準的J2SE的結合類型,例如:
ArrayList,List,LinkedList,Vector,Stack和Set等等;另外包括java.util.Map類的對象,例如:
HashMap,Hashtable,Properties,Provider和Attributes。

另外<c:forEach>還提供了varStatus屬性,主要用來存放如今指到成員的相關信息。例如:咱們寫成
varStatus="s",那麼就會把信息存放到名稱爲s的屬性當中。varStatus屬性還提供另外四個屬性:index,
count,fist和last,它們個自的意義以下:
------------------------------------------------------------------------------------------
    屬性                     類型                                    意義
    index                    number                       如今指到成員的索引
    count                    number                       總共指到成員的總和
    first                      boolean                      如今指到成員是否爲第一個
    last                      boolean                      如今指到成員是否爲最後一個
-------------------------------------------------------------------------------------------
以下例子:
<%@page contentType="text/html;charset=gb2312"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
String atts[] = new String[5];
atts[0]="hello";
atts[1]="this";
atts[2]="is";
atts[3]="a";
atts[4]="girl";
request.setAttritue("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>

<c:forTokens>
<c:forTokens>:用來瀏覽一字符串中全部的成員,起成員是由定義符號(delimiters)所分隔的。
語法:
<c:forTokens items="stringFoTokens" delims="delimmmmiters" [var="varName"]
              [varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"]>
...body內容....
</c:forTokens>

Attribute
--------------------------------------------------------------------------------------------------------------------
名稱                                     說明                             EL      類型       必須        默認值
var                    用來存放如今指到的成員                              Y       String        否           無
items                 被迭代的字符串                                       Y       String        是           無
delims               定義用來分割字符串的字符                              N       String        是           無
varStatus           用來存放如今指到的相關成員信息                         N       String        否           無
begin                開始的位置                                            Y        int          否            0
end                  結束的位置                                            Y        int          否            最後一個成員
step                 每次迭代間隔數                                        Y        int          否            1
---------------------------------------------------------------------------------------------------------------------
限制:
.倘若有begin屬性時,begin必須大於等於0
.倘若有end屬性時,必須大於begin
.倘若有step屬性時,step必須大於等於1

Null 和 錯誤處理
.假如itmes爲null時,則表示爲有空的集合對象
.倘若begin大於等於items的大小時,則迭代不運算

例子:
<c:forToken items="A,B,C,D,E,F,G" delims="," var="item>
${item}
</c:forToken>
items屬性也能夠用EL,例如:
<%
String phonenumber="123-456-7899";
request.setAttribute("userPhone",phonenumber);
%>
<c:forTokens items="${userPhone}" delims="-" var="item">
${item}
</c:forTokens>

URL操做JSTL包含三個URL操做有關的標籤,分別是: <c:import>,<c:redirect>和<c:url>。它們的主要功能是:用來將其餘文件的內容包含起來,網頁的嚮導,還有url的產生。

相關文章
相關標籤/搜索