在下面的程序片断中,我们建立了一条到一个数据库的连接,选择一组匹配一个订单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 account
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="$d