JSTL標準標籤庫具體解釋

JSTL標籤庫的使用是爲類彌補html表的不足。規範本身定義標籤的使用而誕生的。html

在告別modle1模式開發應用程序後。人們開始注重軟件的分層設計,不但願在jsp頁面中出現java邏輯代碼,同一時候也由於本身定義標籤的開發難度較大和不利於技術標準化產生了本身定義標籤庫。java

JSTL標籤庫可分爲5類:git

q        核心標籤庫web

q        I18N格式化標籤庫sql

q        SQL標籤庫數據庫

q        XML標籤庫數組

q        函數標籤庫瀏覽器

本章將對這些內容一一講述。tomcat

9.1 核心標籤庫

JSTL的核心標籤庫標籤共13個,從功能上能夠分爲4類:表達式控制標籤、流程控制標籤、循環標籤、URL操做標籤。安全

使用這些標籤能夠完畢JSP頁面的基本功能,下降編碼工做。

1)表達式控制標籤:out標籤、set標籤、remove標籤、catch標籤。

2)流程控制標籤:if標籤、choose標籤、when標籤、otherwise標籤。

3)循環標籤:forEach標籤、forTokens標籤。

4URL操做標籤:import標籤、url標籤、redirect標籤。

JSP頁面引入核心標籤庫的代碼爲:

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

如下將依照功能分類。分別解說每個標籤的功能和使用方式。

9.2.1 表達式控制標籤

表達式控制分類中包含<c:out><c:set><c:remove><c:chtch>4個標籤,現在分別介紹它們的功能和語法。

1<c:out>標籤

【功能】:用來顯示數據對象(字符串、表達式)的內容或結果。

在使用Java腳本輸出時常使用的方式爲:

<% out.println(「字符串」)%>

<%=表達式%>

web開發中。爲了不暴露邏輯代碼會盡可能下降頁面中的Java腳本。使用<c:out>標籤就可以實現以上功能。

<c:out value=」字符串」>

<c:out value=」EL表達式」>

提示:JSTL的使用是和EL表達式分不開的,EL表達式儘管可以直接將結果返回給頁面,但有時獲得的結果爲空,<c:out>有特定的結果處理功能,EL的單獨使用會減小程序的易讀性。建議把EL的結果輸入放入<c:out>標籤中。

<c:out>標籤的使用有兩種語法格式。

【語法1】:

<c:out value=」要顯示的數據對象」 [escapeXml=」true|false」] [default=」默認值」]>

【語法2】:

<c:out value=」要顯示的數據對象」 [escapeXml=」true|false」]>默認值

</c:out>

這兩種方式沒有本質的區別。僅僅是格式上的區別。

標籤的屬性介紹例如如下。

q        value:指定要輸出的變量或表達式。

q        escapeXml:設定是否轉換特殊字符(如&lt&gt等一些轉義字符),在默認值爲true的狀況下直接在輸出&lt的。假設改成false將會進行轉義輸出「<」等。

q        default:爲默認輸出結果。

假設使用表達式獲得的結果爲null(注意與空差異)。將會輸出默認結果。

【演示樣例代碼】:代碼9.1演示了<c:out>的使用,以及在不一樣屬性值狀態下的結果。

代碼9.1 <c:out>標籤使用演示樣例:coredemo01.jsp

1     <%@ page pageEncoding="gbk" %>

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

3     <html>

4     <head>

5              <title>out標籤的使用</title>

6     </head>

7     <body>

8              <li>1<c:out value="北京源智天下科技有限公司"></c:out></li>

9              <li>2<c:out value="&lt未使用字符轉義&gt" /></li>

10              <li>3<c:out value="&lt使用字符轉義&gt" escapeXml="false"></c:out></li>

11              <li>4<c:out value="${null}">使用了默認值</c:out></li>

12              <li>5<c:out value="${null}"></c:out></li>

13     </body>

14     </html>

【代碼解析】:

1)第8行爲<c:out>value屬性賦值爲字符串。

2)第9行和第10行對照,在改變escapeXml屬性後頁面輸出的轉義字符。

3)第11value獲得null,假設方法體內有值,將輸出方法體中的字符串。不然不輸出,第12行沒有輸出結果。

【代碼解析】:

1)直接輸出了一個字符串。

2)字符串中有轉義字符,但在默認狀況下沒有轉換。

3)使用了轉義字符&lt&gt分別轉換成<>符號。

4)設定了默認值。從EL表達式${null}獲得空值,因此直接輸出設定的默認值。

5)未設定默認值,輸出結果爲空。

2<c:set>標籤

功能:主要用於將變量存取於JSP範圍中或JavaBean屬性中。

<c:set>標籤的編寫共同擁有4種語法格式。

語法1:存值,把一個值放在指定(pagesession等)的map中。

<c:set value=」1」 var=」name1」 [scope=」page|request|session|application」]>

含義:把一個變量名爲name1值爲「值1」的變量存儲在指定的scope範圍內。

語法2

<c:set var=」name2」 [scope=」page|request|session|application」]>

2

</c:set>

含義:把一個變量名爲name2。值爲值2的變量存儲在指定的scope範圍內。

語法3

<c:set value=」3」 target=」JavaBean對象」 property=」屬性名」/>

含義:把一個值爲「值3」賦值給指定的JavaBean的屬性名。至關與setter()方法。

語法4

<c:set target=」JavaBean對象」 property=」屬性名」>

4

</c:set>

含義:把一個值4賦值給指定的JavaBean的屬性名。

提示:從共能上分語法1和語法2、語法3和語法4的效果是同樣的僅僅是把value值放置的位置不一樣至於使用那個依據我的的喜好。語法1和語法2是向scope範圍內存儲一個值。語法3和語法4是給指定的JavaBean賦值。

【演示樣例代碼】:代碼給出了給指定scope範圍賦值的演示樣例。

使用<c:set>標籤把值放入sessionapplication對象中。

同一時候使用EL表達式獲得存入的值。

代碼9.2 使用<c:set>存取值:coredemo02.jsp

1     <%@ page language="java" pageEncoding="gbk"%>

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

3     <html>

4     <head>

5     <title>set標籤的使用</title>

6     </head>

7     <body>

8     <li>把一個值放入session中。

<c:set value="coo" var="name1" scope="session"></c:set>

9     <li>session中獲得值:${sessionScope.name1 }

10     <li>把還有一個值放入application中。<c:set var="name2" scope="application">olive</c:set>

11              <li> 使用out標籤和EL表達式嵌套獲得值:

12              <c:out value="${applicationScope.name2}">未獲得name的值</c:out></li>

13     <li>未指定scope的範圍,會從不一樣的範圍內查找獲得對應的值:${name1 }${name2 }

14     </body>

15     </html>

【代碼解析】:

1)第8行經過<c:set>標籤將值name1的值放入session範圍中。

2)第9行使用EL表達式獲得name1的值。

3)第10行把name2放入application範圍中。

4)第11行使用EL表達式從application範圍中取值,用<c:out>標籤輸出使得頁面規範化。

5)第13行不指定範圍使用EL本身主動查找獲得值。


在代碼中未使用不論什麼Java腳本使用程序的功能。

爲了對照期間。代碼9.3給出了使用Java腳本實現以上功能的樣例。

代碼9.3 Java腳本實現值的存取:getvalue.jsp

1     <%@page language="java" pageEncoding="gbk"%>

2     <html>

3     <head>

4     <title>set標籤的使用</title>

5     </head>

6     <body>

7     <li>把一個值放入session中。<%session.setAttribute("name1","coo"); %></li>

8     <li>session中獲得值:<% out.println(session.getAttribute("name1"));   %></li>

9     <li>把還有一個值放入application中。

<% application.setAttribute("name2","olive"); %></li>

10     <li> application中獲得值:<% out.println(application.getAttribute("name2")); %></li>

11     </body>

12     </html>

【代碼解析】:使用JSP內置對象的方法實現存值和取值的功能。

提示:本章演示樣例爲了方便期間都是從一個頁面中存取,在開發中值的存取是爲了避免同的JSP頁面之間共享數據

從兩個程序對照來看。JSTL實習了使用標籤完畢取值賦值的功能。下降代碼的編寫量同一時候避免了邏輯代碼暴露的危急。

【程序演示樣例】:代碼9.4和代碼9.5演示使用<c:set標籤>操縱JavaBean

1)建立一個JavaBean對象。

代碼9.4 JavaBeanvo傳輸數據對象):Person.java

1     package org.olive;

2     public class Person {

3              private String name;                                      //定義私有變量姓名字符串

4              private int age;                                                //定義私用變量年齡整型

5              private char sex;                                             //定義私用變量性別字符性

6              private String home;                                      //定義私用變量家鄉字符串

7              public String getName() {                             //namegetter方法

8                        return name;

9              }

10              public void setName(String name) {          //namesetter方法。

11                        this.name = name;

12              }

13              public int getAge() {                                        //agegetter方法

14                        return age;

15              }

16              public void setAge(int age) {                        //agesetter方法

17                        this.age = age;

18              }

19              public char getSex() {                                    //sexgetter方法

20                        return sex;

21              }

22              public void setSex(char sex) {                      //sexsetter方法

23                        this.sex = sex;

24              }

25              public String getHome() {                             //homegetter方法

26                        return home;

27     }

28              public void setHome(String home) {                   //homesetter方法

29                       this.home = home;

30              }

31     }

【代碼解析】:一個僅僅有gettersetter方法的JavaBean或者說一個pojo類,做爲一個vo(傳輸數據對象)。定義了四個變量agenamesexhome

2)建立JSP頁面。實現對值的操做。

代碼9.5 操做JavaBeancoredemo03.jsp

1     <%@ page language="java" pageEncoding="gbk"%>

2     <jsp:useBean id="person" class="org.olive.Person" />

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

4     <html>

5     <head>

6     <title>set標籤的使用</title>

7     </head>

8     <body>

9              <c:set target="${person}" property="name">maverick</c:set>

10              <c:set target="${person}" property="age">25</c:set>

11              <c:set target="${person}" property="sex"></c:set>

12              <c:set target="${person}" property="home">china</c:set>

13              <li>使用的目標對象爲:${person }

14              <li>Bean中得到的name值爲:<c:out value="${person.name}"></c:out>

15              <li>Bean中得到的age值爲:<c:out value="${person.age}"></c:out>

16              <li>Bean中得到的sex值爲:<c:out value="${person.sex}"></c:out>

