在《简单实例》中我们演示了创建自定义标签的完整的过程,本文将对这个过程进行一些解释说明,以便读者能够了解创建自己定义标签的基本过程。
自定义标签其实与JavaBeans极为相似,如果已经熟练掌握了JavaBeans的用法那么学习自己定义标签将是极为简单的事情。当然,从实现上说,自定义标签与JavaBeans还是有一些区别的。
首先,作为自定义标签它必须拥有一个标签处理程序类,这个类就相当于一个Bean,但是,这个类必须实现接口Tag或者BodyTag。Tag接口定义了自定义标签中所有需要实现的方法,BodyTag接口是一个扩展于Tag的接口,它添加了用于访问自定义标签中标签体的方法。不过在实际应用中我们一般不直接实现这两个类,而是通过继续类TagSupport或BodyTagSupport达到目的。类TagSupport实现了接口Tag,而类BodyTagSupport则扩展于类TagSupport并实现了接口BodyTag。
对于标签处理程序CopyRightTag,由于实现的功能极其简单,所以使它扩展于类TagSupport就可以了。
与使用JavaBeans一样,为了适应各种JSP容器,标签处理程序最好置于一个包中,在《简单实例》中的标签处理程序CopyRightTag被置于包com.yanzhijun之中,与此同时,必须将类CopyRightTag声明为public的,以便在包外可以对它进行访问。
doEndTag是Tag接口所定义方法,在JSP容器遇到结束标记时它就会调用这个方法。CopyRightTag在这个方法中输出了相关的版权信息。与doEndTag方法相对的应还有一个doStartTag方法,JSP容器会在碰到开始标记进调用它,在类CopyRightTag中没有对它进行重写,此后演示更复杂的例子时您将看到对它的应用。
自定义标签必须通过TLD文件建立标签与标签处理程序之间的联系,文件testlib.tld的前部是XML文档的版本说明及文档定义声明,最重要的是taglib标签下的tag标签,它对自定义标签进行了说明。以下示例中用红色文字说明了它们的功能:
<name>copyright</name> 标签的名字
<tagclass>com.yanzhijun.CopyRightTag</tagclass> 标签处理程序
<bodycontent>empty</bodycontent> 标签体的说明,此外表明为空
<attribute/> 标签属性的说明,此处表明没有属性
最后,是关于如何使用自定义标签的说明,为了在JSP文件中使用自定义标签,需要在文件的开始部分声明自定义标签tld文件的位置。《简单实例》中指出的位置是WEB-INF目录下的tlds目录下的testlib.tld文件,prefix属性指名在JSP文件中使用该标签文件中的标签时应使用的前缀。
<%@ taglib uri="WEB-INF/tlds/testlib.tld" prefix="yzj" %>
上述工作完成后,在JSP页面中出现的“<yzj:copyright/>”标签就实现了对该自定义标签的调用,yzj是在声明tld文件位置时指出的前缀,而copyright是我们在tld文件中定义的自定义标签名。