jstl 與 el表達式

 在JSP頁面中,使用標籤庫代替傳統的Java片段語言來實現頁面的顯示邏輯已經不是新技術了,然而,由自定義標籤很容易造成重複定義和非標準的實現。鑑於此,出現了JSTL(JSP Standard Tag Library),爲大多數JSP頁面邏輯提供了實現的JSTL技術,該技術本身就是一個標籤庫。
      Sun公司Java規範標準的JSTL由apache jakarta組織負責維護。作爲開源的標準技術,它一直在不斷地完善。JSTL的發佈包有兩個版本:Standard-1.0 Taglib、Standard-1.1 Taglib,它們在使用時是不同的。
      Standard-1.0 Taglib(JSTL1.0)支持Servlet2.3和JSP1.2規範,Web應用服務器Tomcat4支持這些規範,而它的發佈也在Tomcat 4.1.24測試通過了。
      Standard-1.1 Taglib(JSTL1.1)支持Servlet2.4和JSP2.0規範,Web應用服務器Tomcat5支持這些規範,它的發佈在Tomcat 5.0.3測試通過了。
      在本章的介紹中,將以由Sun發佈的Standard-1.1 Taglib標籤庫爲主,而apache jakarta組織發佈的開源標籤庫,可以從http://jakarta.apache.org/taglibs/找到所需要的幫助。Sun發佈的標準JSTL1.1標籤庫有以下幾個標籤:
      核心標籤庫:包含Web應用的常見工作,比如:循環、表達式賦值、基本輸入輸出等。
      國際化標籤庫:用來格式化顯示數據的工作,比如:對不同區域的日期格式化等。
      數據庫標籤庫:可以做訪問數據庫的工作。
      XML標籤庫:用來訪問XML文件的工作,這是JSTL標籤庫的一個特點。
      函數標籤庫:用來讀取已經定義的某個函數。
 
      此外,JSTL還提供了EL表達式語言(Expression Language)來進行輔助的工作。
      JSTL標籤庫由標籤庫和EL表達式語言兩個部分組成。EL在JSTL 1.0規範中被引入,當時用來作爲Java表達式來工作,而該表達式必須配合JSTL的標籤庫才能得到需要的結果。
      說明:在JSTL 1.1規範中,JSP2.0容器已經能夠獨立的理解任何EL表達式。EL可以獨立出現在JSP頁面的任何角落。本文隨後的內容將以JSTL 1.1規範作爲介紹的重點。

 9.2.1 JSTL EL 表達式語言簡介 JavaWind.net Document
      EL是從JavaScript腳本語言得到啓發的一種表達式語言,它借鑑了JavaScript多類型轉換無關性的特點。在使用EL從scope中得到參數時可以自動轉換類型,因此對於類型的限制更加寬鬆。Web服務器對於request請求參數通常會以String類型來發送,在得到時使用的Java語言腳本就應該是request.getParameter(“XXX”),這樣的話,對於實際應用還必須進行強制類型轉換。而EL就將用戶從這種類型轉換的繁瑣工作脫離出來,允許用戶直接使用EL表達式取得的值,而不用關心它是什麼類型。
      下面的示例就是一個EL表達式,見例9.1。
      例9.1:簡單EL表達式

      <%@ page contentType="text/html; charset=UTF-8"%>
      <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
      <html>
       <body> ${sampleValue + 1} <br> </body>
      </html>
      
      這個示例將在JSP頁面顯示爲“1”,EL表達式必須以“${XXX}”來表示,其中“XXX”部分就是具體表達式內容,“${}”將這個表達式內容包含在其中作爲EL表達式的定義。本示例可以在滿足JSP2.0規範的任何Web應用服務器中使用。

 9.2.2 EL 表達式的默認變量 JavaWind.net Document
      一個EL表達式包含變量和操作符兩個內容。任何存在於JSP作用範圍的JavaBean都可以被轉化成EL表達式來使用,它所包含的默認變量如下:

1.默認變量pageScope、requestScope、sessionScope、applicationScope
      這4個默認變量包含Scope作用範圍的參數集合,相當於被保存在java.util.Map中的某個參數。下面看簡單的示例9.2:

例9.2:使用sessionScope變量的EL表達式

<%request.getSession().setAttribute("sampleValue", new Integer(10));%>
${sessionScope.sampleValue}

取得保存在Session中參數的sessionScope變量的EL表達式,“.”是property訪問操作符,在這裏表示從Session中取得“鍵”爲“sampleValue”的參數,並顯示出來。顯示結果爲“10”。

2.默認變量param、paramValues
      這兩個默認變量包含請求參數的集合,param表明請求包含的參數爲單一控件,paramValues表明請求包含的參數爲控件數組。下面看一個簡單示例9.3:

例9.3:提交請求的頁面和接受的頁面

<%@ page contentType="text/html; charset=UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
 <body>
     <form action="SampleJsp.jsp">
    <input type="text" name="sampleValue" value="10">
    <input type="text" name="sampleValue" value="11">
    <input type="text" name="sampleValue" value="12">
    <input type="text" name="sampleSingleValue" value="SingleValue">
    <input type="submit" value="Submit">
    </form>
 </body>
</html>

      在這個頁面中定義了兩組控件,控件名爲“sampleValue”的是一套控件數組,控件名爲“sampleSingleValue”的是單一控件,通過遞交將請求參數傳送到SampleJsp.jsp。

<%@ page contentType="text/html; charset=UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
 <body>
    ${paramValues.sampleValue[2]} <br>
    ${param.sampleSingleValue} <br>
 </body>
