教程:了解 JSP 2.0 的新特性
讨论此教程。 可打印版本 (PDF)。
这是目录页。 无上一页。 到上一级。 转至下一页。

标记文件


在本章节中,我们将了解 JSP 2.0 的另一个有趣的新特性,标记文件。我们将特别关注以下主题:

标记文件定义
标记文件语法
标记文件中的标准操作
使用标记文件的优势

标记文件定义

随着 JSP 2.0 的推出,Java 知识不再是创建自定义标记操作的先决条件。JSP 2.0 的简单标记扩展允许页面制作人员仅仅使用 JSP 语法来编写标记扩展。标记文件为基础页面制作人员提供重用的功能,这些人员将精力集中于表达,而不需要了解 Java。标记文件本质上是便于 JSP 代码段的提取、通过自定义操作使该代码段能够重用的源文件。即使对于了解 Java 的页面制作人员或标记库开发人员而言,当开发那些主要输出模板文本的标记时,编写标记文件也方便得多。当与 JSP 片段和简单标记处理程序一起使用时,这些概念能够充分简化 JSP 的开发,甚至为开发人员简化开发。

标记文件所需的文件扩展名是 .tag 或 .tagx。在 JSP 文件的情况下,实际的标记可能由一个顶端文件组成,该文件包括其他包含有完整标记或标记文件段的文件。与 JSP 文件段的建议扩展名 .jspf 类似,标记文件段的建议扩展名为 .tagf。标记文件可以只包含模板文本,也可以包含 JSP 和标记代码。

标记文件可以通过 标准操作转发到页面,而转发过程通过请求调度程序来处理(类似于 JSP)。当 RequestDispatcher.forward() 返回时,由容器来判断是否停止处理标记文件并产生一个 javax.servlet.jsp.SkipPage-Exception。

标记文件语法

标记文件的语法与 JSP 语法类似,不同之处在于:

  • 尽管可以使用某些标记文件专用的指示,但有些指示不可使用或者使用受限

  • 标准操作只能用于标记文件中。我们将在标题为标记文件中的标准操作的章节中单独查看这些内容

以下是标记文件可用的指示列表:

指示
说明/限制

Page

该指示对于标记文件不可用。由于不认为标记文件是页面,需要使用标记文件替代。注意,如果在标记文件中使用该指示,将会导致转换错误。

Taglib

可用于标记文件,该指示与 JSP 页类似

include

可用于标记文件,该指示与 JSP 页类似。所包括的文件必须符合对标记文件有效的语法。否则会出现转换错误。

Tag 可用于并且只适用于标记文件。在 JSP 中使用该指示会导致转换错误。
attribute 可用于并且只适用于标记文件。在 JSP 中使用该指示会导致转换错误。
variable 可用于并且只适用于标记文件。在 JSP 中使用该指示会导致转换错误。

从标记文件间接地使用传统标记处理程序可将标记文件的使用绑定到 Servlet 环境,因为 tag 接口依赖于 PageContext(以 Servlet 为中心)。因此,在从标记文件调用一个实施 tag 接口的传统标记处理程序时需要当心。注意,SimpleTag 扩展可以在除 Servlet 之外的环境中使用。

标记文件中的标准操作

有两种标准操作只能用于标记文件中 — 它们是 。在本章节中,我们将深入了解这两种标准操作的一些细节:

先前曾提到过, 标准操作只能用于标记文件中,如果在 JSP 中使用,必定会导致转换错误。 标准操作非常类似于 ,唯一的不同之处在于 在标记的主体中进行操作,而不是在作为属性传递的特定片段中进行操作。它调用标记的主体,将结果的输出发送到 JspWriter,或者发送到一个限定范围的属性,该属性可以被检查和处理。标记的主体作为 JspFragment 对象传递到简单标记处理程序。如果 包含非空的主体,则会发生转换错误。

以下是可用于 标准操作的指示列表:

属性 说明

var

该属性是在标记调用期间用于识别片段的名称。该指示是必需的

varReader

这是限定范围的属性的名称,它将片段调用的结果存入为 java.lang.String 对象。如果既指定 var 又指定 varReader,则必定发生转换错误。如果二者均未指定,则片段的结果直接转到 JspWriter,如前文所述。该指示是可选项。

scope

这是限定范围的属性的名称,它将片段调用的结果存入为 java.io.Reader 对象。如果既指定 var 又指定 varReader,则必定发生转换错误。如果二者均未指定,则
片段调用的结果直接转到 JspWriter,如前文所述。

由于 只在标记的主体上进行操作,此标准操作没有名称属性。var、varReader 和 scope 属性都由 的相同语义提供支持。对于 ,为片段提供的访问变量的方法与 的方法相同。如果没有向标记传递主体,则 的表现行为就象传递了不产生输出的主体一样。

重申一遍, 标准操作只能用于标记文件,如果在 JSP 中使用,将会导致转换错误。

以下是可用于 标准操作的指示列表:


属性 说明

fragment

该属性是在标记调用期间用于识别片段的名称。该指示是必需的。

var

