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

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

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

流程控制

让我们转为讨论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一样容易使用的方法,一开始建立在国际化支持上也是十分有益的。

标签:

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

上一篇:请高手务必帮忙,关于JAVA的一段代码!!!谢谢了

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