JSTL相關知識

第9章 JSTL標籤庫

JSTL標籤庫的使用是爲類彌補html表的不足,規範自定義標籤的使用而誕生的。在告別modle1模式開發應用程序後,人們開始注重軟件的分層設計,不希望在jsp頁面中出現java邏輯代碼,同時也由於自定義標籤的開發難度較大和不利於技術標準化產生了自定義標籤庫。JSTL標籤庫可分爲5類:

q        核心標籤庫

q        I18N格式化標籤庫

q        SQL標籤庫

q        XML標籤庫

q        函數標籤庫

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


<%@ taglib %>引入標籤庫

=========================================================================

1、以classPath中,加入jar包:  standard-1.1.2.jar ,  jstl-1.1.2.jar

 

2、在相目\WEB-INF\tld\文件夾中放入常用的tld文件:c.tld,fmt.tld

 

3、在jsp文件的頂部加入以下內容:

Java代碼  收藏代碼
  1. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>   
  2. <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>  
  3. <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>  



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行沒有輸出結果。

程序運行結果如圖9.1所示。

9.1 coredemo01.jsp運行結果

【代碼解析】:

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自動查找得到值。

程序運行的結果如圖9.2所示。

圖9.2 coredemo02.jsp

在代碼中未使用任何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內置對象的方法實現存值和取值的功能。

程序運行結果如圖9.3所示:

9.3 getvalue.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”>

容易產生異常的代碼

</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把容易產生異常的代碼放在<c:catch></c:catch>中,自定義一個變量error用於存儲異常信息。

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

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

程序結果如圖所示。

9.5 coredemo05.jsp

圖中異常信息的提示爲:在<set>標籤中用不正確的參數“hao”。如果不捕獲程序中的異常,也就是不使用<c:catch></c:catch>捕獲容易產生異常的代碼,將會出現如圖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屬性存放的範圍。

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

【示例代碼】:代碼9.8實現了用戶輸入用戶名提交到自身頁面,頁面判斷用戶是否爲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文本輸入框,一個提交按鈕,並把信息提交給本頁。

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

3)第18行使用EL表達式得到adminchock的值,如果輸入的用戶名爲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

相同服務器下其他的web工程,必須以“"”開頭

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中加入指定的參數。例如:對用戶輸入的用戶名和密碼進行驗證,如果驗證不成功重定向到登錄頁面;或者實現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)的支持,它可以根據發出請求的客戶端地域的不同來顯示不同的語言。同時還提供了格式化數據和日期的方法。實現這些功能需要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

前置關鍵字

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

連接數據庫的用戶名

String

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指定參數值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章