17              <li>Bean中得到的home值爲:<c:out value="${person.home}"></c:out>

18              </body>

19     </html>

【代碼解析】:

1)第1行設置頁面格式和字符編碼集。

2)第2行使用JSP的指令元素指定要使用的JavaBean

3)第3行引入JSTL核心標籤庫。

4)第9~12行設置JavaBean的屬性值。等同與setter方法。

5)使用EL表達式獲得JavaBean的屬性值,並用out標籤輸出。

【關鍵代碼】:

<jsp:useBean id="person" class="org.olive.Person" />

負責實例化Beanid指定實例化後的對象名,可以經過${person}獲得person在內存中的值(或者使用person.toString()方法)。

<c:set target="${person}" property="name">maverick</c:set>

Target指向實例化後的對象,property指向要插入值的參數名。

注意:使用target時必定要指向實例化後的JavaBean對象,也就是要跟<jsp:useBean>配套使用。也可以java腳本實例化,但這就失去了是用標籤的本質意義。

使用Java腳本實例化:

<%@page import=」org.olive.Person」%

<% Person person=new Person(); %>

程序執行結果如圖9.4所看到的。

9.4 coredemo03.jsp執行結果

3<c:remove>標籤

<c:remove>標籤主要用來從指定的JSP範圍內移除指定的變量。

【語法】:

<c:remove var=」變量名」 [scope=」page|request|session|application」]/>

當中var屬性是必須的,scope可以以省略。

【演示樣例程序】:代碼9.6使用set標籤在session中插入2個值,而後用remove標籤移除。

代碼9.6 <c:remove>標籤演示樣例:coredemo04.jsp

1       <%@ page language="java" pageEncoding="gbk"%>

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

3       <html>

4       <head>

5       <title>remove標籤的使用</title>

6       </head>

7       <body> 

8                <li><c:set var="name" scope="session">olive</c:set>

9                <li><c:set var="age" scope="session">25</c:set>

10              <li><c:set var="sex" scope="session"></c:set>

11              <li><c:out value="${sessionScope.name}"></c:out>

12              <li><c:out value="${sessionScope.age}"></c:out>

13              <li><c:out value="${sessionScope.sex}"></c:out>

14              <li><c:remove var="age"/>

15              <li><c:out value="${sessionScope.name}"></c:out>

16              <li><c:out value="${sessionScope.age}"></c:out>

17              <li><c:out value="${sessionScope.sex}"></c:out>

18              </body>

19    </html>

【代碼解析】:

1)第8~9行使用set標籤向session中插入三個值:name值爲oliveage值爲25sex值爲男。

2)第11~13行使用outEL表達式輸出nameagesex的值。

3)第14行使用remove標籤移除age的值,而後使用步驟第11~13行中的三個輸出做爲比較。

4<c:catch>標籤

用來處理JSP頁面中產生的異常。並將異常信息存儲。

【語法】:

<c:catch var=」name1」>

easy產生異常的代碼

</c:catch>

【參數說明】:

var表示由用戶定義存取異常信息的變量的名稱。省略後也可以實現異常的捕獲,當就不能顯示的輸出異常信息。

【演示樣例代碼】:代碼9.7使用<c:catch></c:catch>標籤,並設計一個異常並輸出異常信息。

代碼9.7 <c:catch>標籤使用演示樣例:coredemo05.jsp

1       <%@ page language="java" pageEncoding="gbk"%>

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

3       <html>

4       <head>

5       <title>JSTL: -- catch標籤實例</title>

6       </head>

7       <body>

8       <h4>catch標籤實例</h4>

9       <hr>

10              <c:catch  var=」error」>

11     <       c:set target="Dank" property="hao"></c:set>

12              </c:catch>

13     <c:out value="${errors}"/>

14     </body>

15     </html>

【代碼解析】:

1)第10~12把easy產生異常的代碼放在<c:catch></c:catch>中。本身定義一個變量error用於存儲異常信息。

2)第11行實現了一段異常代碼,向一個不存在的JavaBean中插入一個值。

3)第13行用EL表達式獲得error的值。並使用<c:out>標籤輸出。

程序結果如圖所看到的。

9.5 coredemo05.jsp

圖中異常信息的提示爲:在<set>標籤中用不對的參數「hao」。假設不捕獲程序中的異常,也就是不使用<c:catch></c:catch>捕獲easy產生異常的代碼,將會出現如圖9.6所看到的,這是在開發中不一樣意的。

圖9.6 程序異常

提示:本演示樣例沒有使用捕獲Java腳本的樣式,假設使用標籤再使用Java腳本的意義不大。由此可以看出<c:catch/>主要用於頁面標籤產生的異常。

9.2.2 流程控制標籤

流程控制標籤主要用於對頁面簡單業務邏輯進行控制。流程控制標籤包括有4個:<c:if>標籤、<c:choose>標籤、<c:when>標籤和<c:otherwise>標籤。如下將介紹這些標籤的功能和使用方式。

1<c:if>標籤

<c:if>同程序中的if做用一樣,用來實現條件控制。

【語法1】:

<c:if test=」條件1」 var=」name」 [scope=」page|request|session|application」]>

【語法2】:

<c:if test=」條件2」 var=」name」[scope=」page|request|session|application」]>

【參數說明】:

1test屬性用於存放推斷的條件,通常使用EL表達式來編寫。

2var指定名稱用來存放推斷的結果類型爲truefalse

3scope用來存放var屬性存放的範圍。

【使用場景】:在開發中常常會出現不一樣用戶的權限。首先對username進行推斷(包含進行數據庫驗證,該功能可以由JavaBean實現,使用EL表達式獲得一個布爾型的結果),把推斷的結果存放在不一樣的JSP範圍內(比方常用的session內),這樣在每個頁面都可以獲得該用戶的權限信息。依據不一樣權限的用戶顯示不一樣的結果。

【演示樣例代碼】:代碼9.8實現了用戶輸入username提交到自身頁面。頁面推斷用戶是否爲admin,假設是將出現歡迎界面。假設不是顯示不一樣結果。

代碼9.8 <c:if>標籤使用演示樣例:coredemo06.jsp

1     <%@ page language="java" pageEncoding="gbk"%>

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

3     <html>

4     <head>

5     <title>JSTL: -- if標籤演示樣例</title>

6     </head>

7     <body>

8              <h4>if標籤演示樣例</h4>

9              <hr>

10              <form action="coredom06.jsp" method="post">

11              <input type="text" name="uname" value="${param.uname}">

12              <input type="submit" value="登陸">

13              </form>

14              <c:if test="${param.uname=='admin' }" var=」adminchock」>

15              <c:out value="管理員歡迎您!">

16              </c:out>

17              </c:if>

18              ${adminchock}

19</body>

20</html>

【代碼解析】:

1)第10~13行建立一個表單。表單中的元素爲一個text文本輸入框。一個提交button。並把信息提交給本頁。

2)第14行使用if標籤進行推斷。假設輸入的爲admin將顯示出定義的字符串,並把檢驗後的結果賦給adminchock,存儲在默認的page範圍中。

3)第18行使用EL表達式獲得adminchock的值。假設輸入的username爲admin將顯示true

程序執行效果如圖9.7所看到的。

9.7 coredemo06.jsp執行結果

提示:可以把adminchock的屬性範圍設置爲session。可以在其它的頁面中獲得adminchock的值。使用<c:if text=」${adminchock}」><c:if>推斷。實現不一樣的權限。

2<c:choose><c:when><c:otherwise>標籤

3個標籤一般狀況下是一塊兒使用的,<c:choose>標籤做爲<c:when><c:otherwise>標籤的父標籤來使用。

【語法1】:

<c:choose>

         <c:when>

…..//業務邏輯1

         <c:otherwise>

…..//業務邏輯2

         <c:otherwise>

….//業務邏輯3

</c:choose>

【語法2】:

<c:when text=」條件」>

表達式

</c:when>

【語法3】:

<c:otherwise>

表達式

</c:otherwise>

【參數說明】:

1)語法13個標籤的嵌套使用方式,<c:choose>標籤僅僅能和<c:when>標籤共同使用。

2)語法2<c:when>標籤的使用方式。該標籤都條件進行推斷。普通狀況下和<c:choose>共同使用。

3<c:otherwise>不含有參數,僅僅能跟<c:when>共同使用,並且在嵌套中僅僅贊成出現一次。

【演示樣例代碼】:代碼9.9設定一個score變量的值爲85,使用嵌套標籤進行推斷。依據推斷返回結果。

代碼9.9 循環控制標籤:coredemo07.jsp

1     <%@ page language="java" pageEncoding="gbk"%>

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

3     <html>

4     <head>

5              <title>JSTL: -- choose及其嵌套標籤標籤演示樣例</title>

6     </head>

7     <body>

8              <h4>choose及其嵌套標籤演示樣例</h4>

9     <hr>

10              <c:set var="score">85</c:set>

11              <c:choose>

12              c:when test="${score>=90}">

13              你的成績爲優秀!

14              </c:when>

15              <c:when test="${score>=70&&score<90}">

16              您的成績爲良好!

17              </c:when>

18              <c:when test="${score>60&&score<70}">

19              您的成績爲及格

20              </c:when>

21              <c:otherwise>

22              對不起,您沒有經過考試!

23              </c:otherwise>

24              </c:choose>

25              </body>

26     </html>

【代碼解析】:

1)第10行經過set標籤設定score的值爲85

2)第12~22行使用<c:when>進行條件推斷。假設大於等於90。輸出「您的成績爲優秀」;

假設大於等於70小於90。輸出「您的成績爲良好」。大於等於60小於70。輸出「您的成績爲及格」;其它(otherwise)輸出「對不起。您沒能經過考試」。

程序執行結果如圖9.8所看到的。

9.8 coredemo07.jsp執行結果

9.2.3 循環標籤

循環標籤主要實現迭代操做。

主要包括兩個標籤:<c:forEach><c:forTokens>標籤。接下來將具體介紹這兩個標籤的使用方法。

1<c:forEach>標籤

該標籤依據循環條件遍歷集合(Collection)中的元素。

【語法】:

<c:forEach var=」name」 items=」Collection」 varStatus=」StatusName」 begin=」begin」 end=」end」 step=」step」>

本體內容

</c:forEach>

【參數解析】:

1var設定變量名用於存儲從集合中取出元素。

2items指定要遍歷的集合。

3varStatus設定變量名,該變量用於存放集合中元素的信息。

    

4beginend用於指定遍歷的起始位置和終止位置(可選)。

