顾名思义,jsp 标准标记库(jsp standard tag library,jstl)core 库为一些基本功能(如,管理限定了作用域的变量和与 url 交互等)和基本操作(如,迭代和条件化)提供了定制标记。这些标记不仅可以由页面设计人员直接利用,而且还为与其它 jstl 库相结合从而提供更复杂的表示逻辑奠定了基础。mark kolb 在本文中继续对 jstl 和 core 库进行探讨,研究用标记来协助流控制和 url 管理。
通过阅读本系列的第一篇文章,您对 jstl 有了初步的了解。我们描述了使用其表达式语言(el)来访问数据和操作数据。正如您所了解的那样,el 用来为 jstl 定制标记的属性赋予动态值,因此,它所起的作用与 jsp 表达式一样,为内置操作及其它定制标记库指定请求时的属性值。
为了演示 el 的用法,我们介绍了 core 库中的三个标记: 示例应用程序 为了演示 jstl 标记,我们将使用来自一个工作应用程序的示例,本系列中余下的文章都将使用此应用程序。由于基于 java 的 weblog 日渐流行及为人们所熟悉,因此我们将出于此目的使用一个简单的基于 java 的 weblog;参阅参考资料以下载该应用程序的 jsp 页面和源代码。weblog(也称为 blog)是一种基于 web 的简短注释的日志,这些注释是有关 weblog 的作者所感兴趣的主题,通常带有与 web 上其它地方的相关文章及讨论的链接。图 1 中显示了该应用程序正在运行时的抓屏。 图 1. weblog 应用程序 虽然完整的实现需要二十四个 java 类,但在表示层中却只涉及 weblog 应用程序中的两个类,entry 和 userbean。这样,对于理解 jstl 示例而言,只有这两个类比较重要。图 2 显示了 entry 和 userbean 的类图。 图 2. weblog 应用程序的类图 entry 类表示 weblog 中一个标有日期的项。其 id 属性用于在数据库中存储及检索该项,而 title 和 text 属性则表示该项的实际内容。created 和 lastmodified 属性引用了 java 语言中 date 类的两个实例,分别用来表示最初创建该项的时间和最后编辑该项的时间。author 属性引用了标识该项的创建者的 userbean 实例。 userbean 类存储了有关应用程序的已认证用户的信息,如用户名、全名和电子邮件地址。该类还包含一个用于与相关数据库进行交互的 id 属性。其最后一个属性 roles 引用一列 string 值,这列值标识与相应用户相关的、特定于应用程序的角色。对于 weblog 应用程序,相关的角色是“user”(所有应用程序用户常用的缺省角色)和“author”(该角色指定可以创建和编辑 weblog 项的用户)。 流控制 由于可以用 el 替代 jsp 表达式来指定动态属性值,因此页面创作人员无需使用脚本编制元素。因为脚本编制元素可能是引起 jsp 页面中维护问题的主要原因,所以 jstl 的主要优点就在于提供了这样简单(且标准)的替代方法。 el 从 jsp 容器检索数据,遍历对象层次结构,然后对结果执行简单的操作。不过,除了访问和操作数据之外,jsp 脚本编制元素的另一个常见用法是流控制。尤其是,页面创作人员常借助 scriptlet 来实现迭代或条件内容。然而,因为这样的操作超出了 el 的能力,所以 core 库提供了几个定制操作来管理流控制,其形式有迭代、条件化和异常处理。 迭代 在 web 应用程序环境中,迭代主要用于访存和显示数据集,通常是以列表或表中的一系列行的形式显示。实现迭代内容的主要 jstl 操作是 进行整数范围迭代用到了清单 1 中所示的 清单 1. 通过 body content 当出现 step 时,它也必须是整数值。它指定每次迭代后索引的增量。这样,迭代索引从 begin 属性的值开始,以 step 属性的值为增量进行递增,在迭代索引超过 end 属性的值时停止迭代。注:如果省略了 step 属性,那么步长缺省为 1。 如果指定了 var 属性,那么将会创建一个带有指定名称的并限定了作用域的变量,并将每次迭代的当前索引值赋给该变量。这一限定了作用域的变量具有嵌套式可视性 ― 只可以在 清单 2. 使用 如图 3 中所示,上面的示例代码生成了一张表,显示前五个偶数及其平方。这是通过将 begin 和 step 属性值指定为 2,而将 end 属性值指定为 10 实现的。此外,用 var 属性创建用于存储索引值的限定了作用域的变量, 图 3. 清单 2 的输出 在对集合的成员进行迭代时,用到了 清单 3. 通过 body content 表 1. items 的值 所产生的 item 值 java.util.collection 调用 iterator() 所获得的元素 java.util.map java.util.map.entry 的实例 java.util.iterator 迭代器元素 java.util.enumeration 枚举元素 object 实例数组 数组元素 基本类型值数组 经过包装的数组元素 用逗号定界的 string 子字符串 javax.servlet.jsp.jstl.sql.result sql 查询所获得的行 可以使用 begin、end 和 step 属性来限定在迭代中包含集合中哪些元素。和通过 清单 4 显示了用来迭代集合的 清单 4. 使用 图 4
闽公网安备 35060202000074号