JSTL改进JSP来简化网页的实现过程(4)

发表于:2007-07-01来源:作者:点击数: 标签:
格式标记库:格式动作 如果你已经使用了Java的 DateFormat 和NumberFormat类,在下面的标记中使用的方法应该看起来眼熟,因为JSTL格式化动作是在这些类之上建立的。这些Java类普遍提供一个format( )函数,它将一个Java类型转化为一个格式化的String和创建对应
格式标记库:格式动作

如果你已经使用了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 items WHERE 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 aclearcase/" target="_blank" >ccount SET account_balance =account_balance -? WHERE accountNo = ? <sql:param value="${transferAmount}"/> <sql:param value="${sourceAccount}"/> </sql:update> <sql:update> UPDATE account SET 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!

原文转自:http://www.ltesting.net