5step指定循環的步長。

參數類型和相關說明見表9-1

9-1 循環標籤屬性說明

名稱

EL

類型

是否必須

默認值

var

N

String

items

Y

Arrays

Collection

Iterator

Enumeration

Map

String []args

begin

Y

int

0

end

Y

int

集合中最後一個元素

step

Y

int

1

varStatus

N

String

當中varStatus4個狀態屬性(見表9-2)。

9-2 varStatus4個狀態

屬性名

類型

說明

index

int

當前循環的索引值

count

int

循環的次數

frist

boolean

是否爲第一個位置

last

boolean

是否爲第二個位置

【演示樣例代碼】:代碼9.10實現了遍歷的兩種方式:設定起始位置、不設定起始位置。同一時候實現了得到原屬的狀態信息。

代碼9.10 <c:forEach>標籤使用演示樣例:coredemo08.jsp

1     <%@ page contentType="text/html;charset=GBK" %>

2     <%@page import="java.util.List"%>

3     <%@page import="java.util.ArrayList"%>

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

5     <html>

6     <head>

7              <title>JSTL: -- forEach標籤實例</title>

8     </head>

9     <body>

10     <h4><c:out value="forEach實例"/></h4>

11     <hr>

12              <%

13                       List a=new ArrayList();

14                       a.add("貝貝");

15                       a.add("晶晶");

16                       a.add("歡歡");

17                       a.add("瑩瑩");

18                        a.add("妮妮");

19              request.setAttribute("a",a);

20              %>

21              <B><c:out value="不指定beginend的迭代:" /></B><br>

22             <c:forEach var="fuwa" items="${a}">

23             &nbsp;<c:out value="${fuwa}"/><br>

24              </c:forEach>

25              <B><c:out value="指定beginend的迭代:" /></B><br>

26              <c:forEach var="fuwa" items="${a}" begin="1" end="3" step="2">

27              &nbsp;<c:out value="${fuwa}" /><br>

28              </c:forEach>

29              <B><c:out value="輸出整個迭代的信息:" /></B><br>

30              <c:forEach var="fuwa" items="${a}" begin="3" end="4" step="1" varStatus="s">

31              &nbsp;<c:out value="${fuwa}" />的四種屬性:<br>

32              &nbsp;&nbsp;所在位置,即索引:<c:out value="${s.index}" /><br>

33              &nbsp;&nbsp;總共已迭代的次數:<c:out value="${s.count}" /><br>

34              &nbsp;&nbsp;是否爲第一個位置:<c:out value="${s.first}" /><br>

35              &nbsp;&nbsp;是否爲最後一個位置:<c:out value="${s.last}" /><br>

36              </c:forEach>

37     </body>

38     </html>

【代碼解析】:

1)第13~18行經過Java腳本建立了一個集合對象a。並加入元素。

2)第19行使用setAttribute()方法把集合存入request範圍內。

3)第22~24行未指定beginend屬性,直接從集合開始遍歷到集合結束爲止。

4)第26~28行指定從集合的第二個(index值爲1)元素開始,到第四個(index值爲3)元素截止(index的值從0開始)。

並指定step2即每隔兩個遍歷一次。

5)第30~35指定varStatus的屬性名爲s,並取出存儲的狀態信息。

程序執行結果如圖9.9所看到的。

9.9 coredemo08.jsp執行結果

【總結】:

1)從圖中可以看到不使用beginend的迭代。從集合的第一個元素開始。遍歷到最後一個元素。

2)指定begin的值爲1end的值爲3step的值爲2,從第二個開始首先獲得晶晶。每兩個遍歷一次。則下一個顯示的結果爲瑩瑩。end3則遍歷結束。

3)從指定的beginend的值來看遍歷第四個和第五個,因獲得瑩瑩和妮妮。相關狀態信息如圖所看到的。

提示:本例使用的list是在JSP頁面中使用Java腳本建立的,是因爲JSTL缺乏建立集合的功能,在開發中通常不會如此,可經過訪問數據庫獲得數據集合。和經過設定JavaBean的值獲得數據集合

2<c:forTokens>

該標籤用於瀏覽字符串,並依據指定的字符將字符串截取。

語法:

<c:forTokens items=」strigOfTokens」 delims=」」delimiters [var=」name」 begin=」begin」 end=」end」 step=」len」 varStatus=」statusName」] >

【參數說明】

1items指定被迭代的字符串。

2delims指定使用的分隔符。

3var指定用來存放遍歷到的成員。

4begin指定遍歷的開始位置(int型從取值0開始)。

5end指定遍歷結束的位置(int型,默認集合中最後一個元素)。

6step遍歷的步長(大於0的整型)。

7varStatus存放遍歷到的成員的狀態信息。

【演示樣例代碼】:代碼9.11實現了遍歷一個有符號的字符串,把指定的符號移除。指定beginend值。並得到遍歷到的元素的狀態信息。

代碼9.11 <c:forTokens>標籤的演示樣例:coredemo09.jsp

1     <%@ page contentType="text/html;charset=GBK" %>

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

3     <html>

4     <head>

5              <title>JSTL: -- forTokens標籤實例</title>

6     </head>

7     <body>

8     <h4><c:out value="forToken實例"/></h4>

9     <hr>

10              <c:forTokens items="北、京、歡、迎、您" delims="" var="c1">

11              <c:out value="${c1}"></c:out>

12              </c:forTokens><br>

13              <c:forTokens items="123-4567-8854" delims="-" var="t">

14              <c:out value="${t}"></c:out>

15             </c:forTokens><br>

16    <c:forTokens items="1*2*3*4*5*6*7" delims="*" begin="1" end="3" var="n" varStatus="s">

17              &nbsp;<c:out value="${n}" />的四種屬性:<br>

18              &nbsp;&nbsp;所在位置。即索引:<c:out value="${s.index}" /><br>

19              &nbsp;&nbsp;總共已迭代的次數:<c:out value="${s.count}" /><br>

20              &nbsp;&nbsp;是否爲第一個位置:<c:out value="${s.first}" /><br>

21              &nbsp;&nbsp;是否爲最後一個位置:<c:out value="${s.last}" /><br>

22     </c:forTokens>

23    </body>

24     </html>

【代碼解析】:

1)本演示樣例共實現了3<c:forToken>循環,10~12行第一個循環實現了遍歷給定字符串「北、京、歡、迎、您」,併除去循環中遇到的「、」號。

213~15行第2個循環遍歷一串帶有分隔符的電話號碼,不讀取分隔符號,將顯示一個字符串。

316~22行第3個循環遍歷一個帶「*」號的字符串,依據指定的起始位置把元素取出,並顯示每個元素的狀態信息。

提示:分隔符的做用是依據標識,截取字符串。假設未設定分隔符或在字符串中沒有找到分隔付。將把整個元素做爲一個元素截取。在實際應用中用於在除去某些符號在頁面中顯示。

程序執行結果如圖9.10所看到的。

9.10 coredemo08.jsp

<c:forToken>的屬性varStatus的使用同<c:forEach>的用法一樣,在此就再不表述。

9.2.4 URL操做標籤

JSTL包括3個與URL操做有關的標籤。分別爲:<c:import><c:redirect><c:url>標籤。它們的做用爲:顯示其它文件的內容、網頁導向、產生URL

如下將具體介紹這3個標籤的用法。

1<c:import>標籤

該標籤可以把其它靜態或動態文件包括到本JSP頁面。同<jsp:include>的差異爲:僅僅能包括同一個web應用中的文件。

而<c:import>可以包括其它web應用中的文件,甚至是網絡上的資源。

語法1

<c:import url=」url」 [context=」context」][ value=」value」]

[scope=」page|request|session|application」] [charEncoding=」encoding」]>

語法2

<c:import url=」url」 varReader=」name」 [context=」context」][charEncoding=」encoding」]>

主要參數見表9-3

9-3 <c:import>標籤參數說明

名稱

說明

EL

類型

必須

默認值

url

被導入資源的URL路徑

Y

String

context

一樣server下其它的webproject。必須以「"」開頭

Y

String

var

String類型存入被包括文件的內容。

N

String

Scope

var變量的JSP範圍

N

String

page

charEncoding

被導入文件的編碼格式

Y

String

varReader

Reader類型存儲被包括文件內容

N

String

【參數說明】:

1URL爲資源的路徑。當應用的資源不存在時系統會拋出異常,所以該語句應該放在<c:catch></c:catch>語句塊中捕獲。應用資源有兩種方式:絕對路徑和相對路徑。

使用絕對路徑示比例如如下:

<c:import url=」http://www.baidu.com」>

使用相對路徑的實比例如如下:

<c:import url=」aa.txt」>

aa.txt放在同一文件文件夾。

假設以「/」開頭表示應用的根文件夾下。好比:tomcat應用程序的根文件夾文件夾爲webapps

導入webapps下的文件bb.txt的編寫方式爲:

<c:import url=」/bb.txt」>

假設訪問webapps管理目錄中其它web應用就要用context屬性。

2context屬性用於在訪問其它web應用的文件時,指定根文件夾。好比,訪問root下的index.jsp的實現代碼爲:

<c:import url=」/index.jsp」 context=」/root」>

等同於webapps/root/index.jsp

3varscopecharEncodingvarReader是可選屬性。詳細使用方式見演示樣例代碼。

【演示樣例代碼】:代碼9.12實現了從絕對路徑導入文件和從相對路徑導入,同一時候使用var對象指定用變量來存儲文件,並輸出存入的文件內容。

代碼9.12 <c:import>標籤演示樣例:coredemo10.jsp

1     <%@ page contentType="text/html;charset=GBK" %>

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

3     <html>

4     <head>

5              <title>JSTL: -- import標籤實例</title>

6     </head>

7     <body>

8     <h4><c:out value="import實例"/></h4>

9     <hr>

10     <h4><c:out value="絕對路徑引用的實例" /></h4>

11     <c:catch var="error1">

12     <c:import url="http://www.baidu.com"/>

13    </c:catch>

14    <c:out value="${error1}"></c:out>

15    <hr>

16     <h4>

17     <c:out value="相對路徑引用的實例,引用本應用中的文件" /></h4>

18     <c:catch>

19     <c:import url="a1.txt" charEncoding="gbk"/>

20     </c:catch>

21     <hr>

22     <h4><c:out value="使用字符串輸出、相對路徑引用的實例,並保存在session範圍內" /></h4>

23     <c:catch var="error3">

