9.7 Functions標籤庫
稱呼Functions標籤庫爲標籤庫,倒不如稱呼其爲函數庫來得更容易理解些。因爲Functions標籤庫並沒有提供傳統的標籤來爲JSP頁面的工作服務,而是被用於EL表達式語句中。在JSP2.0規範下出現的Functions標籤庫爲EL表達式語句提供了許多更爲有用的功能。Functions標籤庫分爲兩大類,共16個函數。
q 長度函數:fn:length
q 字符串處理函數: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
以下是各個函數的用途和屬性以及簡單示例。
長度函數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 ”。
fn:contains函數用來判斷源字符串是否包含子字符串。它包括string和substring兩個參數,它們都是String類型,分佈表示源字符串和子字符串。其返回結果爲一個boolean類型的值。下面看一個示例。
${fn:contains("ABC", "a")}<br>
${fn:contains("ABC", "A")}<br>
前者返回“false ”,後者返回“true ”。
fn:containsIgnoreCase函數與fn:contains函數的功能差不多,唯一的區別是fn:containsIgnoreCase函數對於子字符串的包含比較將忽略大小寫。它與fn:contains函數相同,包括string和substring兩個參數,並返回一個boolean類型的值。下面看一個示例。
${fn:containsIgnoreCase("ABC","a")}<br>
${fn:containsIgnoreCase("ABC","A")}<br>
前者和後者都會返回“true ”。
fn:startsWith函數用來判斷源字符串是否符合一連串的特定詞頭。它除了包含一個string參數外,還包含一個subffx參數,表示詞頭字符串,同樣是String類型。該函數返回一個boolean類型的值。下面看一個示例。
${fn:startsWith ("ABC", "ab")}<br>
${fn:startsWith ("ABC", "AB")}<br>
前者返回“false ”,後者返回“true ”。
fn:endsWith函數用來判斷源字符串是否符合一連串的特定詞尾。它與fn:startsWith函數相同,包括string和subffx兩個參數,並返回一個boolean類型的值。下面看一個示例。
${fn:endsWith("ABC", "bc")}<br>
${fn:endsWith("ABC", "BC")}<br>
前者返回“false ”,後者返回“true ”。
fn:escapeXml函數用於將所有特殊字符轉化爲字符實體碼。它只包含一個string參數,返回一個String類型的值。
fn:indexOf函數用於取得子字符串與源字符串匹配的開始位置,若子字符串與源字符串中的內容沒有匹配成功將返回“-1 ”。它包括string和substring兩個參數,返回結果爲int類型。下面看一個示例。
${fn:indexOf("ABCD","aBC")}<br>
${fn:indexOf("ABCD","BC")}<br>
前者由於沒有匹配成功,所以返回-1,後者匹配成功將返回位置的下標,爲1。
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 ”。
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 ”。
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}。
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 ”。
fn:toLowerCase函數允許將源字符串中的字符全部轉換成小寫字符。它只有一個表示源字符串的參數string,函數返回一個String類型的值。下面看一個示例。
${fn:toLowerCase("ABCD")}<br>
轉換的結果爲“abcd ”。
fn:toUpperCase函數允許將源字符串中的字符全部轉換成大寫字符。它與fn:toLowerCase函數相同,也只有一個String參數,並返回一個String類型的值。下面看一個示例。
${fn:toUpperCase("abcd")}<br>
轉換的結果爲“ABCD ”。
fn:trim函數將刪除源字符串中結尾部分的“空格”以產生一個新的字符串。它與fn:toLowerCase函數相同,只有一個String參數,並返回一個String類型的值。下面看一個示例。
${fn:trim("AB C ")}D<br>
轉換的結果爲“AB CD ”,注意,它將只刪除詞尾的空格而不是全部,因此“B ”和“C ”之間仍然留有一個空格。
在企業級應用越來越依賴XML的今天,XML格式的數據被作爲信息交換的優先選擇。XML processing標籤庫爲程序設計者提供了基本的對XML格式文件的操作。在該標籤庫中的標籤一共有10個,被分爲了三類,分別是:
q XML核心標籤:<x:parse>、<x:out>、<x:set>。
q XML流控制標籤:<x:if>、<x:choose>、<x:when>、<x:otherwise>、<x:forEach>。
q XML轉換標籤:<x:transform>、<x:param>。
由於該組標籤庫專注於對某一特定領域的實現,因此本書將只選擇其中常見的一些標籤和屬性進行介紹。
<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}"/>
看到I18N就應該想到知識“國際化”,I18N formatting標籤庫就是用於在JSP頁面中做國際化的動作。在該標籤庫中的標籤一共有12個,被分爲了兩類,分別是:
q 國際化核心標籤:<fmt:setLocale>、<fmt:bundle>、<fmt:setBundle>、<fmt:message>、<fmt:param>、<fmt:requestEncoding>。
q 格式化標籤:<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 |