在JSP頁面中,使用標籤庫代替傳統的Java片段語言來實現頁面的顯示邏輯已經不是新技術了,然而,由自定義標籤很容易造成重複定義和非標準的實現。鑑於此,出現了JSTL(JSP Standard Tag Library),爲大多數JSP頁面邏輯提供了實現的JSTL技術,該技術本身就是一個標籤庫。 9.2.1 JSTL EL 表達式語言簡介 JavaWind.net Document <%@ page contentType="text/html; charset=UTF-8"%> 9.2.2 EL 表達式的默認變量 JavaWind.net Document 1.默認變量pageScope、requestScope、sessionScope、applicationScope 例9.2:使用sessionScope變量的EL表達式 <%request.getSession().setAttribute("sampleValue", new Integer(10));%> 取得保存在Session中參數的sessionScope變量的EL表達式,“.”是property訪問操作符,在這裏表示從Session中取得“鍵”爲“sampleValue”的參數,並顯示出來。顯示結果爲“10”。 2.默認變量param、paramValues 例9.3:提交請求的頁面和接受的頁面 <%@ page contentType="text/html; charset=UTF-8"%> 在這個頁面中定義了兩組控件,控件名爲“sampleValue”的是一套控件數組,控件名爲“sampleSingleValue”的是單一控件,通過遞交將請求參數傳送到SampleJsp.jsp。 <%@ page contentType="text/html; charset=UTF-8"%> 這是請求轉發到的頁面,通過EL表達式的paramValues變量得到控件數組中最後一個控件的遞交參數,通過EL表達式的param變量得到單一控件的遞交參數。控件數組參數的EL表達式使用“[]”來指定數組下標。本示例將顯示控件數組中最後一個控件的值“12”和單一控件的值“SingleValue”。 3.默認變量header、headerValues 4.默認變量cookie 5.默認變量initParam 6.默認變量pageContext |
標籤庫介紹 JavaWind.net Document
表達式的操作符 表9.1 EL表達式的操作符
這些操作符都是極其有用的,下面通過幾個示例來演示它們的使用方法: 例9.4:幾組操作符的示例 ${pageScope.sampleValue + 12} <br> //顯示12 可以看到,對於這些示例,程序設計者完全無需管理它們的類型轉換,在表達式內部都已經處理了。有了EL表達式,在JSP頁面的編程變得更靈活,也更容易。 標籤庫介紹 表9.2 標籤庫的標識符
下面看例9.5,簡單使用標籤庫的示例。 例9.5:簡單JSTL標籤庫示例 <%@ page contentType="text/html; charset=UTF-8"%> 在該示例的JSP頁面中聲明瞭將使用Core標籤庫,它的URI爲“http://java.sun.com/jsp/jstl/core”,前綴爲“c”。之後,頁面中<c:forEach>標籤就是使用了JSTL的標籤進行了工作。對於該標籤的功能,這裏暫時不作具體講解,只是讓讀者能夠有個簡單的概念,瞭解怎樣定義和使用標籤庫。 多用途核心標籤:<c:out>、<c:set>、<c:remove>、<c:catch>。 以下是各個標籤的用途和屬性以及簡單示例。 用於顯示的 <c:out> 標籤 JavaWind.net Document 表9.3 <c:out>標籤屬性和說明
在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>標籤 表9.4 <c:set>標籤屬性和說明
當不存在value的屬性時,將以包含在標籤內的實體數據作爲賦值的內容。下面看一個示例: <c:set value="this is andy" var="oneString"/> 該示例將爲名爲“oneString”的變量賦值爲“this is andy”,其作用範圍爲page。 9.3.3 用於刪除的 <c:remove> 標籤 表9.5 <c:remove>標籤屬性和說明
下面看一個示例: <c:remove var="sampleValue" scope="session"/> 該示例將存在於Session中名爲“sampleValue”的變量刪除。下一句EL表達式顯示該變量時,該變量已經不存在了。 9.3.4 用於異常捕獲的 <c:catch> 標籤 <c:catch var="err"> ${param.sampleSingleValue[9] == 3}</c:catch> 當“${param.sampleSingleValue[9] == 3}”表達式有異常時,可以從var屬性“err”得到異常的內容,通常判斷“err”是否爲null來決定錯誤信息的提示。 9.3.5 用於判斷的 <c:if> 標籤 表9.6 <c:if>標籤屬性和說明
下面看一個示例: <c:if test="${paramValues.sampleValue[2] == 12}" var="visits">It is 12</c:if><br> 該示例將判斷request請求提交的傳入控件數組參數中,下標爲“2”的控件內容是否爲“12”,若爲12則顯示“It is 12”。判斷結果被保存在page範圍中的“visits”變量中。 9.3.6 用於複雜判斷的 <c:choose> 、 <c:when> 、 <c:otherwise> 標籤 <c:choose>標籤沒有屬性,可以被認爲是父標籤,<c:when>、<c:otherwise>將作爲其子標籤來使用。 下面看一個複雜條件語句的示例。 <c:choose> 該示例將判斷request請求提交的傳入控件數組參數中,下標爲“2”控件內容是否爲“11”或“12”或“13”,並根據判斷結果顯示各自的語句,若都不是則顯示“not 11 、12、13”。 9.3.7 用於循環的 <c:forEach> 標籤 表9.7 <c:forEach>標籤屬性和說明
下面看一個集合循環的示例。 <%ArrayList arrayList = new ArrayList(); 該示例將保存在Session中的名爲“arrayList”的ArrayList類型集合參數中的對象依次讀取出來,items屬性指向了ArrayList類型集合參數,var屬性定義了一個新的變量來接收集合中的對象。最後直接通過EL表達式顯示在頁面上。下面看一個簡單循環的示例。 <c:forEach var="i" begin="1" end="10" step="1"> 該示例從“1”循環到“10”,並將循環中變量“i”顯示在頁面上。 9.3.8 用於分隔字符的 <c:forTokens> 標籤 表9.8 <c:forTokens>標籤屬性和說明
下面看一個示例。 <c:forTokens items="aa,bb,cc,dd" begin="0" end="2" step="2" delims="," var="aValue"> 需要分隔的字符串爲“aa,bb,cc,dd”,分隔符爲“,”。begin屬性指定從第一個“,”開始分隔,end屬性指定分隔到第三個“,”,並將做循環的變量名指定爲“aValue”。由於步長爲“2”,使用EL表達式${aValue}只能顯示“aa |
<x: > 標籤
9.3.9 用於包含頁面的<c:import> 表9.9 <c:import>標籤屬性和說明
下面看一個示例。 <c:import url="/MyHtml.html" var="thisPage" /> 該示例演示了三種不同的導入方法,第一種是在同一 Context 下的導入,第二種是在不同的 Context 下導入,第三種是導入任意一個 URL 。 9.3.10 用於得到URL地址的<c:url>標籤 表9.10 <c:url>標籤屬性和說明
下面看一個示例: <c:url value="/MyHtml.html" var="urlPage" /> 得到了一個 URL 後,以 EL 表達式放入 <a> 標籤的 href 屬性,達到鏈接的目的。 9.3.11 用於頁面重定向的<c:redirect>標籤 <c:redirect url="/MyHtml.html"/> 該示例若出現在 JSP 中,則將重定向到當前 Web Context 下的“ MyHtml.html ”頁面,一般會與 <c:if> 等標籤一起使用。 9.3.12 用於包含傳遞參數的<c:param>標籤 表9.11 <c:param>標籤屬性和說明
下面是一個示例: <c:redirect url="/MyHtml.jsp"> 該示例將爲重定向的“ MyHtml.jsp ”傳遞指定參數“ userName=’RW’ ”。 9.4 JSTL XML processing標籤庫 JavaWind.net Document XML核心標籤:<x:parse>、<x:out>、<x:set>。 由於該組標籤庫專注於對某一特定領域的實現,因此本書將只選擇其中常見的一些標籤和屬性進行介紹。 9.4.1 用於解析XML文件的<x:parse>標籤 表9.12 <x:parse>標籤屬性和說明
其中, var 、 scope 和 varDom 、 scopeDom 不應該同時出現,而應該被視爲兩個版本來使用,二者的變量都可以被 XML processing 標籤庫的其他標籤來使用。 <x:parse> 標籤單獨使用的情況很少,一般會結合 XML processing 標籤庫中的其他標籤來一起工作。下面看一個示例。 首先給出一個簡單的 XML 文件,將對該 XML 文件做解析,該 XML 文件名爲 SampleXml.xml 。 <?xml version="1.0" encoding="UTF-8"?> 標籤庫的工作: <c:import var="xmlFile" url="http://localhost:8080/booksamplejstl/SampleXml.xml"/> |
<fmt: > 標籤 JavaWind.net Document
看到I18N就應該想到知識“國際化”,I18N formatting標籤庫就是用於在JSP頁面中做國際化的動作。在該標籤庫中的標籤一共有12個,被分爲了兩類,分別是: 下面只選擇其中常見的一些標籤和屬性進行介紹。 9.5.1 用於設置本地化環境的<fmt:setLocale>標籤 表9.17 <fmt:setLocale>標籤屬性和說明
下面看一個示例: <fmt:setLocale value="zh_TW"/> 表示設置本地環境爲繁體中文。 9.5.2 用於資源文件綁定的<fmt:bundle>、<fmt:setBundle>標籤 根據Locale環境的不同將查找不同後綴的資源配置文件,這點在國際化的任何技術上都是一致的,通常來說,這兩種標籤單獨使用是沒有意義的,它們都會與I18N formatting標籤庫中的其他標籤配合使用。它們的屬性和描述如表9.18所示: 表9.18 <fmt:bundle>、<fmt:setBundle>標籤屬性和說明
下面看一個示例 <fmt:setLocale value="zh_CN"/> 該示例將會查找一個名爲applicationMessage_zh_CN.properties的資源配置文件,來作爲顯示的Resource綁定。 9.5.3 用於顯示資源配置文件信息的<fmt:message>標籤 表9.19 <fmt:message>標籤屬性和說明
下面看一個示例: <fmt:setBundle basename="applicationMessage" var="applicationBundle"/> 該示例使用了兩種資源配置文件的綁定的做法,“ applicationMessage ”資源配置文件利用<fmt:setBundle>標籤被賦於了變量“ applicationBundle ”,而作爲<fmt:bundle>標籤定義的“ applicationAllMessage ”資源配置文件作用於其標籤體內的顯示。 第一個<fmt:message>標籤將使用“ applicationAllMessage ”資源配置文件中“鍵”爲“ userName ”的信息顯示。 9.5.4 用於參數傳遞的<fmt:param>標籤 9.5.6 用於爲請求設置字符編碼的<fmt:requestEncoding>標籤 9.5.7 用於設定時區的<fmt:timeZone>、<fmt:setTimeZone>標籤 表9.20 <fmt:timeZone>、<fmt:setTimeZone>標籤屬性和說明
9.5.8 用於格式化數字的<fmt:formatNumber>標籤 表9.21 <fmt:formatNumber>標籤屬性和說明
<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>標籤 表9.22 <fmt:parseNumber>標籤屬性和說明
下面看一個示例。 <fmt:parseNumber value="15%" type="percent" var="num"/> 解析之後的結果爲“ 0.15 ”。 9.5.10 用於格式化日期的<fmt:formatDate>標籤 表9.23 <fmt:formatDate>標籤屬性和說明
<fmt:formatDate>標籤與<fmt:timeZone>、<fmt:setTimeZone>兩組標籤的關係密切。若沒有指定 timeZone屬性,也可以通過<fmt:timeZone>、<fmt:setTimeZone>兩組標籤設定的時區來格式化最後的結果。 9.5.11 用於解析日期的<fmt:parseDate>標籤 表9.24 <fmt:parseDate>標籤屬性和說明
<fmt:parseNumber>和<fmt:parseDate>兩組標籤都實現解析字符串爲一個具體對象實例的工作,因此,這兩組解析標籤對var屬性的字符串參數要求非常嚴格。就JSP頁面的表示層前段來說,處理這種解析本不屬於份內之事,因此<fmt:parseNumber>和<fmt:parseDate>兩組標籤應該儘量少用,替代工作的地方應該在服務器端表示層的後段,比如在Servlet中。 |
<sql:> 標籤 JavaWind.net Document
9.6 Database access 標籤庫 對於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 該示例定義一個數據源並保存在“ dataSrc ”變量內。 9.6.2 用於查詢的 <sql:query> 標籤 <sql:query var="queryResults" dataSource="${dataSrc}"> 該示例將返回查詢的結果到變量“ queryResults ”中,保存的結果是javax.servlet.jsp.jstl.sql.Result類型的實例。要取得結果集中的數據可以使用<c:forEach>循環來進行。下面看一個示例。 <c:forEach var="row" items="${queryResults.rows}"> “ rows ”是javax.servlet.jsp.jstl.sql.Result實例的變量屬性之一,用來表示數據庫表中的“列”集合,循環時,通過“ ${row.XXX} ”表達式可以取得每一列的數據,“ XXX ”是表中的列名。 9.6.3 用於更新的 <sql:update> 標籤 9.6.4 用於事務處理的 <sql:transaction> 標籤 9.6.5 用於事務處理的 <sql:param> 、 <sql:dateParam> 標籤 |
<fn:> 標籤 JavaWind.net Document
9.7 Functions 標籤庫 長度函數:fn:length 以下是各個函數的用途和屬性以及簡單示例。 9.7.1 長度函數 fn:length 函數 fn:length函數正是爲了解決這個問題而被設計出來的。它的參數爲input,將計算通過該屬性傳入的對象長度。該對象應該爲集合類型或String類型。其返回結果是一個int類型的值。下面看一個示例。 <%ArrayList arrayList1 = new ArrayList(); %> 假設一個ArrayList類型的實例“ arrayList1 ”,併爲其添加三個字符串對象,使用fn:length函數後就可以取得返回結果爲“ 3 ”。 9.7.2 判斷函數 fn:contains 函數 ${fn:contains("ABC", "a")}<br> 前者返回“ false ”,後者返回“ true ”。 9.7.3 fn:containsIgnoreCase函數 ${fn:containsIgnoreCase("ABC", "a")}<br> 前者和後者都會返回“ true ”。 9.7.4 詞頭判斷函數 fn:startsWith 函數 ${fn:startsWith ("ABC", "ab")}<br> 前者返回“ false ”,後者返回“ true ”。 9.7.5 詞尾判斷函數 fn:endsWith 函數 ${fn:endsWith("ABC", "bc")}<br> 前者返回“ false ”,後者返回“ true ”。 9.7.6 字符實體轉換函數 fn:escapeXml 函數 9.7.8 字符匹配函數 fn:indexOf 函數 ${fn:indexOf("ABCD","aBC")}<br> 前者由於沒有匹配成功,所以返回-1,後者匹配成功將返回位置的下標,爲1。 9.7.9 分隔符函數 fn:join 函數 表9.25 fn:join函數
下面看一個示例。 <% String[] stringArray = {"a","b","c"}; %> 定義數組並放置到Session中,然後通過Session得到該字符串數組,使用fn:join函數並傳入分隔符“ ; ”,得到的結果爲“ a;b;c ”。 9.7.10 替換函數 fn:replace 函數 表9.26 fn:replace函數
下面看一個示例。 ${fn:replace("ABC","A","B")}<br> 將“ ABC ”字符串替換爲“ BBC ”,在“ ABC ”字符串中用“ B ”替換了“ A ”。 9.7.11 分隔符轉換數組函數 fn:split 函數 表9.27 fn:split函數
下面看一個示例。 ${fn:split("A,B,C",",")}<br> 將“ A,B,C ”字符串轉換爲數組{A,B,C}。 9.7.12 字符串截取函數 fn:substring 函數 表9.28 fn:substring函數
下面看一個示例。 ${fn:substring("ABC","1","2")}<br> 截取結果爲“ B ”。 9.7.14 起始到定位截取字符串函數 fn:substringBefore 函數 ${fn:substringBefore("ABCD","BC")}<br> 截取的結果爲“ A ”。 9.7.15 小寫轉換函數 fn:toLowerCase 函數 ${fn:toLowerCase("ABCD")}<br> 轉換的結果爲“ abcd ”。 9.7.16大寫轉換函數 fn:toUpperCase 函數 ${fn:toUpperCase("abcd")}<br> 轉換的結果爲“ ABCD ”。 9.7.17空格刪除函數 fn:trim 函數 ${fn:trim("AB C ")}D<br> 轉換的結果爲“ AB CD ”,注意,它將只刪除詞尾的空格而不是全部,因此“ B ”和“ C ”之間仍然留有一個空格。 |