24     <c:import var="myurl" url="a1.txt" scope="session" charEncoding="gbk"></c:import>

25     <c:out value="${myurl}"></c:out>

26     <c:out value="${myurl}" />

27     </c:catch>

28     <c:out value="${error3}"></c:out>

29     </body>

30     </html>

【代碼解析】:

1)第12行使用絕對路徑導入百度首頁,導入時使用<c:catch></c:catch>1112行)捕獲異常。

2)使用相對路徑導入同一目錄下的a1.txt文件,接收的字符編碼格式使用charEncoding設置爲gbk

3)相同導入a1.txt,不一樣的時使用var定義的變量接收要導入的文件,並存儲在session中,假設在其它頁面相同也要導入該文件,僅僅須使用<c:out>輸出a1.txt的值就能夠。

程序結果如圖9.11所看到的。

9.11 coredemo10.jsp執行結果

【說明】:

1)在使用絕對路徑導入時,因爲電腦沒有聯網因此拋出異常。

2)使用相對路徑輸出時,相同是引入的a1.txt文件顯示的結果卻不相同,這可以說明直接使用<c:import>導入,不設定var參數是直接在頁面中顯示的文本信息。而使用var參數輸出時輸出的實現存入的字符串。

提示:讀者在練習時可以使用Tomcat的首頁來導入url=」http://127.0.0.1:8080」來顯示效果。

2<c:redirect>標籤

該標籤用來實現了請求的重定向。同一時候可以在url中增長指定的參數。好比:對用戶輸入的username和password進行驗證。假設驗證不成功重定向到登陸頁面;或者實現web應用不一樣模塊之間的銜接。

【語法1】:

<c:redirect url=」url」 [context=」context」]>

【語法2】:

<c:redirect url=」url」[context=」context」]>

<c:param name=」name1」 value=」value1」>

</c:redirect>

【參數說明】:

1url指定重定向頁面的地址,可以是一個string類型的絕對地址或相對地址。

2)用於導入其它web應用中的頁面。

【演示樣例代碼】:代碼9.13實現了當請求頁面時重定向到tomcat首頁。

代碼9.13 <c:redirect>標籤演示樣例:coredemo11.jsp

<%@ page contentType="text/html;charset=GBK" %>

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

<c:redirect url="http://127.0.0.1:8080">

<c:param name="uname">olive</c:param>

<c:param name="password">01234</c:param>

</c:redirect>

【代碼解析】

1)使用重定向與加載頁面不一樣。加載頁面時在本頁面中插入其它頁面,而重定向是請求轉發。等於在頁面中又一次輸入了一次url。當重定向到某個頁面時瀏覽器中的地址會發生變化。

2)使用重定向時不用使用<c:catch>語句。當輸入頁面訪問不到時。瀏覽器會報錯,跟程序執行無關。

假設使用重定向時頁面定義的內容將不會獲得顯示。

3)在重定向時爲URL加入了兩個參數和參數值:uname=olivepassword=01234

程序執行結果如圖9.12所看到的。

9.12 coredemo11.jsp執行結果

提示:注意圖中的URL地址已經發生轉變,同一時候可以看到傳入的參數以參數值。

3<c:url>標籤

該標籤用於動態生成一個String類型的URL,可以同<c:redirect>標籤共同使用,也可以使用html<a>標籤實現超連接。

【語法1】:指定一個url不作改動,可以選擇把該url存儲在JSP不一樣的範圍中。

<c:url value=」value」 [var=」name」][scope=」page|request|session|application」]

[context=」context」]/>

【語法2】:給url加上指定參數及參數值,可以選擇以name存儲該url

<c:url value=」value」 [var=」name」][scope=」page|request|session|application」]

[context=」context」]>

<c:param name=」參數名」 value=」」>

</c:url>

【演示樣例代碼】:代碼9.14實現了使用動態生成url實現了網頁的超連接。

代碼9.14 <c:url>標籤演示樣例:coredemo12.jsp

<%@ page contentType="text/html;charset=GBK" %>

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

<c:out value="url標籤使用"></c:out>

<h4>使用url標籤生成一個動態的url,並把值存入session.</h4>

<hr>

<c:url value="http://127.0.0.1:8080" var="url" scope="session">

</c:url>

<a href="${url}">Tomcat首頁</a>

程序執行結果如圖9.13所看到的。

9.13 coredemo12.jsp執行結果

單擊圖中超連接可以直接訪問到Tomcat首頁。

9.3 I18N格式標籤庫

JSTL標籤提供了對國際化(I18N)的支持,它可以依據發出請求的client地域的不一樣來顯示不一樣的語言。

同一時候還提供了格式化數據和日期的方法。實現這些功能需要I18N格式標籤庫(I18N-capable formation tags liberary)。引入該標籤庫的方法爲:

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

I18N格式標籤庫提供了11個標籤,這些 標籤從功能上可以劃分爲3類例如如下:

1)數字日期格式化。formatNumber標籤、formatData標籤、parseNumber標籤、parseDate標籤、timeZone標籤、setTimeZone標籤。

2)讀取消息資源。

bundle標籤、message標籤、setBundle標籤。

3)國際化。setlocale標籤、requestEncoding標籤。

接下將具體介紹這些標籤的功能和使用方式。

9.3.1 數字日期格式化

數字日期格式化標籤共同擁有6個,用來將數字或日期轉換成設定的格式。

1<frm:formatNumber/>標籤

該標籤根據特定的區域將數字改變爲不一樣的格式來顯示。

【語法1】:

<frm:formatNumber value=」被格式化的數據」[type=」number|currency|percent」]

                                               [pattern=」pattern」]

                                               [currencyCode=」code」]

                                               [currencySymbol=」symbol」]

                                               [groupingUsed=」true|false」]

                                               [maxIntergerDigits=」maxDigits」]

                                               [minIntergerDigits=」minDigits」]

                                               [maxFractionDigits=」maxDigits」]

                                               [minFractionDigits=」minDigits」]

                                               [var=」name」]

                                               [scope=page|request|session|application]

/>

【語法2】:

<frm:formatNumber [type=」number|currency|percent」]

                                               [pattern=」pattern」]

                                               [currencyCode=」code」]

                                               [currencySymbol=」symbol」]

                                               [groupingUsed=」true|false」]

                                               [maxIntergerDigits=」maxDigits」]

                                               [minIntergerDigits=」minDigits」]

                                               [maxFractionDigits=」maxDigits」]

                                               [minFractionDigits=」minDigits」]

                                               [var=」name」]

                                               [scope=page|request|session|application]

被格式化的數據

<frm:formatNumber>

屬性說明如表9-4所看到的。

9-4 <fmt:formatNumber>標籤參數說明

名稱

說明

EL

類型

必須

默認值

value

要格式化的數據

String

type

指定類型(單位、貨幣、百分比等)見表

String

number

pattern

格式化的數據樣式

String

currencyCode

貨幣單位代碼

String

cuttencySymbol

貨幣符號($、¥)

String

groupingUsed

是否對整數部分進行分組如(9999

boolean

true

maxIntergerDigits

整數部分最對顯示多少位數

int

minIntergerDigits

整數部分最少顯示多少位

int

maxFractionDigits

小數部分最多顯示多少位

int

minFractionDigits

小數部分最少顯示多少位

int

var

存儲格式化後的數據

String

scope

varJSP範圍

String

page

Type屬性的類型應用見表9-5.

9-5 Type的屬性類型

類型

說明

演示樣例

number

數字格式

0.8

currency

當地貨幣

0.80

percent

百分比格式

80%

【演示樣例代碼】:代碼9.14實現了對數字的格式化、貨幣的格式、貨幣的格式化。使用<frm:formatNumber>的各類屬性的設定。

代碼9.14 <fmt:formatNumber>標籤演示樣例:fmtdemo01.jsp

<%@ page language="java" pageEncoding="gbk"%>

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

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

<html>

 <head>     

    <title>I18N標籤庫</title>

 </head>

 <body>

 <h4 align="center"><c:out value="<frm:number>標籤的使用"></c:out></h4>

 <hr>

 <table border=1 cellpadding="0" cellspacing="0" align="center">

 <tr align="center">

<td width="100">類型 </td>

<td width="100">使用數據</td>

<td width="100">結果</td>

<td width="300">說明</td>

 </tr>

 <tr>

 <td>數字格式化</td><td>108.75</td>

 <td><fmt:formatNumber type="number" pattern="###.#">108.75</fmt:formatNumber></td>

 <td>使用pattern可以定義顯示的樣式。本例設定爲###.#小數部分將使用四捨五入法。

</td>

 </tr>

 <tr>

 <td>數字格式化</td><td>9557</td>

 <td><fmt:formatNumber type="number" pattern="#.####E0">9557</fmt:formatNumber></td>

 <td>使用科學計數法。</td> 

 </tr>

 <tr>

 <td>數字格式化</td><td>9557</td>

 <td><fmt:formatNumber type="number" >9557</fmt:formatNumber></td>

 </td>

 <td>使用默認分組。</td>

 </tr>

 <tr>

 <td>數字格式化</td><td>9557</td>

 <td><fmt:formatNumber type="number" groupingUsed="false" >9557</fmt:formatNumber></td>

 <td>不使用分組。

</td>

 </tr>

 <tr>

 <td>數字格式化</td><td>9557</td>

 <td><fmt:formatNumber type="number" maxIntegerDigits="3">9557</fmt:formatNumber></td>

 <td>使用位數限定,依據指定的位數顯示。其它數字忽略。好比:9不被顯示。</td>

 </tr>

 <tr>

 <td>百分比格式化</td><td>0.98</td>

 <td><fmt:formatNumber type="percent">0.98</fmt:formatNumber></td>

 <td>用百分比形式顯示一個數據。

</td>

 </tr>

 <tr>

 <td>貨幣格式化</td><td>188.88</td>

 <td><fmt:formatNumber type="currency" >188.8</fmt:formatNumber></td>

<td>將一個數據轉化爲貨幣形式輸出。</td>

 </tr>

 <tr>

 <td>存儲數據</td><td>188.88</td>

 <td><fmt:formatNumber type="currency" var="money">188.8</fmt:formatNumber>

 <c:out value="${money}"></c:out>

 </td>

 <td>存儲的money的值爲${money} </td>

 </tr>

 </table>

 </body>

</html>

【代碼說明】:

1)從應用角度可以把屬性分爲三類:數字格式化、貨幣格式化、百分比格式化。使用type指定類型。

