首页 > 开发 > JSP > 正文

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

2020-02-05 14:00:50
字体:
来源:转载
供稿:网友
流程控制

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表