- 创建实现了
Tag
接口(准确地说是 javax.servlet.jsp.tagext.Tag)的标签处理程序类。 - 创建一个 TLD 文件。
- 在标签处理程序 Java 类中创建属性。
- 在 TLD 文件中定义与标签处理程序 Java 类中定义的属性对应的属性。
- 在 TLD 文件中声明 scriptlet 变量。
- 实现
doStartTag()
方法。在标签处理程序类中,根据属性将值设置到 scriptlet 变量中。
这里将创建一个简单标签处理程序,这个标签将实例化一个 map。使用这个标签的开发人员可以指定要实例化的 map 的类型 ―― HashMap
、TreeMap
、FastHashMap
或者 FastTreeMap
。FastHashMap
和 FastTreeMap
来自 Jakarta Commons Collection library (有关链接请参阅 参考资料)。开发人员还可以指定标签所在的范围 ―― 页、请求、会话还是应用程序范围。
为了编写标签处理程序,必须实现 Tag
接口。如前所述,这个接口用于不操纵其标签正文的简单标签处理程序。
现在,不必直接实现 Tag
接口,相反,用 map 定义的(map-defining)标签将继承 TagSupport 类。这个类以有意义的默认方法实现 Tag
接口,因而使开发自定义标签更容易 (有关 TagSupport 的 API 文档的链接请参阅 参考资料)。
在默认情况下,TagSupport 实现了 doStartTag()
以使它返回 SKIP_BODY
常量,表示将不对标签正文进行判断。 此外,在默认情况下,doEndTag()
方法返回 EVAL_PAGE
,它表示 JSP 运行时引擎应当对页面的其余部分进行判断。 最后,TagSupport 实现了 release()
,它设置 pageContext
及其父元素为 null
。
定义了标签处理程序后,现在需要增加从处理程序到 TLD 文件中的标签的映射。
TLD 文件对自定义标签处理程序的作用就像 Web 部署描述符对 servlet 的作用。 TLD 文件列出了从标签名到标签处理程序的映射。 这个文件中的大多数数据都是在 JSP 页转换时使用的。 TLD 文件通常保存在 Web 应用程序的 WEB-INF
目录,并在 web.xml 文件中声明。它们一般用 .tld
扩展名结束。
TLD 文件有一个 导言(preamble),在这里标识 JSP 技术的版本和使用的标签库。这个导言通常看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>map</short-name>
让我们更详细地分析一下这些标签:
- TLD 文件的根元素是
taglib
。taglib
描述了一个 标签库 ―― 即一组标签/标签处理程序对。 - 因为我们使用的是 JSP 版本 1.2,所以在这个例子中需要
tlib-version
和short-name
元素。 tlib-version
元素对应于标签库版本。jsp-version
对应于标签库所依赖的 JSP 技术的版本。short-name
元素定义了 IDE 和其他开发工具可以使用的标签库的简单名。taglib
元素包含许多tag
元素,标签库中每一个标签有一个tag
元素。
待续...