2)應用於數字格式化的屬性有:partten屬性、maxIntegerDigits屬性、minIntegerDigits屬性、maxFractionDigits屬性和minFactionDigits屬性。當中partten屬性在設定格式化樣式時會比較準確如:四捨五入、科學計數法的使用。

而使用maIntegerDirgits等屬性時,僅僅把設定位數之外的數字捨去。

3)貨幣格式化可以使用數字格式化的所有屬性。

假設有必要建議使用partten屬性。currencyCode屬性和currencySymbol僅僅用於貨幣格式化。

4)百分比格式化使用到的屬性爲type屬性、partten屬性。設定type屬性的類型爲percent就能夠。

5)使用var屬性時。會將格式化後的值存在JSP的某個範圍內(一個String類型的字符串包含符號等)。<frm:forNumber>將再也不輸出格式化後的值可以使用EL表達式輸出。

6)通用屬性:type屬性、partten屬性、var屬性和scope屬性。

程序執行結果如圖9.14所看到的。

9.14 fmtdemo01.jsp執行結果

提示:假設給定的數據類型有錯誤將或產生異常。好比:給定的數據爲aa進行類型轉化,將使應用程序沒法顯示。

所以在實際應用中顯示的格式化應該放入<c:catch/>語句中。

2<frm:parseNumber>標籤

將格式化後的數字、貨幣、百分比都轉化爲數字類型。

【語法1】:

<fmt:parseNumber value="number" [type=」number|currency|percent」]

                                                        [pattern=」pattern」]

                                                        [parseLocale=」locale」]                       

                                                        [intergerOnly=」true|false」]

                                                        [scope=」page|request|session|application」]

/>

【語法2】:

<fmt:parseNumber [type=」number|currency|percent」]

                                                        [pattern=」pattern」]

                                                        [parseLocale=」locale」]

                                                        [intergerOnly=」true|false」]

                                                        [scope=」page|request|session|application」]

Number

</fmt:parseNumber>

屬性說明見表9-6

9-6 <fmt:parseNumber>標籤參數說明

名稱

說明

EL

類型

是否必須

默認值

value

被解析的字符串

String

type

指定單位(數字、貨幣、百分比)

String

number

pattern

格式樣式

String

parseLocale

用來替代默認區域的設定

String

Java.util.

Locale

默認本地樣式

var

存儲已經格式化的數據

String

scope

var變量的做用域

String

page

<fmt:parseNumber>可以看做是<fmt:formatNumber>的逆運算。對應的參數和類型的配置和使用<fmt:formatNumber>格式化時一樣。

【演示樣例代碼】:代碼9.15實現了從字符串中提取數據,並用合適的數據類型進行存儲(浮點性、整型等)。可以對轉換後的數據進行加法運算。

代碼9.15 <fmt:parseNumber>標籤演示樣例:fmtdemo02.jsp

<%@ page language="java" pageEncoding="gbk"%>

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

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

<html>

 <head>

 <title>I18N標籤庫</title>

 </head>

 <body>

 <h4 ><c:out value="<frm:parseNumber>標籤的使用"></c:out></h4>

 <hr>

 </body>

 <fmt:formatNumber type="currency" var="money">188.8</fmt:formatNumber>

 <li>格式化前的數據爲:<c:out value="${money}"></c:out>

 <fmt:parseNumber var="money" type="currency">${money}</fmt:parseNumber>

 <li>格式化後的數據爲:<c:out value="${money}"></c:out>

 <li>可以對格式化的後的數據進行運算: 

 <c:out value="${money+200}"></c:out>

 <li>對百分比進行格式化98%爲:

 <fmt:parseNumber type="percent">98%</fmt:parseNumber>

</html>

【代碼解析】:

1)首先使用<fmt:formatNumber>188.8轉換爲字符串¥188.8並在page範圍內存儲一個String類型的變量。變量名爲money

2)使用<fmt:parseNumber>將¥188.8轉化爲浮點型的數據188.8並賦值爲變量money

則變量money轉變爲一個浮點型的值188.8,對188.8進行加運算。

3)直接對一個百分比數98%進行轉化。

程序執行結果如圖9.15所看到的。

9.15 fmtdemo02.jsp執行結果

提示:<fmt:parseNumber>屬性參數的配置和使用同<fmt:formatNumber>標籤使用的方式同樣。同一時候。在進行類型轉換時假設給出的類型不對將會出現異常。好比在進行百分比轉化時假設沒有給type類型或者給出type類型但提供的數據中沒有%都會產生異常。所以在實際應用中用<c:catch/>捕獲異常。

3<fmt:formatDate>標籤

該標籤主要用來格式化日期和時間。

【語法】:

<fmt: formatDate value=」date」 [type=」time|date|both」]

                                     [pattern=」pattern」]

                                     [dateStyle=」default|short|medium|long|full」]

                                     [timeStyle=」default|short|medium|long|full」]

                                     [timeZone=」timeZone」]

                                     [var=」name」]

                                     [scope=」page|request|session|application」]

/>

參數說明見表9-7

9-7 <fmt:formatDate>標籤屬性說明

屬性名

說明

EL

類型

必須

默認值

value

將要格式化的日期對象。

Java.util.Date

type

顯示的部分(日期、時間或者二者)。

String

date

partten

格式化的樣式。

String

dateStyle

設定日期的顯示方式。

String

default

timeStyle

設定時間的顯示方式。

String

default

timeZone

設定使用的時區。

String

當地所用時區

var

存儲已格式化的日期或時間。

String

scope

指定var存儲的JSP範圍。

String

當中type屬性參數說明見表9-8

9-8 type屬性參數說明

參數名

說明

time

僅僅顯示時間

date

僅僅顯示時期

both

顯示日期和時間

【演示樣例程序】:代碼9.16實現了對日期的格式化,使用了typedateStyletimeStyle等屬性。

代碼9.16 <fmt:formatDate>標籤演示樣例:fmtdemo03.jsp

<%@ page language="java" pageEncoding="gbk"%>

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

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

<jsp:useBean id="date" class="java.util.Date"></jsp:useBean>

<html>

 <head>  

    <title>I18N標籤庫</title>

 </head>

 <body>

<fmt:formatDate value="${date}"></fmt:formatDate><br>

<fmt:formatDate value="${date}" type="both"></fmt:formatDate><br>

<fmt:formatDate value="${date}" type="both" dateStyle="default"

 timeStyle="default"></fmt:formatDate><br>

   <fmt:formatDate value="${date}" type="both" dateStyle="short"

 timeStyle="short"></fmt:formatDate><br>

   <fmt:formatDate value="${date}" type="both" dateStyle="long"

 timeStyle="long"></fmt:formatDate><br>

   <fmt:formatDate value="${date}" type="both" dateStyle="full"

timeStyle="full"></fmt:formatDate><br>

   <fmt:formatDate value="${date}" type="both" dateStyle="full"

timeStyle="full"></fmt:formatDate><br>

   </body>

</html>

【代碼解析】:

1)首先經過配置JavaBean在頁面上實例化java.util.Date對象。實現代碼例如如下:

<jsp:useBean id="date" class="java.util.Date"></jsp:useBean>

2)對日期對象進行格式化時${date}是一個日期對象。假設給value設的值爲String時程序會報錯。

3)設置typeboth時。將顯示日期和時間,同一時候演示樣例中依次改變dateStyletimeStyle的值做爲比較。

程序結果如圖9.16所看到的。

9.16 fmtdemo03.jsp

使用IE的語言標籤可以設置語言種類如圖9.17所看到的。

9.17 改變使用默認語言

語言設爲英文是程序效果如圖9.18所看到的。

9.18 語言爲英文狀態下的顯示

4<fmt:parseDate>標籤

<fmt:parseDate>標籤主要將字符串類型的時間或日期轉化爲時間或日期對象。

【語法1】:

<fmt:parseDate value=」date」 [type=」time|date|both」]

                                                        [pattern=」pattern」]

                                                        [parseLocale=」locale」]

                                                        [dateStyle=」default|short|medium|long|full」]

                                                        [timeStyle=」default|short|medium|long|full」]

                                                        [timeZone=」timezone」]

                                                        [var=」name」]

                                                        [scope=」page|request|session|application」]

/>

【語法2】:

<fmt:parseDate [type=」time|date|both」]

                                                        [pattern=」pattern」]

                                                        [parseLocale=」locale」]

                                                        [dateStyle=」default|short|medium|long|full」]

                                                        [timeStyle=」default|short|medium|long|full」]

                                                        [timeZone=」timezone」]

                                                        [var=」name」]

                                                        [scope=」page|request|session|application」]

Date

</fmt:parseDate>

【參數說明】參數說明見表9-9.

9-9 <fmt:parseData>標籤屬性說明

屬性名

說明

EL

類型

必須

默認值

value

將要格式化的日期時間

String

type

字符串的類型(日期、時間或全部)

EL

String

date

pattern

字符串使用的時間樣式

String

parseLocale

代替默認地區設定

String

默認地區

dateStyle

字符串使用的日期顯示方式

String

default

timeStyle

字符串使用的時間顯示格式

String

default

timeZone

使用的時區

String

當地區時

var

使用var定義的名字保存對象

String

scope

varJSP範圍

String

page

【演示樣例代碼】:代碼9.16實現了下面功能:首先,使用了<fmt:formatDate>把一個日期對象格式化成一個日期的字符串,並把該字符串以參數名爲a存儲page範圍內。

其次,使用<fmt:parseDate>方法把a的值(字符串)格式化成一個Date並以參數名爲b存儲在page範圍內。最後,使用Java腳本證實生成的b爲對象。

代碼9.16<fmt:formatDate>標籤演示樣例:fmtdemo04.jsp

<%@ page language="java" pageEncoding="gbk"%>

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

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

<jsp:useBean id="date" class="java.util.Date"></jsp:useBean>

<html>

 <head>  

    <title>I18N標籤庫</title>

 </head>

 <body>

   <H4><c:out value="<frm:parseDate>標籤的使用"></c:out></H4>

   <hr>

<fmt:formatDate value="${date}" var="a" type="both"

dateStyle="full" timeStyle="full"></fmt:formatDate>

<fmt:parseDate var="b" type="both" dateStyle="full" timeStyle="full">

${a}

</fmt:parseDate>

   <%

   out.println(pageContext.getAttribute("b").toString());

   out.println("<br>");

   out.println(pageContext.getAttribute("b").hashCode());

   %>

   </body>

</html>

【代碼解析】:

1)使用<fmt:formatDate>把日期對象格式化成字符串。