这是限定范围的属性的名称,它将片段调用的结果存入为 java.lang.String 对象。如果既指定 var 又指定 varReader,则必定发生转换错误。如果二者均未指定,则
片段的结果直接转到 JspWriter,如本章节开头部分所述。该指示是可选项。

varReader

这是限定范围的属性的名称,将片段调用的结果存入为 java.io.Reader 对象。如果既指定 var 又指定 varReader,则必定发生转换错误。如果二者均未指定,则片段调用的结果直接转到 JspWriter,如本章节开头部分所述。该指示是可选项。
scope 这是存储结果变量的范围。如果该值不是
页面、请求、会话或应用程序之一,则必定导致转换错误。如果该属性没有指定
var 或 varReader 属性,也会导致转换错误。注意,应该谨慎使用会话值,因为不是所有的
调用页面都可以参与到会话中。如果范围是
会话,并且调用页面不参与到会话中,则容器在运行时必定会产生一个 IllegalStateException。默认范围是页面。该指示是可选项。

标准操作用于调用片段(由名称属性确定),并将结果的输出发送到 JspWriter。使用 JspFragment.invoke() 方法调用片段。Null 作为 Writer 参数传递,强制写(对于被发送的结果而言就是写操作)到与 JspFragment 对象相关的 JspContent 的 JspWriter。使用调用的一个示例如下所示:

通过使用 var 或 varReader 属性,也可以将输出发送到一个页面范围的变量,该变量以后可在页面上用于其他操作。当使用这两种属性中的任一种时,将传递一个自定义的 java.io.Writer,而不是 null。您可以进一步调整 Writer,指定您是需要 String 还是 Reader。

var 属性是一个 java.lang.String,而 varReader 属性是一个 java.io.Reader 对象。String 对象包含由片段发送到 Writer 的内容,而 Reader 对象可以产生由片段发送到 Writer 的内容。Reader 可以重置 — 如果调用 reset() 方法,可以重新读取所调用片段的结果,而不需要重新执行该片段。

可选的 scope 属性可用于设置结果范围变量。范围可被设为标准的 JSP 范围,包括:页面、请求、会话或应用程序。以下是如何使用 var、varReader 和 scope 属性的两个示例:



使用标记文件的优势

在 JSP 开发中使用标记文件有以下优势:

  • 页面制作人员的重用机制 — 通过允许更好地自定义所包含的内容以及标记嵌套,标记文件为页面制作人员提供了一种灵活而高效的重用机制。

  • 与标记处理程序兼容 — 标记文件非常适用于那些主要输出 HTML 内容的标记处理程序,正如 JSP 非常适用于替代那些主要输出 HTML 内容的 Servlet 一样

  • 没有 Scriptlet 的 JSP 页 — 通过帮助将 web 应用程序中基于脚本的 JSP 代码改变为不含有 scriptlet 的更为整洁的 JSTL 风格的代码,并利用 EL 表达式代替脚本编制表达式,标记文件采用了一种隐藏难用的 scriptlet 的好方法。页面制作人员可以轻松地将 scriptlet 提取到标记文件中,然后调用标记。此后,基于 scriptlet 的标记文件可以被转换为 JSTL 风格的代码,或者封装到 Java 标记处理程序中。

  • 快速开发 — 在某些容器中,如 Tomcat 5.0(值得注意的是,5.x 版本实施了 Servlet 2.4 和 JSP 2.0 规范),支持标记文件的动态重新编译。利用此特性,您只需在 /WEB-INF/tags/ 或子目录中部署标记文件,并调整它直到可以运行为止,而不必在开发期间为每种更改以及为每次更改而重新编译和重新部署。

  • 灵活打包 — 标记文件提供灵活打包的优点。目录 /WEB-INF/tags/ 现在是适应容器所识别的标准目录。JSP 容器将会处理该目录或标记子目录中提供的任何带有 .tag 扩展名的文件。容器将创建一个隐式的 TLD 文件以及一个简单标记处理程序。

  • 打包的选择 — 可以用以下三种方法之一为标记文件打包:

    在 /WEB-INF/tags/ 中,没有 TLD。然后使用 <%@ taglib prefix="..." tagdir="/technology/WEB-INF/tags" %> 将自定义操作导入到 JSP 中

    在 /WEB-INF/tags/ 中,带有辅助的 TLD。这样允许对标记文件进行更好的自定义,使得将标记作为标记文件进行实施的过程对于调用者透明。使用 <%@ taglib prefix="..." uri="..." %> 将 TLD 导入

    在 /META-INF/tags/ 中,在带有 TLD 的 JAR 文件中。对于那些属于 JAR 文件(可以简单地“插入”到您的 web 应用程序中)中标记库的一部分的标记文件来说,这是理想的选择。注意,绑定在 JAR 中的标记文件需要 TLD,而 web 容器忽略那些在 TLD 中没有定义但却出现在 JAR 中的标记文件。


讨论此教程。 可打印版本 (PDF)。
这是目录页。 无上一页。 到上一级。 转至下一页。
寄送此页面
Printer View 打印机视图