JSTL EL 詳解

概述 JavaWind.net Document
      在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規範做爲介紹的重點。html

 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表達式java

      <%@ 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應用服務器中使用。git

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

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

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

<%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:提交請求的頁面和接受的頁面cookie

<%@ 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 、十二、13
         </c:otherwise>
</c:choose>

該示例將判斷request請求提交的傳入控件數組參數中,下標爲「2」控件內容是否爲「11」或「12」或「13」,並根據判斷結果顯示各自的語句,若都不是則顯示「not 11 、十二、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 」之間仍然留有一個空格。

相關文章
相關標籤/搜索