前面我们学过一些<jsp:XXX>的XML格式的标签,这些标签指示jsp引擎去执行一些动作。比起在代码区编写大段的代码。使用标签简洁,并能提高重用性。
为了充分利用这些优点,jsp规范允许我们开发自己的标签。
这里我们来详细学学相关的知识。
我们先来了解几个术语
标签处理器(Tag handler)
一个标签处理器就是一个实现了标签接口的java类(当然属于标签类的接口不止一个,我们放到开发阶段去讲)。
其作用就是,当jsp引擎遇见一个定制标签时,jsp引擎会调用特定标签处理器的特定方法来做出相应的动作。
标签库(Tag library)
标签库定义了所有可以使用的动作,也可以理解为所有可以使用的标签。
标签库描述符(Tag library descriptor)
我将它看成是标签库的配置文件。这里面要记录标签处理器的class文件名,标签库的存放位置,如何被使用等等。英文中也被缩写为TLD。
理解标签库
通常来讲,你并不需要开发自己的标签库。因为,在互联网上已经存在有大量的别人开发好的标签库。所以你直接拿来使用就行了。
例如:Jakarta Apache项目(http://jakarta.apache.org/taglibs)就包含有大量的文本,日期操作的标签库。SUN公司也有类似的标签库被称为JSTL(Standard tag libraries for java)。
为了使用这些标签库,我们只需要知道两件事:
1.如何通知jsp引擎TLD文件的位置;
2.如何使用标签库提供的标签。
而如果这些标签库确实不合你用,或者你就是要开发自己的标签库。那么你需要知道另外两件事情:
1.如何实现标签处理器;
2.如何为你的库编写TLD文件。
当然这些内容会放到标签开发中讲解。
通知jsp引擎关于定制标签库的信息
我们使用两种方式,jsp标准方式和XML方式
.<%@ taglib prefix="test" uri="sampleLib.tld" %>
.<jsp:root
xmlns=jsp="http://java.sun.com/JSP/Page"
xmlns=test="sampleLib.tld"
version="1.2"
...
</jsp:root>
上例中,我们显然是将tld文件和jsp文件放到了一起。这种方法很简单,但是有两个问题:安全性和灵活性。
安全性
客户端可以很方便的按照jsp文件的路径及名称推测出tld文件的位置及名称。因此,可以很容易的访问到它。
解决的方法是。在web服务器上设置禁止用户访问tld文件;更好的方法是,将tld放到/WEB-INF目录下。
灵活性
假设我们开发了新版本的库,为了使其生效,我们需要手工去改变相关jsp文件中的路径声明。另外,第三方的标记库通常以jar(压缩包)形式发布,我们如何去指定这些tld文件呢?
采取的方法是,由jsp容器维护一个tld到uri的映射。当我们更换了新版本的库后,唯一需要做的只是把映射改变一下而以。
tld文件位置
一个tld文件通常放在两个地方。
可以放在web应用的任何目录下;
通常,在开发标签库时我们是这样做的。一旦开发结束,我们将tld文件以及标签处理器的class文件一起打包成jar。然后将jar放到/WEB-INF/lib目录下,和其它jar类放在一起,如servlet和第三方工具。
jar包的结构是被jsp规范强制规定的。其中tld文件只能放在META-INF目录下或其子目录下。另外,tld文件的名字只能是taglib.tld。例如:
myPackage/MyTagHandler1.class
myPackage/MyTagHandler2.class
META-INF/taglib.tld
对于这两种路径,被成为tld资源路径(resource path)。
因此,前面讲的映射,实际是对tld资源路径和uri的映射。称为标记库映射(taglib map)。