在 Web 页中使用 Java 代码。 [Page]
我的上一篇 Oracle 技术网 (OTN) 文章“使用 JSP 2.0 EL API”介绍了简单标记 API 的另一个限制并提供了变通方法。JspContext 类未提供对 JSP 隐式对象(如application、session、request 和 response)的访问。大多数应用服务器(包括 Oracle Application Server Containers for J2EE (OC4J) 10g)允许将 JSP 上下文转换为 PageContext
标记处理类不适用于使用 println() 语句生成大量可重用的 HTML 代码。JSP 2.0 为此工作提供了一个更好的方法。所谓的标记文件使用 JSP 语法并由 JSP 容器自动转换为基于简单标记 API 的标记处理类。我的另一篇 OTN 文章“创建 JSP 2.0 标记文件”介绍了这个 JSP 新特性。
导出变量的标记
许多 JSTL 标记实现某个逻辑并导出 JSP 变量以报告结果。例如,<sql:query> 包含一个 var 属性,该属性必须指定用于保存 SQL 结果集的 JSP 变量的名称。var 属性对其他 JSTL 标记(如 <fmt:formatNumber> 和 <fmt:formatDate>)来说是可选的。如果 var 属性不存在,则这些标记将输出它们的结果。所有包含 var 属性的标记还包含一个 scope 属性,该属性可用于指示以下 JSP 变量的作用域:page、request、session 或 application。
VarTagSupport 类(它是为本文开发的一个示例)扩展 SimpleTagSupport 并为 var 和 scope 属性提供设置方法。VarTagSupport 包含用于导出 JSP 变量、获取主体内容和输出内容的实用方法,而不是实现 doTag() 方法。这些方法由 VarTagSupport 的子类在 doTag() 中使用。本文包含四个用于扩展 VarTagSupport 的标记处理类(EvalTag、MapTag、ListTag 和 ItemTag)。
请注意,JSP 变量在 JSTL 规范中称作范围变量,而在 JSP 规范中称作具名变量或范围属性。这些变量通过 JspContext 类的 setAttribute() 方法创建/导出。您可以在 JSP 页面中使用 ${varName},以及在 Java 代码中使用 JspContext 的 getAttribute() 或 findAttribute() 方法取得它们的值。不要混淆 JSP 变量与标记属性。
[Page]
实现属性设置方法
JSP 容器调用属性设置方法,将标记属性的值传递给定制标记处理类。VarTagSupport 的 setVar() 方法将 var 属性的值存储在受保护的实例变量 (varName) 中。setScope() 方法将它的参数转换为整数常数。如果该参数包含有效值(page、request、session 或 application),则将此整数常数存储在另一受保