</html>

      這是請求轉發到的頁面,通過EL表達式的paramValues變量得到控件數組中最後一個控件的遞交參數,通過EL表達式的param變量得到單一控件的遞交參數。控件數組參數的EL表達式使用“[]”來指定數組下標。本示例將顯示控件數組中最後一個控件的值“12”和單一控件的值“SingleValue”。

3.默認變量header、headerValues
      這兩個默認變量包含請求參數頭部信息的集合,header變量表示單一頭部信息,headerValues則表示數組型的頭部信息。

4.默認變量cookie
      包含所有請求的cookie集合,集合中的每個對象對應javax.servlet.http.Cookie。

5.默認變量initParam
      包含所有應用程序初始化參數的集合。

6.默認變量pageContext
      等價於page環境類javax.servlet.jsp.PageContext的實例,用來提供訪問不同的請求參數。
11個默認變量幾乎包含了Web應用的所有基本操作,若一個表達式不使用這些變量而直接使用參數名,那麼就採用就近原則。該表達式將使用最近取得的參數值。

 標籤庫介紹 JavaWind.net Document

 

表達式的操作符
      EL表達式中還有許多操作符可以幫助完成各種所需的操作,之前的示例中“.”、“[]”就是其中的兩個,下面將用表9.1來展示所有操作符及它們各自的功能。

表9.1 EL表達式的操作符

操作符

功能和作用

.

訪問一個bean屬性或者Map entry

[]

訪問一個數組或者鏈表元素

()

對子表達式分組,用來改變賦值順序

? :

條件語句,比如:條件?ifTrue:ifFalse

如果條件爲真,表達式值爲前者,反之爲後者

+

數學運算符,加操作

-

數學運算符,減操作或者對一個值取反

*

數學運算符,乘操作

/ 或div

數學運算符,除操作

% 或mod

數學運算符,模操作(取餘)

== 或eq

邏輯運算符,判斷符號左右兩端是否相等,如果相等返回true,否則返回false

!= 或ne

邏輯運算符,判斷符號左右兩端是否不相等,如果不相等返回true,否則返回false

< 或lt

邏輯運算符,判斷符號左邊是否小於右邊,如果小於返回true,否則返回false

> 或gt

邏輯運算符,判斷符號左邊是否大於右邊,如果大於返回true,否則返回false

<= 或le

邏輯運算符,判斷符號左邊是否小於或者等於右邊,如果小於或者等於返回true,否則返回false

>= 或ge

邏輯運算符,判斷符號左邊是否大於或者等於右邊,如果大於或者等於返回true,否則返回false

&& 或and

邏輯運算符,與操作賦。如果左右兩邊同爲true返回true,否則返回false

|| 或or

邏輯運算符,或操作賦。如果左右兩邊有任何一邊爲true返回true,否則返回false

! 或not

邏輯運算符,非操作賦。如果對true取運算返回false,否則返回true

empty

用來對一個空變量值進行判斷: null、一個空String、空數組、空Map、沒有條目的Collection集合

func(args)

調用方法, func是方法名,args是參數,可以沒有,或者有一個、多個參數.參數間用逗號隔開

這些操作符都是極其有用的,下面通過幾個示例來演示它們的使用方法:

例9.4:幾組操作符的示例

${pageScope.sampleValue + 12} <br>           //顯示12
${(pageScope.sampleValue + 12)/3} <br>     //顯示4.0
${(pageScope.sampleValue + 12) /3==4} <br>         //顯示true
${(pageScope.sampleValue + 12) /3>=5} <br>         //顯示false
<input type="text" name="sample1" value="${pageScope.sampleValue + 10}"> //顯示值爲10的Text控件

可以看到,對於這些示例,程序設計者完全無需管理它們的類型轉換,在表達式內部都已經處理了。有了EL表達式,在JSP頁面的編程變得更靈活,也更容易。

 標籤庫介紹
      在JSTL1.1中有以下這些標籤庫是被支持的:Core標籤庫、XML processing標籤庫、I18N formatting標籤庫、Database access標籤庫、Functions標籤庫。
      對應的標識符見表9.2所示:

表9.2 標籤庫的標識符

標籤庫

URI

前綴

Core

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

c

XML processing

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

x

I18N formatting

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

fmt

Database access

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

sql

Functions

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

fn

下面看例9.5,簡單使用標籤庫的示例。

例9.5:簡單JSTL標籤庫示例

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
 <body>
    <c:forEach var="i" begin="1" end="10" step="1"> ${i} <br /></c:forEach>
 </body>
</html>

   在該示例的JSP頁面中聲明瞭將使用Core標籤庫,它的URI爲“http://java.sun.com/jsp/jstl/core”,前綴爲“c”。之後,頁面中<c:forEach>標籤就是使用了JSTL的標籤進行了工作。對於該標籤的功能,這裏暫時不作具體講解,只是讓讀者能夠有個簡單的概念,瞭解怎樣定義和使用標籤庫。 

標籤庫
      Core標籤庫,又被稱爲核心標籤庫,該標籤庫的工作是對於JSP頁面一般處理的封裝。在該標籤庫中的標籤一共有14個,被分爲了四類,分別是:

         多用途核心標籤:<c:out>、<c:set>、<c:remove>、<c:catch>。
         條件控制標籤:<c:if>、<c:choose>、<c:when>、<c:otherwise>。
         循環控制標籤:<c:forEach>、<c:forTokens>。
         URL相關標籤:<c:import>、<c:url>、<c:redirect>、<c:param>。

以下是各個標籤的用途和屬性以及簡單示例。

用於顯示的 <c:out> 標籤 JavaWind.net Document 
      <c:out>標籤是一個最常用的標籤,用於在JSP中顯示數據。它的屬性和描述如表9.3所示:

表9.3 <c:out>標籤屬性和說明

屬性

描述

value

輸出到頁面的數據,可以是EL表達式或常量(必須)

default

當value爲null時顯示的數據(可選)

escapeXml

當設置爲true時會主動更換特殊字符,比如“&lt;,&gt;,&amp;”(可選,默認爲true)

在JSTL1.0的時候,在頁面顯示數據必須使用<c:out>來進行。然而,在JSTL1.1中,由於JSP2.0規範已經默認支持了EL表達式,因此可以直接在JSP頁面使用表達式。下面看一個示例。

<c:out value="${sessionScope.anyValue}" default="no value" escapeXml="false"/>

該示例將從Session查找名爲“anyValue”的參數,並顯示在頁面,若沒有找到則顯示“no value”。

 <c: > 標籤 JavaWind.net Document


 

用於賦值的<c:set>標籤
      <c:set>標籤用於爲變量或JavaBean中的變量屬性賦值的工作。它的屬性和描述如表9.4所示:

表9.4 <c:set>標籤屬性和說明

屬性

描述

value

值的信息,可以是EL表達式或常量

target

被賦值的JavaBean實例的名稱,若存在該屬性則必須
存在property屬性(可選)

property

JavaBean實例的變量屬性名稱(可選)

var

被賦值的變量名(可選)

scope

變量的作用範圍,若沒有指定,默認爲page(可選)

 當不存在value的屬性時,將以包含在標籤內的實體數據作爲賦值的內容。下面看一個示例:

<c:set value="this is andy" var="oneString"/>
${oneString} <br>

該示例將爲名爲“oneString”的變量賦值爲“this is andy”,其作用範圍爲page。

 9.3.3 用於刪除的 <c:remove> 標籤 
      <c:remove>標籤用於刪除存在於scope中的變量。它的屬性和描述如表9.5所示:

表9.5 <c:remove>標籤屬性和說明

屬性

描述

var

需要被刪除的變量名

scope

變量的作用範圍,若沒有指定,默認爲全部查找(可選)

下面看一個示例:

<c:remove var="sampleValue" scope="session"/>
${sessionScope.sampleValue} <br>

該示例將存在於Session中名爲“sampleValue”的變量刪除。下一句EL表達式顯示該變量時,該變量已經不存在了。

 9.3.4 用於異常捕獲的 <c:catch> 標籤 
      <c:catch>標籤允許在JSP頁面中捕捉異常。它包含一個var屬性,是一個描述異常的變量,改變量可選。若沒有var屬性的定義,那麼僅僅捕捉異常而不做任何事情,若定義了var屬性,則可以利用var所定義的異常變量進行判斷轉發到其他頁面或提示報錯信息。看一個示例。

<c:catch var="err"> ${param.sampleSingleValue[9] == 3}</c:catch>
${err}

當“${param.sampleSingleValue[9] == 3}”表達式有異常時,可以從var屬性“err”得到異常的內容,通常判斷“err”是否爲null來決定錯誤信息的提示。

 9.3.5 用於判斷的 <c:if> 標籤 
      <c:if>標籤用於簡單的條件語句。它的屬性和描述如表9.6所示:

表9.6 <c:if>標籤屬性和說明

屬性

描述

test

需要判斷的條件

var

保存判斷結果true或false的變量名,該變量可供之後的工作使用(可選)

scope

變量的作用範圍,若沒有指定,默認爲保存於page範圍中的變量(可選)

下面看一個示例:

<c:if test="${paramValues.sampleValue[2] == 12}" var="visits">It is 12</c:if><br>
${visits} <br>

該示例將判斷request請求提交的傳入控件數組參數中,下標爲“2”的控件內容是否爲“12”,若爲12則顯示“It is 12”。判斷結果被保存在page範圍中的“visits”變量中。

 9.3.6 用於複雜判斷的 <c:choose> 、 <c:when> 、 <c:otherwise> 標籤 
     這三個標籤用於實現複雜條件判斷語句,類似“if,elseif”的條件語句。

         <c:choose>標籤沒有屬性,可以被認爲是父標籤,<c:when>、<c:otherwise>將作爲其子標籤來使用。
         <c:when>標籤等價於“if”語句,它包含一個test屬性,該屬性表示需要判斷的條件。
         <c:otherwise>標籤沒有屬性,它等價於“else”語句。

下面看一個複雜條件語句的示例。

<c:choose>
         <c:when test="${paramValues.sampleValue[2] == 11}">
                   not 12 not 13,it is 11
         </c:when>
         <c:when test="${paramValues.sampleValue[2] == 12}">
                   not 11 not 13,it is 12
         </c:when>
         <c:when test="${paramValues.sampleValue[2] == 13}">
                   not 11 not 12,it is 13
         </c:when>
         <c:otherwise>
                   not 11 、12、13
         </c:otherwise>
</c:choose>

該示例將判斷request請求提交的傳入控件數組參數中,下標爲“2”控件內容是否爲“11”或“12”或“13”,並根據判斷結果顯示各自的語句,若都不是則顯示“not 11 、12、13”。

 9.3.7 用於循環的 <c:forEach> 標籤
     <c:forEach>爲循環控制標籤。它的屬性和描述如表9.7所示:

表9.7 <c:forEach>標籤屬性和說明

屬性

描述

items

進行循環的集合(可選)

begin

開始條件(可選)

end

結束條件(可選)

step

循環的步長,默認爲1(可選)

var

做循環的對象變量名,若存在items屬性,則表示循環集合中對象的變量名(可選)

varStatus

顯示循環狀態的變量(可選)

下面看一個集合循環的示例。

