关于这段代码的说明
关于 DateTag 处理程序类有几件事值得一说。首先看一下方法声明。如果我们直接实
现 Tag
接口,那么就需要完成几个方法声明。因为 TagSupport 类是简单的、具体类,它
完全实现了在 Tag 接口中声明的方法,我们可以只实现那些在自定义标记中要使用的方
法。在这个简单的例子中,我们只实现了 doStartTag() 方法,它是在遇到开始标记时调
用的。
您还可能注意到 doStartTag()
方法返回 SKIP_BODY 。当然其原因是我们的简单日
期标记没有正文。您要注意的最后一件重要的事情是使用了 pageContext 对象访问输出
缓存以直接向输出流发送内容。您可能还记得在本系列以前的文章说过, pageContext
对象是一个隐式对象,它提供对与当前页面有关的属性的访问。
编写了源代码文件后,我们像编译所有其他 Java 类一样编译这个类(确保在类路径
中加入 Servlet/JSP JAR 文件)
,然后将编译的类文件放到 Web 应用程序的类目录
(WEB-INF/classes)中。如果我们开发的是几个标记或者定义有标记变量的标记,那么我
们就会有多个标记处理程序类。在这种情况下我们可能选择将处理程序类打包在一个 JAR
文件中而不是使它们成为类目录中的分散的文件。
第 2 步.
创建 TLD
下一步是定义包含自定义标记与处理它的 Java 类(或多个类)之间的映射的库。这个
库是在一个名为标记库描述符(TLD)
的 XML
文档中定义的。我们将从 DateTag 例子
DateTagLib.tld
中调用这个 TLD
“
。注意 .tld”是这种文件的标准扩展名。
清单 2. DateTagLib.tld 文件
1 <?xml version="1.0" encoding="ISO-8859-1" ?>
2 <taglib>
3 <tlibversion>1.0</tlibversion>
4 <info>A simple tag library</info>
5 <tag>
6 <name>displayDate</name>
7 <tagclass>myTags.DateTag</tagclass>
8 <bodycontent>empty</bodycontent>
9 <info>Display Date</info>
10 </tag>
11 </taglib>
12
DateTagLib.tld 是一个出色的、最小的标记库描述符文件。所有关键信息都包含在
Tag 标记中,在这里映射了标记名和处理程序类,我们声明了标记对于正文内容的敏感
性。对于更复杂的情况,我们可以使用其他的 XML 标记以提供有关库和标记的更多信息。
在一个库中定义多个标记也很常见。
第 3 步.
使 TLD 和处理程序类可访问
第 3
步是使这个类或者这些类和 TLD
可以被 Web 应用程序访问。有两种方法:可
以将类和 TLD
打包到一个 JAR
文件中,再将这个 JAR
文件储存在 Web
应用程序的 lib
目录中,也可以将类文件分散地放到 classes
子目录中并将 TLD
文件放到 Web 应用程
序的 WEB-INF 目录下面的某一位置。
在这个例子中,我们将使用第二种方法,将 TLD
文件和类分散地放到 Web 应用程