js|過程|網頁 格式標記庫:格式動作
如果你已經使用了Java的 DateFormat 和NumberFormat類,在下面的標記中使用的方法應該看起來眼熟,因為JSTL格式化動作是在這些類之上建立的。這些Java類普遍提供一個format( )函數,它將一個Java類型轉化為一個格式化的String和建立對應於該String的Java對象。
fmt:formatNumber動作有一個value屬性和一個pattern屬性。value屬性是一個與我們吹降鈉淥黺alue屬性類似的EL運算式或者變數。pattern屬性與在NumberFormat類中定義的模式一樣。下列動作發送一個格式化的String到JSP頁的輸出上:
<fmt:formatNumber value="1000.001" pattern="#,#00.0#"/>
在這個fmt:formatNumber動作裡,我們使用了type屬性來指定:格式化我們需要格式化的值為一個貨幣值。我們儲存格式化的結果在一個變數名為dollars中。在一個美國的locale類中,下面的程式產生一個字串$3456.79(注意,它將使用的貨幣值四捨五入了):
<fmt:formatNumber value="3456.789" type="currency" var="dollars"/>
用於上面的type屬性的可能值包括currency、 number、 和percent。
在例中,我們使用了另一種方法——使用了一個包括在value屬性中的一個格式化的域(currency,每type屬性)的一個文本字串。並且解析它來擷取一個數字。結果儲存在由var屬性指定的一個變數內。儘管這個屬性是可選的,還是會經常使用它。另外,解析的值送到頁輸出上:
<fmt:parseNumber value="${currencyInput}" type="currency" var="parsedNumber"/>fmt:formatDate動作有一個value屬性、一個format屬性、一個指向處理格式化的格式類的屬性(典型的,如java.util.Date):<jsp:useBean id="now" class="java.util.Date" /><fmt:formatDate value="${now}" timeStyle="long"dateStyle="long"/>
像數字格式化一樣,JSTL頁提供一個機制來解析一個代表日期的、進入Date對象的字串:
<fmt:parseDate value="${dateInput}" pattern="MM dd, YYYY" />
查看java.util.DateFormat類,瞭解如何處理格式化和模式的更多詳細的資料。
格式標記庫:國際化動作
Java本地化的一個關鍵點是ResourceBundle類。JSTL動作允許你用這個類簡單的工作。這個例子使用了fmt:bundle動作來得到與當前Locale 和 fmt:message動作對應的一個ResourceBundle動作,從而查看該資源套件中的本地化的字串:
<fmt:bundle basename="myBundle"><%-- Use values in myBundle --%><fmt:message key="Introduction"> <fmt:param value="${loginName}"/> <fmt:param value="${loginCount}"/></fmt:message><fmt:formatDate value="${now}" var="parsedDate"/></fmt:bundle>
經常,fmt:message動作簡單的查看了對應於一個關鍵詞的字串。在上面的例子中,在ResourceBundle中的字串包含了取代兩個值的預留位置。這些值在fmt:param動作中定義過,這就像Java MessageFormat類使用的方法。
有一些類似的動作可指定一個時區,時區可應用到在標記的體中計算的任何事上:
<fmt:timeZone value="someTimeZone"><!-- actions in this context will be evaluated using someTimeZone --></fmt:timeZone>
上述的fmt:bundle 和 fmt:timeZone動作有分別對應的fmt:setBundle和fmt:setTimeZone的動作。這些動作添加了可選的scope屬性;因此,你可以使用這些動作在任何等同於應用範圍的範圍內設定一個資源捆綁或者一個時區。
如果你用非歐洲的locale類工作的話,你可能得擔心編碼的問題,JSTL支援用fmt:requestEncoding動作編碼。
SQL標記庫
JSTL 允許容易的資料庫的整合。但是,值得注意的是:沙箱之外的JSTL的執行有一些限制。主要的問題與串連池有關。建立並維護到資料庫的串連是很消耗資源的。JSTL SQL動作使得許多資料庫連接建立起來,通常的,每個使用者至少有一個。因此,JSTL SQL標記對於原型開發的或低容量的、基於Web的應用程式意義重大。但是它不適合於大規模的應用程式。一個可縮放的產品應用程式一般是在一個頁面內處理資料庫訪問如隱藏資料庫訪問和處理像串連池之類的細節。但是,還是有方法允許你實現串連池和用一點自訂碼來使用JSTL SQL動作
我們看一些簡單的例子。這些例子使用來自SQL庫的JSTL標記。如果你熟悉SQL基礎的話,你應該能夠改編這些例子用在你的應用程式上。
在下面的程式片斷中,我們建立了一條到一個資料庫的串連,選擇一組匹配一個訂單ID的訂單項目,並且在一個表格中顯示item屬性:
<sql:setDataSource driver="com.cheapDrivers.jdbcDriver" url="jdbc:cheapDrivers:." user="guest" password="password" var="dataSource" /><sql:query var="orderItems" dataSource="${dataSource}">SELECT * FROM itemsWHERE order_id = <cout value="${orderID}"/> ORDER BY price</sql:query><table><c:forEach var="row" items="${orderItems.rows}"><tr><td><c:out value="${row.itemName}"/></td><td><c:out value="${row.price}"/></td><td><c:out value="${row.weight}"/></td></tr></c:forEach></table>
在下一個例子中,我會說明JSTL是如何支援資料庫事務的,在資料庫中,許多包含對錶格多個改動的操作必須是對所有的,或者什麼也不做:如果出現一個問題時,改動必須為空白操作。在下面例子中,sql:update動作包含在一個sql:transaction動作內,如果在交易處理過程中,存在任何SQL錯誤的話,在事務範圍內執行的所有操作都得重來。
sql:update動作的命名有一點誤導:除了SQL UPDATE外,sql:update也支援INSERT 和 DELETE,甚至是SQL CREATE。實際上,它支援不產生結果的任何一條SQL操作。在下面的例子中,sql:update通過插入變數值到一個PreparedStatement中來執行一個UPDATE動作。在這個代碼片斷中,我們在兩個賬戶之間傳送錢(需要預先封裝在一個事務中的某些東西的一個經典的例子):
<sql:transaction dataSource="${dataSource}"><sql:update>UPDATE accountSET account_balance =account_balance -?WHERE accountNo = ?<sql:param value="${transferAmount}"/><sql:param value="${sourceAccount}"/></sql:update><sql:update>UPDATE accountSET account_balance =account_balance +?WHERE accountNo = ?<sql:param value="${transferAmount}"/><sql:param value="${destAccount}"/></sql:update></sql:transaction>
XML標記庫
使用標準的XML標記庫,你所能做的完整的處理,特別是可擴充性單一語言變換說明(XSLT)的處理,對於另一篇文章來說是一個很好的主題。下面我會涵蓋足夠的讓你開始的知識。
在JSTL的XML支援遵循XPath規範。XPath的重要功能之一是為訪問XML著名的分層的資訊提供一個清晰的文法。也許看到每件是如何工作的最容易的方法就是看看我們如何使用來自於一個真實JSTL頁的一個片斷裡的標記:
!-- Find and parse our XML document (somewhere on the WWW) --><c:import url="http://www.cheapstuff.com/orderStatus?id=2435" var="xml"/><x:parse xml="${xml}" var="doc"/><!-- access XML data via XPath expressions --><x:out select="$doc/name"/><x:out select="$doc/shippingAddress"/><x:out select="$doc/deliveryDate"/><!-- Set a scoped variable --><x:set var="custName" scope="request" select="$doc/name"/>
在上面的輸入和解析動作中,我們裝載和解析了一個指定的XML文檔到一個變數doc裡。在上面的每個x:out動作中,我們使用了一個XPath運算式訪問瞭解析的XML文檔的元素,並且發送結果到JSP頁輸出中。
上面的設定運算式計算了一個XPath運算式並且將結果輸入到一個限定範圍的變數裡(在上述例子中,它指在一個請求範圍內)。
x:out 和x:set動作可以輸出一個JspTagException。如果他們沒有成功的話(極有可能因為XPath運算式指向並不存在的標記),你的頁,像在所有其他情況下一樣,應該智能的處理這些異常(要麼通過傳統的JSP errorPage指令,要麼使用JSTL的c:catch動作),
JSTL容易處理XSLT轉換。在下面的示範頁中,我們使用來自XML標記庫中的x:transform動作,用一個XSLT stylesheet建立一個來自於XML來源文件的一個格式化的頁。x:transform動作最重要的屬性是XML和XSLT屬性,在下面的例子中,我們設定了一個來自於我們在同一頁初始化的變數的xslt屬性;我們也在動作的體中設定了XML屬性。該動作預設為x:transform動作。
預設的,轉換的結果送到頁輸出上;你也可以儲存結果到一個帶x:var屬性的變數內:
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %><%@ taglib uri="http://java.sun.com/jstl/xml" prefix="x" %><c:set var="xsltSource"> <?xml version="1.0"?><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"><xsl:template match="/"> <xsl:apply-templates/></xsl:template><xsl:template match="music"><html><head></head><body marginheight="0" marginwidth="0" topmargin="0" leftmargin="0"><table cellpadding="0" cellspacing="0" border="1" bgcolor="#ffffff"> <tr> <td><STRONG>Artist</STRONG></td> <td><STRONG>Album</STRONG></td> <td><STRONG>Year</STRONG></td> <td><STRONG>Genre</STRONG></td> </tr> <!---Set up for loop to collect all the artist information //--> <!-- <xsl:for-each select="./*[name()= artists ]"> --> <xsl:for-each select="artists"> <tr> <td><xsl:value-of select="artist"/></td> <td><xsl:value-of select="album"/></td> <td><xsl:value-of select="year"/></td> <td><xsl:value-of select="genre"/></td> </tr> </xsl:for-each></table></body></html></xsl:template></xsl:stylesheet></c:set> <x:transform xslt="${xsltSource}" ><music><artists> <artist>Jonny B</artist> <album>Feedback and Distortion</album> <year>2001</year> <genre>Rock</genre> </artists> <artists> <artist>Harmony s Nieces</artist> <album>Sappy Pop Ballads</album> <year>2002</year> <genre>Pop</genre> </artists> </music></x:transform>
你也能使用c:import動作再定義一個額外的來源文件和stylesheet,就好像在這個示範的代碼片斷展示的一樣::
<c:import var="${xmlSource}" url="${someDocumentURL}" /><c:import var="${xsltSource}" url="${anotherDocumentURL}" /><x:transform xml="${xmlSource}" xslt="${xsltSource}" >
結束語
至此,你應該對JSTL、它的四種標準標記庫、和它如何使網頁開發更為容易 有了很好的理解。現在你開始寫一些JSTL!