<%ArrayList arrayList = new ArrayList();
                   arrayList.add("aa");
                   arrayList.add("bb");
                   arrayList.add("cc");
%>
<%request.getSession().setAttribute("arrayList", arrayList);%>
<c:forEach items="${sessionScope.arrayList}" var="arrayListI">
         ${arrayListI}
</c:forEach>

該示例將保存在Session中的名爲“arrayList”的ArrayList類型集合參數中的對象依次讀取出來,items屬性指向了ArrayList類型集合參數,var屬性定義了一個新的變量來接收集合中的對象。最後直接通過EL表達式顯示在頁面上。下面看一個簡單循環的示例。

<c:forEach var="i" begin="1" end="10" step="1">
      ${i}<br />
</c:forEach>

該示例從“1”循環到“10”,並將循環中變量“i”顯示在頁面上。

 9.3.8 用於分隔字符的 <c:forTokens> 標籤 
     <c:forTokens>標籤可以根據某個分隔符分隔指定字符串,相當於java.util.StringTokenizer類。它的屬性和描述如表9.8所示:

表9.8 <c:forTokens>標籤屬性和說明

屬性

描述

items

進行分隔的EL表達式或常量

delims

分隔符

begin

開始條件(可選)

end

結束條件(可選)

step

循環的步長,默認爲1(可選)

var

做循環的對象變量名(可選)

varStatus

顯示循環狀態的變量(可選)

下面看一個示例。

<c:forTokens items="aa,bb,cc,dd" begin="0" end="2" step="2" delims="," var="aValue">
         ${aValue}
</c:forTokens>

需要分隔的字符串爲“aa,bb,cc,dd”,分隔符爲“,”。begin屬性指定從第一個“,”開始分隔,end屬性指定分隔到第三個“,”,並將做循環的變量名指定爲“aValue”。由於步長爲“2”,使用EL表達式${aValue}只能顯示“aa

 <x: > 標籤


 

9.3.9 用於包含頁面的<c:import> 
     <c:import>標籤允許包含另一個JSP頁面到本頁面來。它的屬性和描述如表9.9所示:

表9.9 <c:import>標籤屬性和說明

屬性

描述

rl

需要導入頁面的URL

context

Web Context該屬性用於在不同的Context下導入頁面,當出現context屬性時,必須以“/”開頭,此時也需要url屬性以“/”開頭(可選)

charEncoding

導入頁面的字符集(可選)

var

可以定義導入文本的變量名(可選)

scope

導入文本的變量名作用範圍(可選)

varReader

接受文本的java.io.Reader類變量名(可選)

 下面看一個示例。

<c:import url="/MyHtml.html" var="thisPage" />
<c:import url="/MyHtml.html" context=”/sample2” var="thisPage"/>
<c:import url="www.sample.com/MyHtml.html" var="thisPage"/>

該示例演示了三種不同的導入方法,第一種是在同一 Context 下的導入,第二種是在不同的 Context 下導入,第三種是導入任意一個 URL 。

 9.3.10 用於得到URL地址的<c:url>標籤
     <c:url> 標籤用於得到一個 URL 地址。它的屬性和描述如表 9.10 所示:

表9.10 <c:url>標籤屬性和說明

屬性

描述

value

頁面的URL地址

context

Web Context該屬性用於得到不同Context下的URL地址,當出現context屬性時,必須以“/”開頭,此時也需要url屬性以“/”開頭(可選)

charEncoding

URL的字符集(可選)

var

存儲URL的變量名(可選)

scope

變量名作用範圍(可選)

下面看一個示例:

<c:url value="/MyHtml.html" var="urlPage" />
<a href="${urlPage}">link</a>

得到了一個 URL 後,以 EL 表達式放入 <a> 標籤的 href 屬性,達到鏈接的目的。

9.3.11 用於頁面重定向的<c:redirect>標籤
     <c:redirect> 用於頁面的重定向,該標籤的作用相當於 response.setRedirect 方法的工作。它包含 url 和 context 兩個屬性,屬性含義和 <C:url> 標籤相同。下面看一個示例。

<c:redirect url="/MyHtml.html"/>

該示例若出現在 JSP 中,則將重定向到當前 Web Context 下的“ MyHtml.html ”頁面,一般會與 <c:if> 等標籤一起使用。

 9.3.12 用於包含傳遞參數的<c:param>標籤
     <c:param> 用來爲包含或重定向的頁面傳遞參數。它的屬性和描述如表 9.11 所示:

表9.11 <c:param>標籤屬性和說明

屬性

描述

name

傳遞的參數名

value

傳遞的參數值(可選)

下面是一個示例:

<c:redirect url="/MyHtml.jsp">
<c:param name="userName" value=”RW” />
</c:redirect>

該示例將爲重定向的“ MyHtml.jsp ”傳遞指定參數“ userName=’RW’ ”。

 9.4 JSTL XML processing標籤庫 JavaWind.net Document
     在企業級應用越來越依賴 XML 的今天, XML 格式的數據被作爲信息交換的優先選擇。 XML processing 標籤庫爲程序設計者提供了基本的對 XML 格式文件的操作。在該標籤庫中的標籤一共有 10 個,被分爲了三類,分別是:

         XML核心標籤:<x:parse>、<x:out>、<x:set>。
         XML流控制標籤:<x:if>、<x:choose>、<x:when>、<x:otherwise>、<x:forEach>。
         XML轉換標籤:<x:transform>、<x:param>。

由於該組標籤庫專注於對某一特定領域的實現,因此本書將只選擇其中常見的一些標籤和屬性進行介紹。

9.4.1 用於解析XML文件的<x:parse>標籤
     <x:parse> 標籤是該組標籤庫的核心,從其標籤名就可以知道,它是作爲解析 XML 文件而存在的。它的屬性和描述如表 9.12 所示:

表9.12 <x:parse>標籤屬性和說明

屬性

描述

doc

源XML的內容,該屬性的內容應該爲String類型或者java.io.Reader的實例,可以用xml屬性來替代,但是不被推薦

var

將解析後的XML保存在該屬性所指定的變量中,之後XML processing標籤庫中的其他標籤若要取XML中的內容就可以從該變量中得到(可選)

scope

變量的作用範圍(可選)

varDom

指定保存的變量爲org.w3c.dom.Document接口類型(可選)

scopeDom

org.w3c.dom.Document的接口類型變量作用範圍(可選)

systemId

定義一個URI,該URI將被使用到XML文件中以接入其他資源文件(可選)

filter

該屬性必須爲org.xml.sax.XMLFilter類的一個實例,可以使用EL表達式傳入,將對XML文件做過濾得到自身需要的部分(可選)

其中, var 、 scope 和 varDom 、 scopeDom 不應該同時出現,而應該被視爲兩個版本來使用,二者的變量都可以被 XML processing 標籤庫的其他標籤來使用。

<x:parse> 標籤單獨使用的情況很少,一般會結合 XML processing 標籤庫中的其他標籤來一起工作。下面看一個示例。

首先給出一個簡單的 XML 文件,將對該 XML 文件做解析,該 XML 文件名爲 SampleXml.xml 。

<?xml version="1.0" encoding="UTF-8"?>
<xml-body>
         <name>RW</name>
         <passWord>123456</passWord>
         <age>28</age>
         <books>
                   <book>book1</book>
                   <book>book2</book>
                   <book>book3</book>
         </books>
</xml-body>

標籤庫的工作:

<c:import var="xmlFile" url="http://localhost:8080/booksamplejstl/SampleXml.xml"/>
<x:parse var="xmlFileValue" doc="${xmlFile}"/>

 <fmt: > 標籤 JavaWind.net Document


看到I18N就應該想到知識“國際化”,I18N formatting標籤庫就是用於在JSP頁面中做國際化的動作。在該標籤庫中的標籤一共有12個,被分爲了兩類,分別是:
國際化核心標籤:<fmt:setLocale>、<fmt:bundle>、<fmt:setBundle>、<fmt:message>、<fmt:param>、<fmt:requestEncoding>。
格式化標籤:<fmt:timeZone>、<fmt:setTimeZone>、<fmt:formatNumber>、<fmt:parseNumber>、<fmt:formatDate>、<fmt:parseDate>。

下面只選擇其中常見的一些標籤和屬性進行介紹。

 9.5.1 用於設置本地化環境的<fmt:setLocale>標籤
    <fmt:setLocale>標籤用於設置Locale環境。它的屬性和描述如表9.17所示:

表9.17 <fmt:setLocale>標籤屬性和說明

屬性

描述

value

Locale環境的指定,可以是java.util.Locale或String類型的實例

scope

Locale環境變量的作用範圍(可選)

下面看一個示例:

<fmt:setLocale value="zh_TW"/>

表示設置本地環境爲繁體中文。

 9.5.2  用於資源文件綁定的<fmt:bundle>、<fmt:setBundle>標籤
       這兩組標籤用於資源配置文件的綁定,唯一不同的是<fmt:bundle>標籤將資源配置文件綁定於它標籤體中的顯示,<fmt:setBundle>標籤則允許將資源配置文件保存爲一個變量,在之後的工作可以根據該變量來進行。

        根據Locale環境的不同將查找不同後綴的資源配置文件,這點在國際化的任何技術上都是一致的,通常來說,這兩種標籤單獨使用是沒有意義的,它們都會與I18N formatting標籤庫中的其他標籤配合使用。它們的屬性和描述如表9.18所示:

表9.18 <fmt:bundle>、<fmt:setBundle>標籤屬性和說明

屬性

描述

basename

資源配置文件的指定,只需要指定文件名而無須擴展名,二組標籤共有的屬性

var

<fmt:setBundle>獨有的屬性,用於保存資源配置文件爲一個變量

scope

變量的作用範圍

下面看一個示例

<fmt:setLocale value="zh_CN"/>
<fmt:setBundle basename="applicationMessage" var="applicationBundle"/>

該示例將會查找一個名爲applicationMessage_zh_CN.properties的資源配置文件,來作爲顯示的Resource綁定。

 9.5.3  用於顯示資源配置文件信息的<fmt:message>標籤
       用於信息顯示的標籤,將顯示資源配置文件中定義的信息。它的屬性和描述如表9.19所示:

表9.19 <fmt:message>標籤屬性和說明

屬性

描述

key

資源配置文件的“鍵”指定

bundle

若使用<fmt:setBundle>保存了資源配置文件,該屬性就可以從保存的資源配置文件中進行查找

var

將顯示信息保存爲一個變量

scope

變量的作用範圍

下面看一個示例:

<fmt:setBundle basename="applicationMessage" var="applicationBundle"/>
<fmt:bundle basename="applicationAllMessage">
         <fmt:message key="userName" />
         <p>
         <fmt:message key="passWord" bundle="${applicationBundle}" />
</fmt:bundle>

       該示例使用了兩種資源配置文件的綁定的做法,“ applicationMessage ”資源配置文件利用<fmt:setBundle>標籤被賦於了變量“ applicationBundle ”,而作爲<fmt:bundle>標籤定義的“ applicationAllMessage ”資源配置文件作用於其標籤體內的顯示。

         第一個<fmt:message>標籤將使用“ applicationAllMessage ”資源配置文件中“鍵”爲“ userName ”的信息顯示。
         第二個<fmt:message>標籤雖然被定義在<fmt:bundle>標籤體內,但是它使用了bundle屬性,因此將指定之前由<fmt:setBundle>標籤保存的“ applicationMessage ”資源配置文件,該“鍵”爲“ passWord ”的信息顯示。

 9.5.4  用於參數傳遞的<fmt:param>標籤
