通过阅读本系列的第一篇文章,您对 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
Value Square