2)使用<fmt:parseDate>把字符串對象轉化爲日期對象,注意同(1)中的參數對照。可以發現二者是一個互逆的過程。

3)使用Java腳本進行測試Date對象的toString()方法可以輸出時間字符串。

hashCode()可以獲得一個對象的hashCode。該方法僅僅能應用於對象。所以可以證實獲得的是一個日期對象。

程序執行結果如圖9.19所看到的。

9.19 fmtdemo04.jsp

提示:<fmt:formatDate><fmt:parseDate>是相反的運算過程,可以對比學習。

本例中的Java腳本的做用是爲了證實生成的的確是一個對象。

5<fmt:setTimeZone>標籤

該標籤用於設定默認時區或者將時區存儲在指定的JSP範圍內。

【語法】:

<fmt:setTimeZone value=」value」 [var=」name」][scope=」page|request|session|application」]/>

【參數說明】:見表9-10

9-10 <fmt:setTimeZone>標籤屬性說明

參數名

說明

EL

類型

必須

默認值

value

使用的時區

String

Java.util.TimeZone

var

使用var定義的參數名保存值

String

scope

存儲varJSP範圍

String

page

value用來設定使用的時區,好比中國使用的時區爲CST。其它的還有ESTPST等。

可以把時區存儲在指定的JSP範圍內,好比存儲在session中,用戶訪問的所有頁面都可以顯示使用的設定的時區下相應的時間。

【演示樣例代碼】

<fmt:setTimeZone value=」EST」 scope=」session」/>

提示:有關TimeZone的說明見JDK幫助文檔的java.util.TimeZone類。

6<fmt:timeZone>標籤

該標籤主要用於設置標籤體內使用的時區。

【語法】:

<fmt:timeZone value=」timeZone」>

…..

</fmt:timeZone>

使用<fmt:timeZone></fmt:timeZone>僅僅會應用到標籤體內使用的時區,對標籤外部將不產生影響。

9.3.2 讀取消息資源

讀取消息資源用到的標籤主要有4個:<fmt:message>標籤、<fmt:param>標籤、<fmt:bundle>標籤和<fmt:setBundle>標籤。主要用於從資源文件裏讀取信息。

1<fmt:bundle>標籤

該標籤主要用於將資源文件綁定於它的標籤體中的顯示。

【語法】:

<fmt:bundle basename=」name」[prefix=」prefix」]>

….標籤主題

</fmt:bundle>

【參數說明】:見表9-11

9-11 <fmt:bundle>標籤屬性說明

參數名

說明

EL

類型

必須

默認值

basename

指定使用的資源文件的名稱

String

prefix

前置keyword

String

2<fmt:setBundle>標籤

該標籤主要用於綁定資源文件或者把資源文件保存在指定的JSP範圍內。

【語法】:

<fmt:setBundle basename=」name」 [var=」name」]

                                     [scope=」page|request|session|application」]

【參數說明】:見表9-12

9-12 <fmt:setBundle>標籤屬性說明

參數名

說明

EL

類型

必須

默認值

basename

指定使用的資源文件的名稱

String

var

指定將資源文件保存的名稱

String

scope

設定將資源文件保存的JSP範圍

String

page

3<fmt:message>標籤

該標籤主要負責讀取本地資源文件,從指定的消息文本資源文件裏讀取鍵值,並且可以將鍵值保存在指定的JSP範圍內。

【語法1】:

<fmt:message key=」keyName」[bundle=」bundle」]

                                     [scope=」page|request|session|application」]

/>

【語法2】:

<fmt:message key=」keyName」[bundle=」bundle」]

                                     [scope=」page|request|session|application」]

<fmt:param/>

</fmt:message>

【語法3】:

<fmt:message key=」keyName」[bundle=」bundle」]

                                                        [scope=」page|request|session|application」]

key<fmt:param/>

</fmt:message>

【參數說明】:見表9-13

9-13 <fmt:message>標籤屬性說明

參數名

說明

EL

類型

必須

默認值

key

指定鍵值的名稱(索引)

String

bundle

指定消息文本的來源

LocalizationContext

var

指定存儲鍵值的變量名

String

scope

指定var的做用域

String

page

提示:建議此處的bundle使用EL表達式,因爲屬性bundle的類型爲LocalizationContext,而不是一個String類型的URL

【演示樣例代碼】:代碼9.17實現從指定的資源文件裏讀取相應key的值。

首先編寫一個資源文件內容下

name=olive

password=01234

使用標籤從資源文件裏讀取對應的值。

代碼9.17 <fmt:message>標籤演示樣例:fmtdemo05.jsp

<%@ page language="java" pageEncoding="gbk"%>

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

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

<jsp:useBean id="date" class="java.util.Date"></jsp:useBean>

<html>

 <head>  

    <title>I18N標籤庫</title>

 </head>

 <body>

   <H4><c:out value="資源文件讀取演示樣例"></c:out></H4>

   <hr>

   <fmt:bundle basename="message">

   <c:out value="message資源文件裏獲得的keyname的值爲:"></c:out>

   <fmt:message key="name" ></fmt:message>

   </fmt:bundle>

   <hr>

   <fmt:setBundle basename="message" var="m"/>

   <fmt:message key="password" bundle="${m}"></fmt:message>

    ${m}

   </body>

</html>

【代碼解析】:

1)使用<fmt:bundle>標籤指定從message.properties文件裏讀取值。

2)使用<fmt:message>標籤讀取資源文件裏keyname的值。<fmt:message>標籤放在<fmt:bundle>標籤體內使用。

3)使用<fmt:setBundle>標籤在page範圍綁定一個配置文件,以m爲參數名存儲。

4)使用<fmt:message>標籤獲得keypassword的值。此處指定資源文件的方式爲使用<fmt:message>標籤的bundle屬性來設定。

5)輸出參數m的值,加深對bundle的理解。

程序執行結果如圖所看到的。

9.20 fmtdemo05.jsp執行效果

<fmt:bundle>標籤中有一個prefix屬性,該標籤用來指明前綴。好比配置文件內容例如如下:

org.person.name=olive

org.personpassword=01234

假設不使用prefix標籤。在取值是要指明前綴。

好比:

<fmt:bundle basename=」message」>

<fmt:message key=」org.person.name」></fmt:message>

<fmt:message key=」org.person.password」></fmt:message>

</fmt:bundle>

使用prefix屬性可以簡化取值時的代碼。

<fmt:bundle basename=」message」 prefix=」org.person」>

<fmt:message key=」name」></fmt:message>

<fmt:message key=」password」></fmt:message>

</fmt:bundle>

4<fmt:param>標籤

該標籤主要用於當<fmt:message>中資源文件裏得到鍵值時。動態的爲資源文件裏的變量賦值。

【語法1】:

<fmt:param value=」value」/>

【語法2】:

<fmt:param >

標籤主體

</fmt:param>

【演示樣例代碼】:

1)建立資源文件。在message.properties文件裏添加一個keyvalue

news={0} welcome to out website!<br>today is :{1,date}

表達的含義是鍵news相應的是一個字符串,字符串中還有動態變量{0}表示第一個動態變量,{1,date}表示第二個動態變量並且該變量是一個日期類型的對象。

2)經過標籤從資源文件裏取出鍵值。並給動態變量賦值顯示在頁面。

代碼9.18 <fmt:param>標籤演示樣例:fmtdemo06.jsp

<%@ page language="java" pageEncoding="gbk"%>

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

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

<jsp:useBean id="date" class="java.util.Date"></jsp:useBean>

<html>

 <head>  

    <title>I18N標籤庫</title>

 </head>

 <body>

   <H4><c:out value="<fmt:param>標籤的使用"></c:out></H4>

   <hr>

   <fmt:bundle basename="message">

   <fmt:message key="news">

   <fmt:param value="olive" />

   <fmt:param value="${date}"/>

   </fmt:message>

   </fmt:bundle>

   </body>

</html>

【代碼解析】:

1)使用<fmt:bundle>標籤把資源文件綁定在標籤體內。

2)在<fmt:bundle>標籤體內使用<fmt:message>獲得鍵值。

3)使用<fmt:param>爲資源文件裏的動態變量賦值。

程序執行結果如圖9.21所看到的。

9.21 fmtdemo06.jsp執行結果

提示:資源文件通過改動後,應用程序需要重載才幹生效。

9.3.3 國際化

國際化這個分類中共包括兩個標籤:用於設定語言地區<fmt:setLocale/>和用於設定請求的字符編碼的<fmt:requestEncoding>標籤。

1<fmt:setLocale/>標籤

<fmt:setLocale>標籤用來設定用戶語言區域。

【語法】:

<fmt:setLocale value=」locale」[variant=」variant」]

                            [scope=」page|request|session|application」]>

【參數說明】:見表9-14

9-14 <fmt:setLocale>標籤屬性說明

參數名

說明

EL

類型

必須

默認值

value

指定區域代碼

String

java.util.Locale

variant

操做系統的類型

String

scope

設定時區的做用範圍

String

page

value屬性用來指定使用的語言代碼,可以從瀏覽器的【工具】---Internet選項】---【語言】---【加入】中查看瀏覽器支持的語言種類及語言代碼。

好比:中文(zh_cn)、臺灣(zh_tw)、香港(zh_mo)等。

【演示樣例代碼】:代碼9.19實現了設定不一樣的區域代碼,依據不一樣的區域代碼瀏覽將顯示不一樣格式的日期。

代碼9.19 <fmt:setLocale>標籤演示樣例:fmtdemo07.jsp

<%@ page language="java" pageEncoding="gbk"%>

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

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

<jsp:useBean id="date" class="java.util.Date"></jsp:useBean>

<html>

 <head>  

    <title>I18N標籤庫</title>

 </head>

 <body>

   <H4><c:out value="<fmt:setlocale>標籤的使用"></c:out></H4>

   <hr>

   <fmt:setLocale value="en_us" />

   <fmt:formatDate value="${date}" type="both" dateStyle="full" timeStyle="full"/>

   <hr>

   <fmt:setLocale value="zh_cn" />

   <fmt:formatDate value="${date}" type="both" dateStyle="full" timeStyle="full"/>

   <hr>

   <fmt:setLocale value="zh_TW"/>

   <fmt:formatDate value="${date}" type="both" dateStyle="full" timeStyle="full"/>

   </body>

</html>

【代碼解析】:

1)瀏覽器默認跟您使用的操做系統的語言一樣,所以默認值zh_cn