<fmt:param>標籤應該位於<fmt:message>標籤內,將爲該消息標籤提供參數值。它只有一個屬性value。
<fmt:param>標籤有兩種使用版本,一種是直接將參數值寫在value屬性中,另一種是將參數值寫在標籤體內。

 9.5.6  用於爲請求設置字符編碼的<fmt:requestEncoding>標籤
<fmt:requestEncoding>標籤用於爲請求設置字符編碼。它只有一個屬性value,在該屬性中可以定義字符編碼。

 9.5.7  用於設定時區的<fmt:timeZone>、<fmt:setTimeZone>標籤
       這兩組標籤都用於設定一個時區。唯一不同的是<fmt:timeZone>標籤將使得在其標籤體內的工作可以使用該時區設置,<fmt:setBundle>標籤則允許將時區設置保存爲一個變量,在之後的工作可以根據該變量來進行。它們的屬性和描述如表9.20所示:

表9.20 <fmt:timeZone>、<fmt:setTimeZone>標籤屬性和說明

屬性

描述

value

時區的設置

var

<fmt:setTimeZone>獨有的屬性,用於保存時區爲一個變量

scope

變量的作用範圍

 9.5.8  用於格式化數字的<fmt:formatNumber>標籤
<fmt: formatNumber > 標籤用於格式化數字。它的屬性和描述如表9.21所示:

表9.21 <fmt:formatNumber>標籤屬性和說明

屬性

描述

value

格式化的數字,該數值可以是String類型或java.lang.Number類型的實例

type

格式化的類型

pattern

格式化模式

var

結果保存變量

scope

變量的作用範圍

maxIntegerDigits

指定格式化結果的最大值

minIntegerDigits

指定格式化結果的最小值

maxFractionDigits

指定格式化結果的最大值,帶小數

minFractionDigits

指定格式化結果的最小值,帶小數

<fmt:formatNumber>標籤實際是對應java.util.NumberFormat類,type屬性的可能值包括currency(貨幣)、number(數字)和percent(百分比)。

下面看一個示例。

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

該結果將被保存在“ money ”變量中,將根據Locale環境顯示當地的貨幣格式。

 9.5.9  用於解析數字的<fmt:parseNumber>標籤
       <fmt:parseNumber>標籤用於解析一個數字,並將結果作爲java.lang.Number類的實例返回。<fmt:parseNumber>標籤看起來和<fmt:formatNumber>標籤的作用正好相反。它的屬性和描述如表9.22所示:

表9.22 <fmt:parseNumber>標籤屬性和說明

屬性

描述

value

將被解析的字符串

type

解析格式化的類型

pattern

解析格式化模式

var

結果保存變量,類型爲java.lang.Number

scope

變量的作用範圍

parseLocale

以本地化的形式來解析字符串,該屬性的內容應爲String或java.util.Locale類型的實例

下面看一個示例。

<fmt:parseNumber value="15%" type="percent" var="num"/>

解析之後的結果爲“ 0.15 ”。

9.5.10  用於格式化日期的<fmt:formatDate>標籤
<fmt:formatDate>標籤用於格式化日期。它的屬性和描述如表9.23所示:

表9.23 <fmt:formatDate>標籤屬性和說明

屬性

描述

value

格式化的日期,該屬性的內容應該是java.util.Date類型的實例

type

格式化的類型

pattern

格式化模式

var

結果保存變量

scope

變量的作用範圍

timeZone

指定格式化日期的時區

<fmt:formatDate>標籤與<fmt:timeZone>、<fmt:setTimeZone>兩組標籤的關係密切。若沒有指定 timeZone屬性,也可以通過<fmt:timeZone>、<fmt:setTimeZone>兩組標籤設定的時區來格式化最後的結果。

 9.5.11  用於解析日期的<fmt:parseDate>標籤
       <fmt:parseDate>標籤用於解析一個日期,並將結果作爲java.lang.Date類型的實例返回。<fmt:parseDate>標籤看起來和<fmt:formatDate>標籤的作用正好相反。它的屬性和描述如表9.24所示:

表9.24 <fmt:parseDate>標籤屬性和說明

屬性

描述

value

將被解析的字符串

type

解析格式化的類型

pattern

解析格式化模式

var

結果保存變量,類型爲java.lang.Date

scope

變量的作用範圍

parseLocale

以本地化的形式來解析字符串,該屬性的內容爲String或java.util.Locale類型的實例

timeZone

指定解析格式化日期的時區

<fmt:parseNumber>和<fmt:parseDate>兩組標籤都實現解析字符串爲一個具體對象實例的工作,因此,這兩組解析標籤對var屬性的字符串參數要求非常嚴格。就JSP頁面的表示層前段來說,處理這種解析本不屬於份內之事,因此<fmt:parseNumber>和<fmt:parseDate>兩組標籤應該儘量少用,替代工作的地方應該在服務器端表示層的後段,比如在Servlet中。

 <sql:> 標籤 JavaWind.net Document


