JSTL改进JSP来简化网页的实现过程(3)
发表于:2007-07-01来源:作者:点击数:
标签:
流程控制 让我们转为讨论JSTL的流程控制和条件标记。如果你已经用任何一种语言使用了条件和流程控制语句,理论上这里没什么新鲜的东西。 c:if动作处理简单条件语句的 测试 。计算测试属性中的Boolean表达式的值,如果表达式为真的话,计算体的内容。在下面的
流程控制
让我们转为讨论JSTL的流程控制和条件标记。如果你已经用任何一种语言使用了条件和流程控制语句,理论上这里没什么新鲜的东西。
c:if动作处理简单条件语句的
测试。计算测试属性中的Boolean表达式的值,如果表达式为真的话,计算体的内容。在下面的动作中,我们也说明了备选项var属性。为了以后的使用,var属性保存测试结果在页(如果没有指定其他scope属性的话)中。
<c:if test="${status.totalVisits == 1000000}" var="visits">
You are the millionth visitor to our site! Congratulations!
</c:if> |
下面我们展示了用c:choose、 c:when、 和 c:otherwise交换逻辑的JSTL的支持。一组c:when动作可能包括在一个备选的标记内,如果在c:when块中任何表达式计算值为真的话,就不用计算c:choose动作内的测试。如果c:when块中没有一个测试计算值为真的时候:如果出现c:otherwise动作内容时,则计算c:otherwise动作的内容:
<c:choose>
<c:when test="${item.type == book }">
...
</c:when>
<c:when test="${item.type == electronics }">
...
</c:when>
<c:when test="${item.type == toy }">
...
</c:when>
<c:otherwise>
...
</c:otherwise>
</c:choose> |
c:foreach动作提供一个容易的方法来迭代一个集合的元素。如果你想只迭代集合的一部分的话,你可以分别用begin、 end、 和 step属性指定起点、终点和一个递增值。在下面的例子中,我们在变量customerNames中迭代一个集合的内容;在每个循环中,下一个元素输入到变量名内并在c:foreach动作的体内计算:
<table>
<c:forEach var="name" items="${customerNames}">
<tr><td><c:out value="${name}"/></td></tr>
</c:forEach>
</table> |
记得Java的StringTokenizer类吗?有了c:forTokens动作,你可以用JSTL获得类似的功能。这个程序片断可使用在delims属性中定义的定界符通过items String属性中的条目迭代。注意,items 属性不必是一个字符直接量;它可以是任何有效的EL表达式:
<table>
<c:forTokens items="47,52,53,55,46,22,16,2" delim="," var="dailyPrice">
<tr><td><c:out value="${dailyPrice}"/></td></tr>
</c:forTokens>
</table> |
在接下来的完整的JSTL页中,我列出了已经传递到该页的所有参数。param 和paramValues对象是映射关键字到一个或多个值的Java Map集。在本例中,我们找出了用于集合的每个MapEntry的关键字即参数名,并且使用关键字来查找所有与关键字关联的参数值:
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
<html>
<body>
<head>
<title>Parameter Listing Example</title>
</head>
<br>
<b>Parameter values passed to this page for each parameter: </b>
<table border="2">
<c:forEach var="current" items="${param}">
<tr>
<td>
<b><c:out value="${current.key}" /></b>
</td>
<c:forEach var="aVal" items="${paramValues[current.key]}">
<td>
<c:out value="${aVal}" />
</td>
</c:forEach>
</tr>
</c:forEach>
</table>
</body>
</html> |
其他动作
我们也需要讨论一些其他重要的核心标记库动作。在网页实现中一个潜在的问题范围与URL编码有关。没有URL编码,在网页中传递的URL的某个字符如空格,可能会迷惑Web
服务器。URL编码确保这些特殊的字符用不引起迷惑的字符代替。下列例子在变量myUrl中定义了一个URL,该变量myUrl由一个URL和一系列参数组成。URL动作(注意,这里只在JSTL意义上的动作)保证所有字符都正确的编码:
<c:url value="http://acme.com/exec/register" var="myUrl">
<c:param name="name" value="${param.name}"/>
<c:param name="country" value="${param.country}"/>
</c:url>
<a href= <c:out value="${myUrl}"/> >Register</a> |
在上面的代码中,param动作简单的定义了一组名值对。
JSP允许设计者用
指令包括其他页的内容。JSTL用JSTL c:import动作扩展了这个概念。c:import的主要优势是:你能指定一个任意的URL;也可以包含你的Web应用之外(W3C的任何地方)的页的内容或者你的服务器上的另一个Web应用内的页的内容。
对于一组与HTTP相关的标记来说,没有一个方法处理HTTP重定向是不完整的。JSTL用c:redirect动作支持它。
国际化标记库
在讨论了JSTL支持国际化中,我假设你已经有了对下列主题的合理的理解:
●资源包和Java如何找到它们
●Locale类
●资源包查找和MessageFormat类
●局部编码以及它与Java国际化的关系
●Java文本和数据格式化
我在下面的两个部分讨论了国际化标记库。在第一部分,我包括了你可能使用的格式化和解释相关的动作(它最初对应于java.text封装包中的类),尽管你没有开发过完全的国际化应用程序,可能你也要用到它。在第二部分,我说明了更针对于国际化的动作。
如果存在一个远程的可能性,你的应用程序会在你本国之外使用。如果你从一开始就建立在国际化的支持上,那么开发就会更加容易。无论你使用何种方法来开发,即使像JSTL一样容易使用的方法,一开始建立在国际化支持上也是十分有益的。
原文转自:http://www.ltesting.net