使用<fmt:setLocale/>標籤設置使用的語言爲en_us(英語)。

使用<fmt:formateDate>格式化輸出的時間字符串,該標籤會依據不一樣的語言輸出不一樣的日期格式。

2)使用的語言改動爲zh_cn,再次用格式化輸出。

3)使用語言改動爲zh_TW,輸出格式化後的時間。

程序執行結果如圖所看到的。

圖9.22 fmtdemo07.jsp執行結果

2<fmt:requestEncoding>標籤

該標籤用於設定請求的編碼格式。功能同servletRequest.setCharacterEncoding()方法一樣。

【語法】:

<fmt:requestEncoding [value=」charEncoding」]/>

【參數說明】:

value屬性用來指定使用的編碼集好比:gbkgb2312等。

當沒有給出value的值時將會本身主動搜索取尋找合適的編碼方式。所以能夠很是好的解決中文亂碼問題。

9.4 SQL標籤庫

JSTL提供了與數據庫相關操做的標籤,可以直接從頁面上實現數據庫操做的功能,在開發小型站點是可以很是方便的實現數據的讀取和操做。本章將具體介紹這些標籤的功能和用法。

SQL標籤庫從功能上可以劃分爲兩類:設置數據源標籤、SQL指令標籤。

引入SQL標籤庫的指令代碼爲:

<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>

9.4.1 設置數據源

使用<sql:setDataSource>標籤可以實現對數據源的配置。

【語法1】:直接使用已經存在的數據源。

<sql:setDataSource dataSource=」dataSource」[var=」name」]

                            [scope=」page|request|session|application」]/>

【語法2】:使用JDBC方式創建數據庫鏈接。

<sql:setDataSource driver=」driverClass」 url=」jdbcURL」

                                               user=」username」

                                               password=」pwd」                

                                               [var=」name」]

                                               [scope=」page|request|session|application」]/>

【參數說明】:見表9-15

9-15 <sql:DataSource>標籤屬性說明

參數名

說明

EL

類型

必須

默認值

dataSource

數據源

String

Javax.sql.DataSource

driver

使用的JDBC驅動

String

url

鏈接數據庫的路徑

String

user

鏈接數據庫的username

String

password

鏈接數據庫的password

String

var

指定存儲數據源的變量名

String

scope

指定數據源存儲的JSP範圍

String

page

提示:是否必須是相對的,比方說假設使用數據源則,driverurl等就再也不被使用。假設使用JDBC則要用到driverurluserpassword屬性。

好比鏈接SQL Server需要進行例如如下配置:

Driver="com.microsoft.jdbc.sqlserver.SQLServerDriver"

url=」 jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=pubs"

user=」sa」

password=」」

使用<fmt:setDataSource>配置的代碼例如如下:

<fmt:setDataSource driver=」com.microsoft.jdbc.sqlserver.SQLServerDriver」

                   url=」jdbc.microsoft:sqlserver://localhost:1433;DatabaseName=pubs」

                   user=」sa」

                   password=」」>

假設鏈接其它數據庫。僅僅須把相相應的項改動就能夠。

提示:可以把數據鏈接的配置存入session中。假設再用到數據庫鏈接僅僅須配置使用DataSource屬性。

9.4.2 SQL操做標籤

JSTL提供了<sql:query><sql:update><sql:param><sql:dateParam><sql:transaction>5個標籤,經過使用SQL語言操做數據庫。實現添加、刪除、改動等操做。如下將介紹這5個標籤的功能和使用方式。

1<sql:query>標籤

<sql:query>標籤用來查詢數據。

【語法1】:

<sql:query sql=」sqlQuery」 var=」name」 [scope=」page|request|session|application」]

                   [dataSource=」dateSource」]

                   [maxRow=」maxRow」]

                   [startRow=」starRow」]/>

【語法2】:

<sql:query var=」name」 [scope=」page|request|session|application」]

                   [dataSource=」dateSource」]

                   [maxRow=」maxRow」]

                   [startRow=」starRow」]

sqlQuery

</sql:query>

【屬性說明】:見表9-16

9-16 <sql:query>標籤屬性說明

參數名

說明

EL

類型

必須

默認值

sql

查詢數據的SQL語句

String

dataSource

數據源對象

String

Javax.sql.DataSoutce

maxRow

設定最多可以暫存數據的行數

String

startRow

設定從那一行數據開始

String

var

指定存儲查詢結果的變量名

String

scope

指定結果的做用域

String

page

使用<sql:query>必須指定數據源,dataSource是可選的。假設未給定該屬性標籤會在page範圍內查找是否設置過數據源,假設沒有找到將拋出異常。

普通狀況下使用<sql:setDateSource>標籤設置一個數據源存儲在session範圍中,當需要數據庫鏈接時使用dataSource屬性並實現數據庫的操做。

<sql:query>var屬性是必須的用來存放結果集,假設沒有指定scope範圍則默以爲page,即在當前頁面咱們可以隨時輸出查詢結果。

結果集有一系列的屬性如表9-17所看到的。

maxRowsstartRow屬性用來操做結果集。使用SQL語句首先吧數據放入內存中。檢查是否設置了startRow屬性,假設設置了就從starRow指定的那一行開始取maxRows個值,假設沒有設定則從第一行開始取。

9-17 結果集參數說明

屬性名

類型

說明

rowCount

int

結果集中的記錄總數

Rows

Java.util.Map

以字段爲索引查詢的結果

rowsByIndex

Object[]

以數字爲做索引的查詢結果

columnNames

String[]

字段名稱數組

limitedByMaxRows

boolean

是否設置了maxRows屬性來限制查詢記錄的數量

提示:limitedByMaxRows用來推斷程序是否收到maxRows屬性的限制。

並不是說設定了maxRows屬性。獲得結果集的limitedByMaxRows的屬性都爲true。當取出的結果集小於maxRows時。則maxRows沒有對結果集起到做用此時也爲false

好比可以使用startRow屬性限制結果集的數據量。

結果集的做用就是定義了數據在頁面中的顯示方式。如下給出告終果集每個屬性的做用。

q        rowCount屬性。該屬性統計結果集中有效記錄的量。可以使用於大批量數據分頁顯示。

q        Rows屬性。等到每個字段相應的值。

返回的結果爲:字段名={字段值···}

q        rowsByIndex屬性。常用獲得數據庫中數據的方式。從有效行的第一個元素開始遍歷,到最後一個有效行的最後一個元素。

q        columnNames屬性。用於獲得數據庫中的字段名。

q        limitedByMaxRows屬性。

用於推斷是否受到了maxRows的限制。

【演示樣例代碼】:代碼9.20給出了配置數據庫鏈接。和使用<sql:query>查詢數據以及結果集屬性的使用。

代碼9.20 數據庫示查詢演示樣例:sqldemo01.jsp

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

<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>

<%@ page contentType="text/html;charset=GBK"%>

<html>

<head>

 <title>JSTL: SQL標籤</title>

</head>

<body >

<h3>SQL標籤庫</h3>

<hr>

<sql:setDataSource driver="com.microsoft.jdbc.sqlserver.SQLServerDriver"

         url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs"

         user="sa" password="" />

<sql:query var="result" sql="select * from person" maxRows="2" startRow="1"/>

結果集的實質是:${result}<br>

獲得的行數爲:${result.rowCount}<br>

是否收到了maxRows的限制:${result.limitedByMaxRows}

<hr>

<table border="1" align="center">

<tr><c:forEach var="columnName" items="${result.columnNames}">

<td>

<c:out value="${columnName}"/>

</td>

</c:forEach> </tr>

<c:forEach var="row" items="${result.rowsByIndex}">

<tr>

<c:forEach var="column" items="${row}">

<td><c:out value="${column}"/></td>

</c:forEach>

</tr>

</c:forEach>

</table>

</body>

</html>

【代碼解析】:

1)配置數據源。使用<sql:dataSource>標籤配置數據源,因爲僅僅共本頁使用所以存儲在默認的page範圍中。

2)使用<sql:query>標籤進行數據庫查詢。並定義了maxRowsstartRow屬性。並把結果集存儲於做用於page範圍的result變量。使用${result}輸出可以發現結果集就是一個ResultImpl類。

提示:在進行數據源配置時程序不會檢查數據庫鏈接是否配置正確。直接依據設定的數據庫及鏈接訪問。假設沒有找到則拋出操做的表異常,所以要放如<c:catch></c:catch>同一時候在編敲代碼時必定要注意數據源是否配置正確。

3)使用結果集的rowCount屬性獲得記錄的總量。

代碼爲:

${result.rowCount}

4)使用結果集的limitedMaxRows屬性推斷是否收到maxRows設定的影響。代碼爲:

${result.limitedMaxRows}

5)從結果集中獲得數據庫中定義的所有的字段。${result.columnnames}獲得的結果是一個字符串數組,所以需要使用<c:forEach>循環輸出。代碼例如如下:

<c:forEach var="columnName" items="${result.columnNames}">

<c:out value="${columnName}"/>

</c:forEach>

6)從結果集中獲得所有的值。首先要遍歷每一行,而後遍歷每一行中的元素,所以需要循環嵌套。代碼例如如下:

<c:forEach var="columnName" items="${result.columnNames}">

<c:out value="${columnName}"/>

</c:forEach>

<c:forEach var="row" items="${result.rowsByIndex}">

<c:forEach var="column" items="${row}">

<c:out value="${column}"/></td>

</c:forEach>

</c:forEach>

提示:在代碼解析中省略了html元素表格等標籤的元素,本演示樣例適用於不論什麼數據庫表,僅僅要把數據庫的URL、使用的JDBC進行對應的配置和操做的數據表名進行對應的改動就能夠看到結果。

程序執行結果如圖9.23所看到的。

9.23 查詢操做結果圖

2<sql:update>標籤

<sql:update>用來實現操做數據庫如:使用createupdatedeleteinsertSQL語句。並返回影響記錄的條數。

【語法1】:SQL語句放在標籤屬性中。

<sql:update sql=」SQL語句」 [var=」name」] [scope=」page|request|session|application」]

                                                        [dateSource=」dateSource」]/>

【語法2】:SQL語句放在標籤體內。

<sql:update [var=」name」] [scope=」page|request|session|application」]

                                                        [dateSource=」dateSource」]

SQL語句

</sql:update>

【參數說明】:見表9-18

9-18 <sql:update>標籤屬性說明

參數名

說明

EL

類型

必須

默認值

sql

查詢數據的SQL語句

String

dataSource