9.6  Database access 標籤庫
       Database access標籤庫中的標籤用來提供在JSP頁面中可以與數據庫進行交互的功能,雖然它的存在對於早期純JSP開發的應用以及小型的開發有着意義重大的貢獻,但是對於MVC模型來說,它卻是違反規範的。因爲與數據庫交互的工作本身就屬於業務邏輯層的工作,所以不應該在JSP頁面中出現,而是應該在模型層中進行。

       對於Database access標籤庫本書不作重點介紹,只給出幾個簡單示例讓讀者略微瞭解它們的功能。

       Database access標籤庫有以下6組標籤來進行工作:<sql:setDataSource>、<sql:query>、<sql:update>、<sql:transaction>、<sql:setDataSource>、<sql:param>、<sql:dateParam>。

9.6.1 用於設置數據源的 <sql:setDataSource> 標籤
       <sql:setDataSource>標籤用於設置數據源,下面看一個示例:

<sql:setDataSource
         var="dataSrc"
         url="jdbc:postgresql://localhost:5432/myDB"
         driver="org.postgresql.Driver"
         user="admin"
         password="1111"/>

該示例定義一個數據源並保存在“ dataSrc ”變量內。

9.6.2 用於查詢的 <sql:query> 標籤
       <sql:query>標籤用於查詢數據庫,它標籤體內可以是一句查詢SQL。下面看一個示例:

<sql:query var="queryResults" dataSource="${dataSrc}">
      select * from table1
</sql:query>

該示例將返回查詢的結果到變量“ queryResults ”中,保存的結果是javax.servlet.jsp.jstl.sql.Result類型的實例。要取得結果集中的數據可以使用<c:forEach>循環來進行。下面看一個示例。

<c:forEach var="row" items="${queryResults.rows}">
      <tr>
               <td>${row.userName}</td>
                <td>${row.passWord}</td>
      </tr>
</c:forEach>

“ rows ”是javax.servlet.jsp.jstl.sql.Result實例的變量屬性之一,用來表示數據庫表中的“列”集合,循環時,通過“ ${row.XXX} ”表達式可以取得每一列的數據,“ XXX ”是表中的列名。

9.6.3 用於更新的 <sql:update> 標籤
<sql:update>標籤用於更新數據庫,它的標籤體內可以是一句更新的SQL語句。其使用和<sql:query>標籤沒有什麼不同。

 9.6.4 用於事務處理的 <sql:transaction> 標籤
       <sql:transaction>標籤用於數據庫的事務處理,在該標籤體內可以使用<sql:update>標籤和<sql:query>標籤,而<sql:transaction>標籤的事務管理將作用於它們之上。
       <sql:transaction>標籤對於事務處理定義了read_committed、read_uncommitted、repeatable_read、serializable4個隔離級別。

 9.6.5 用於事務處理的 <sql:param> 、 <sql:dateParam> 標籤
       這兩個標籤用於向SQL語句提供參數,就好像程序中預處理SQL的“ ? ”一樣。<sql:param>標籤傳遞除java.util.Date類型以外的所有相融參數,<sql:dateParam>標籤則指定必須傳遞java.util.Date類型的參數。

<fn:> 標籤 JavaWind.net Document


9.7 Functions 標籤庫
       稱呼Functions標籤庫爲標籤庫,倒不如稱呼其爲函數庫來得更容易理解些。因爲Functions標籤庫並沒有提供傳統的標籤來爲JSP頁面的工作服務,而是被用於EL表達式語句中。在JSP2.0規範下出現的Functions標籤庫爲EL表達式語句提供了許多更爲有用的功能。Functions標籤庫分爲兩大類,共16個函數。

       長度函數:fn:length
       字符串處理函數:fn:contains、fn:containsIgnoreCase、fn:endsWith、fn:escapeXml、fn:indexOf、fn:join、fn:replace、fn:split、fn:startsWith、fn:substring、fn:substringAfter、fn:substringBefore、fn:toLowerCase、fn:toUpperCase、fn:trim

以下是各個函數的用途和屬性以及簡單示例。

9.7.1 長度函數 fn:length 函數
       長度函數fn:length的出現有重要的意義。在JSTL1.0中,有一個功能被忽略了,那就是對集合的長度取值。雖然java.util.Collection接口定義了size方法,但是該方法不是一個標準的JavaBean屬性方法(沒有get,set方法),因此,無法通過EL表達式“ ${collection.size} ”來輕鬆取得。

fn:length函數正是爲了解決這個問題而被設計出來的。它的參數爲input,將計算通過該屬性傳入的對象長度。該對象應該爲集合類型或String類型。其返回結果是一個int類型的值。下面看一個示例。

<%ArrayList arrayList1 = new ArrayList();
                            arrayList1.add("aa");
                            arrayList1.add("bb");
                            arrayList1.add("cc");

%>
<%request.getSession().setAttribute("arrayList1", arrayList1);%>
${fn:length(sessionScope.arrayList1)}

假設一個ArrayList類型的實例“ arrayList1 ”,併爲其添加三個字符串對象,使用fn:length函數後就可以取得返回結果爲“ 3 ”。

9.7.2 判斷函數 fn:contains 函數
       fn:contains函數用來判斷源字符串是否包含子字符串。它包括string和substring兩個參數,它們都是String類型,分佈表示源字符串和子字符串。其返回結果爲一個boolean類型的值。下面看一個示例。

${fn:contains("ABC", "a")}<br>
${fn:contains("ABC", "A")}<br>

前者返回“ false ”,後者返回“ true ”。

9.7.3 fn:containsIgnoreCase函數 
      fn:containsIgnoreCase函數與fn:contains函數的功能差不多,唯一的區別是fn:containsIgnoreCase函數對於子字符串的包含比較將忽略大小寫。它與fn:contains函數相同,包括string和substring兩個參數,並返回一個boolean類型的值。下面看一個示例。

${fn:containsIgnoreCase("ABC", "a")}<br>
${fn:containsIgnoreCase("ABC", "A")}<br>

前者和後者都會返回“ true ”。


