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

2008-02-23 09:41:04来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

格式标记库:格式动作

如果你已经使用了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错误的话,在事务范围内执行的所有操作都得重来。

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:JSTL改进JSP来简化网页的实现过程(3)

下一篇:学习struts的一个初等的小例子