數據源對象

String

Javax.sql.DataSoutce

var

指定存儲查詢結果的變量名

String

scope

指定結果的做用域

String

page

提示:<sql:update>標籤的屬性同<sql:query>標籤的屬性相比僅僅下降了maxRowsstartRow2個屬性。

其它參數使用方法同樣。

使用<sql:update>可以實現數據表的建立、插入數據、更行數據、刪除數據。使用時僅僅須在標籤中放入正確的SQL語句就能夠。同一時候要捕獲可能產生的異常。本節僅僅對一個簡單的插入操做進行說明。

【演示樣例代碼】:代碼9.21實現了建立一個表、實現數據的插入。

代碼9.21 數據庫建立、數據插入演示樣例:sqldemo02.jsp

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

<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>

<%@ page contentType="text/html;charset=GBK"%>

<html>

<head>

 <title>JSTL: SQL標籤</title>

</head>

<body >

<h3>SQL標籤庫</h3>

<hr>

<sql:setDataSource driver="com.microsoft.jdbc.sqlserver.SQLServerDriver"

         url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs"

         user="sa" password="" />

實現數據庫表的建立<br>

<sql:update var="result1">

create table c_user (

          id int primary key ,

     name varchar(80),

     sex varchar(80),

)

</sql:update>

<c:catch var="error">

<sql:update var="result2" >

insert c_user values(05,'Linda','')

insert c_user values(01,'Rom','' )

</sql:update>

影響的記錄數爲:<c:out value="${result2}"></c:out>

</c:catch>

<c:out value="${error}"></c:out><br>

<hr>

</body>

</html>

【代碼解析】:

1)配置數據源。

2)使用<sql:update>標籤建立一個新表。

3)向表中插入兩行數據。

提示:本演示樣例也沒有針對固定的表進行操做,在使用時直接執行就能夠,假設使用的是其它數據庫,需要更改數據源配置和SQL語句部分改動。

程序執行結果如圖9.24所看到的。

9.24 sqldemo02.jsp執行效果

從圖9.24中可以發現,使用<sql:update>var屬性記錄結果是不許確的,尤爲是在一個標籤中使用多條sql語句僅僅能記錄下第一條。在數據庫中建立的c_user表如圖9.25所看到的。

9.25 SQL表的內容

3<sql:param>標籤

<sql:param>標籤用於動態的爲SQL語句設定參數,同<sql:query>標籤共同使用。可以防止SQL注入做用相似於java.sql.PreparedStatement

【語法1】:

<sql:param value=」value」/>

【語法2】:

<sql:param>

Value

</sql:param>

【參數說明】:

value的做用爲SQL中的參數賦值。

【使用演示樣例】:

<sql:query var=」result」>

select * from person where 序號=

<sql:query>

4<sql:dateParam>標籤

<sql:dataParam>標籤主要用於爲SQL標籤填充日期類型的參數值。

【語法】:

<sql:dateParam value=」date」[type=」timestamp|time|date」]/>

【參數說明】:

q        value屬性:java.util.Date類型的參數。

q        type屬性:指定填充日期的類型timestamp(全部日期和時間)、time(填充的參數爲時間)、date(填充的參數爲日期)。

5<sql:transaction>標籤

<sql:transaction>標籤提供了數據操做的一種安全機制(即事務回滾)。當操做數據庫的某條SQL語句發生異常時,取消<sql:transaction>標籤體中的所有操做,恢復原來的狀態,又一次對數據庫進行操做。

【語法】:

<sql:transaction [dataSource=」dataSource」]

[isolation=」read_committed|read_uncommitted|repeatable|serializable」]

<sql:query>

<sql:uptade>

</sql:transation>

9.5 XML標籤庫

JSTL提供了操做xml文件的標籤庫,使用xml標籤庫可以省去使用DomSAX標籤庫的繁瑣。能輕鬆的讀取xml文件的內容。

9.5.1 XML核心標籤庫

1<x:parse>標籤

<x:parse/>標籤用來解析指定的xml文件。

【語法1】:

<x:parse doc=」xmlDocument」

{var=」name」[scope=」page|request|session|application」]|varDom=」name」[scope=」page|request|session|application」]}

systemId=」systemId」

filter=」filter」

/>

【語法2】:

<x:parse

{var=」name」[scope=」page|request|session|application」]|varDom=」name」[scope=」page|request|session|application」]}

systemId=」systemId」

filter=」filter」

xmlDocument

</x:parse>

【參數說明】:見表9-20

9-20 <x:parse>標籤屬性說明

屬性名

說明

EL

類型

必須

默認值

doc

指定解析的xml文件

String/Reader

var

存儲解析後的xml文件

String

scope

指定varJSP範圍

String

page

varDom

以(org.w3c.dom.Doucemet)的形式存儲解析的xml文件

String

scopeDom

指定varDomJSP範圍

String

page

systemId

xml文件的url

String

filter

解析xml文件的過濾器

Org.xml.sax.Filter

提示:doc指定解析的xml文件並不是指定xml文件的路徑,而是同<c:import>共同使用。由<c:import>載入並存儲。而後使用<x:parse>解析。

好比:假設解析person.xml文件需要經過例如如下代碼實現對xml文件的解析。

<c:import var="docString" url="person.xml"/><!--引入person.xml文件-->

<x:parse var="doc" doc="${docString}"/>

<c:import>語句用來導入或存儲文件到JSP。假設不使用var來存儲,xml文件將顯式的出現在JSP文件裏。

<x:parse>標籤僅僅用來解析xml文件,並不顯示xml文件裏的內容,假設想獲得xml的節點元素或值需要使用<x:out>元素來實現。

2<x:out>標籤

<x:out>標籤主要用來輸出xml的信息。

【語法】:

<x:out select=」XpathExperssion」[excapeXml=」true|false」]>

【參數說明】:見表9-21

9-21 <x:out>標籤屬性說明

屬性名

說明

EL

類型

必須

默認值

select

指定使用的XPath語句

String

escapeXml

是否轉換特殊字符。

如<

boolean

true

提示:使用XPath語句需要用到xalan.jar支持包。可以從演示樣例程序的lib中獲取。得到直接從myEclipse中可以找到。

【演示樣例代碼】:

3<x:set>標籤

<x:set>標籤用於將從xml文件節點解析的內容存儲到JSP屬性範圍中。

【語法】:

<x:set select=」XPathExperssion」 var=」name」 scope=」page|request|session|application」>

【參數說明】:

1select經過指定的XPath表達式語句獲取節點的值。

2var指定用於存儲值的變量名。

3)指定varJSP屬性範圍。

9.5.2 XML流程控制

使用xml標籤庫的流程控制標籤可以迭代處理xml文件的內容。流程控制可以分爲下面兩個方面的內容:

1)條件推斷。

2)循環功能。

1<x:if>

<x:if>主要用於條件推斷。

【語法1】:未含有本體內容。

<x:if select=」XPathExperssion」 var=」name」[scope=」page|request|session|application」]/>

【語法2】:含有本體內容。

<x:if select=」XPathExperssion」 var=」name」[scope=」page|request|session|application」]

本體內容

</x:if>

語法1僅僅把依據條件表達式獲得的結果的存儲在JSP範圍中,語法2依據<x:if>標籤依據條件表達式的結果決定是否運行本體內的代碼。

【參數說明】:

1select用來指定使用的XpathExperssion表達式。

2var設定標量名用來存儲表達式的結果。

3scope指定var存儲的JSP屬性範圍。

2<x:choose><x:when><x:otherwise>標籤

同核心標籤庫的<c:choose><c:when><c:otherwise>標籤做用類似,僅僅是使用的條件表達式不一樣。

<x;choose>是主標籤,<x:when><x:otherwise>放在<x:choose>標籤體內共同使用。

【語法】:

<x:choose>

<x:when>

<x:when>

<x:otherwise>

</x:choose>

當中僅僅有<x:when>有屬性。

【語法】:

<x:when select=」XPathExperssion」>

3<x:forEach>標籤

<x;forEach>標籤實現了對xml文檔的遍歷。

【語法】:

<x:forEach select=」XPathExperssion」[var=」name」][varStartus=」StartusName」]

[begin=」begin」][end=」end」][step=」step」]

//標籤主體

</x:forEach>

【參數說明】:見表9-22

9-22 <x:forEach>標籤屬性說明

屬性名

說明

EL

類型

必須

默認值

select

指定使用的XPath語句

String

var

用於存儲表達式的結果

String

varStatus

用來存放循環到的變量的相關信息

String

begin

循環的起始位置

int

end

循環的終止位置

int

9.5.3 xml的文件轉換

<x:transform><x:param>能輕易使用XSLT樣式包裝xml文件,成爲還有一種顯示方式。

1<x:transform>標籤

使用該標籤可以輕鬆的實現xmlXSLT的轉化。

【語法1】:

<x:transform doc=」xmldoc」 xslt=」XSLTStytlesheet」[docSystemId=」xmlsystemid」]

[result=」result」]

[var=」name」]

[scope=」scopeName」]

[xsltSystemId=」xsltsystemid」]/>

【語法2】:

<x:transform doc=」xmldoc」 xslt=」XSLTStytlesheet」[docSystemId=」xmlsystemid」]

[result=」result」]

[var=」name」]

[scope=」scopeName」]

[xsltSystemId=」xsltsystemid」]

<x:param/>

</x:transform>

【語法3】:

<x:transform doc=」xmldoc」 xslt=」XSLTStytlesheet」[docSystemId=」xmlsystemid」]

[result=」result」]

[var=」name」]

[scope=」scopeName」]

[xsltSystemId=」xsltsystemid」]

Xml文件內容

<x:param/>

</x:transform>

【參數說明】:見表9-23

9-23 <x:transform>標籤屬性說明

屬性名

說明

EL

類型

必須

默認值

doc

指定xml文件來源

String

xslt

轉化xml的樣式模板

String

docSystemId

xml文件的URI

String

xsltSystemId

xslt文件的URI

String

result

用來存儲轉換後的結果對象

java.xml.transform

var

org.w3c.dom.Documet類型存儲轉換後的結果

String

scope

var的屬性範圍

String

2<x:param>標籤

該標籤用來爲<x:transform>標籤轉換參數。

【語法1】:

<x:param name=」name」 value=」value」/>

【語法2】:

<x:param name=」name」 value=」value」

Value

</x:param>

【參數說明】:

1name指定參數的名稱。

2value指定參數值。

相關文章
相關標籤/搜索