9.7.4 詞頭判斷函數 fn:startsWith 函數
       fn:startsWith函數用來判斷源字符串是否符合一連串的特定詞頭。它除了包含一個string參數外,還包含一個subffx參數,表示詞頭字符串,同樣是String類型。該函數返回一個boolean類型的值。下面看一個示例。

${fn:startsWith ("ABC", "ab")}<br>
${fn:startsWith ("ABC", "AB")}<br>

前者返回“ false ”,後者返回“ true ”。


9.7.5 詞尾判斷函數 fn:endsWith 函數
       fn:endsWith函數用來判斷源字符串是否符合一連串的特定詞尾。它與fn:startsWith函數相同,包括string和subffx兩個參數,並返回一個boolean類型的值。下面看一個示例。

${fn:endsWith("ABC", "bc")}<br>
${fn:endsWith("ABC", "BC")}<br>

前者返回“ false ”,後者返回“ true ”。


9.7.6 字符實體轉換函數 fn:escapeXml 函數
fn:escapeXml函數用於將所有特殊字符轉化爲字符實體碼。它只包含一個string參數,返回一個String類型的值。


9.7.8 字符匹配函數 fn:indexOf 函數
       fn:indexOf函數用於取得子字符串與源字符串匹配的開始位置,若子字符串與源字符串中的內容沒有匹配成功將返回“ -1 ”。它包括string和substring兩個參數,返回結果爲int類型。下面看一個示例。

${fn:indexOf("ABCD","aBC")}<br>
${fn:indexOf("ABCD","BC")}<br>

前者由於沒有匹配成功,所以返回-1,後者匹配成功將返回位置的下標,爲1。

9.7.9 分隔符函數 fn:join 函數
       fn:join函數允許爲一個字符串數組中的每一個字符串加上分隔符,並連接起來。它的參數、返回結果和描述如表9.25所示:

表9.25 fn:join函數

參數

描述

array

字符串數組。其類型必須爲String[]類型

separator

分隔符。其類型必須爲String類型

返回結果

返回一個String類型的值

下面看一個示例。

<% String[] stringArray = {"a","b","c"}; %>
<%request.getSession().setAttribute("stringArray", stringArray);%>
${fn:join(sessionScope.stringArray,";")}<br>

定義數組並放置到Session中,然後通過Session得到該字符串數組,使用fn:join函數並傳入分隔符“ ; ”,得到的結果爲“ a;b;c ”。


9.7.10 替換函數 fn:replace 函數
       fn:replace函數允許爲源字符串做替換的工作。它的參數、返回結果和描述如表9.26所示:

表9.26 fn:replace函數

參數

描述

inputString

源字符串。其類型必須爲String類型

beforeSubstring

指定被替換字符串。其類型必須爲String類型

afterSubstring

指定替換字符串。其類型必須爲String類型

返回結果

返回一個String類型的值

下面看一個示例。

${fn:replace("ABC","A","B")}<br>

將“ ABC ”字符串替換爲“ BBC ”,在“ ABC ”字符串中用“ B ”替換了“ A ”。


9.7.11 分隔符轉換數組函數 fn:split 函數
       fn:split函數用於將一組由分隔符分隔的字符串轉換成字符串數組。它的參數、返回結果和描述如表9.27所示:

表9.27 fn:split函數

參數

描述

string

源字符串。其類型必須爲String類型

delimiters

指定分隔符。其類型必須爲String類型

返回結果

返回一個String[]類型的值

下面看一個示例。

${fn:split("A,B,C",",")}<br>

將“ A,B,C ”字符串轉換爲數組{A,B,C}。


9.7.12 字符串截取函數 fn:substring 函數
       fn:substring函數用於截取字符串。它的參數、返回結果和描述如表9.28所示:

表9.28 fn:substring函數

參數

描述

string

源字符串。其類型必須爲String類型

beginIndex

指定起始下標(值從0開始)。其類型必須爲int類型

endIndex

指定結束下標(值從0開始)。其類型必須爲int類型

返回結果

返回一個String類型的值

下面看一個示例。

${fn:substring("ABC","1","2")}<br>

截取結果爲“ B ”。


9.7.14 起始到定位截取字符串函數 fn:substringBefore 函數
       fn:substringBefore函數允許截取源字符從開始到某個字符串。它的參數和fn:substringAfter函數相同,不同的是substring表示的是結束字符串。下面看一個示例。

${fn:substringBefore("ABCD","BC")}<br>

截取的結果爲“ A ”。


9.7.15 小寫轉換函數 fn:toLowerCase 函數
       fn:toLowerCase函數允許將源字符串中的字符全部轉換成小寫字符。它只有一個表示源字符串的參數string,函數返回一個String類型的值。下面看一個示例。

${fn:toLowerCase("ABCD")}<br>

轉換的結果爲“ abcd ”。


9.7.16大寫轉換函數 fn:toUpperCase 函數
       fn:toUpperCase函數允許將源字符串中的字符全部轉換成大寫字符。它與fn:toLowerCase函數相同,也只有一個String參數,並返回一個String類型的值。下面看一個示例。

${fn:toUpperCase("abcd")}<br>

轉換的結果爲“ ABCD ”。


9.7.17空格刪除函數 fn:trim 函數
       fn:trim函數將刪除源字符串中結尾部分的“空格”以產生一個新的字符串。它與fn:toLowerCase函數相同,只有一個String參數,並返回一個String類型的值。下面看一個示例。

${fn:trim("AB C ")}D<br>

轉換的結果爲“ AB CD ”,注意,它將只刪除詞尾的空格而不是全部,因此“ B ”和“ C ”之間仍然留有一個空格。

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