自定义标签库中的tld文件
来源:互联网 发布:菏泽矩阵直销软件 编辑:程序博客网 时间:2024/05/29 19:47
关于taglib中tld定义的说明
在JSP中使用标签是很平常的事情,在制作自定义标签时,通常都需要写tld文件来定义标签的各种属性,对应的java类,前缀等等。标签与tld文件紧紧相连,那么,到底应该怎么放置tld文件?在web.xml中怎么定义tld文件的位置?
以下是具体的分析
Ø Taglib的使用:
首先是在头部申明taglib, uri必须是web.xml定义的,或者是原始tld文件定义的。
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<%@ taglib prefix="ex" uri="/jstl-examples-taglib" %>
然后便可以在jsp页面中通过prefix使用相应的标签
<c:import varReader="reader" url="${filepath}">
<ex:escapeHtml reader="${reader}"/>
</c:import>
Ø Uri与tld文件的映射关系
JSP文件中使用的标签通常都有一个tld定义文件(标签库定义文件,主要定义标签对应的java类,标签的属性等等信息)与之对应的,web容器需要找到相应的tld文件,以tld文件中定义的内容判断标签的使用是否正确。
Web做【使用正确性】判断处理,当遇到类似【<c:import】这样的标签时,会通过prefix定位到uri,再根据uri定位到相应的tld文件,对tld文件进行解析。其中urißàtld文件的映射关系如下:
Key
(Uri)
Value
(String[] taglib_tld_location)
Taglib-URI:
(如/jstl-examples-taglib、http://java.sun.com/jstl/core等)
taglib_tld_location[0]
taglib_tld_location[1]
本文主要介绍的便是uri到tld的映射
Ø Tld文件路径定义方式
如下方式1和方式2只能在2.3版本使用,Servlet2.4开始便不能在web.xml中定义taglib了。
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
l 方式1:
如下所示,在web.xml中定义
<taglib>
<taglib-uri>/jstl-examples-taglib</taglib-uri>
<taglib-location>/WEB-INF/lib/jstl-examples.tld</taglib-location>
</taglib>
如果这样定义的话,映射关系便如下:
/jstl-examples-taglibßà{“/WEB-INF/lib/jstl-examples.tld”,””} // taglib_tld_location[0]就足以表示tld路径,因此taglib_tld_location[1]为空。
l 方式2:
如下所示,在web.xml中定义
<taglib>
<taglib-uri>/jstl-examples-taglib</taglib-uri>
<taglib-location>/WEB-INF/lib/ jstl-examples.jar</taglib-location>
</taglib>
如果这样定义的话,映射关系便如下:
/jstl-examples-taglibßà{“/WEB-INF/lib/ jstl-examples.jar”,” META-INF/taglib.tld”}
// taglib_tld_location[0]表示jar路径,taglib_tld_location[1]固定为META-INF/taglib.tld(也就是说,tld在jar文件中的保存路径必须是META-INF/taglib.tld,名称必须是taglib.tld)。这就是说一个jar里只能有一个tld。如果代码中不固定为taglib.tld的话,也很难处理,因为如果tld的名称可以随便定义的话,出现多个tld在jar文件中时将会导致混乱。
l 方式3:
不需要在web.xml中定义,只需要把tld保存在web应用能够使用的jar文件中的META-INF路径下便可。这种情况的机制是这样的:web容器会遍历当前web应用能够访问的jar文件,从jar文件中查找META-INF/xxx.tld文件,当找到一个tld文件之后,便会解析tld文件,取出<taglib>节点的<uri>值,把uri作为key值生成映射关系。
如下所示的jstl的core标签库的tld文件,便会有如下的映射关系
http://java.sun.com/jstl/coreßà{“tld文件所在的jar文件的路径”,” META-INF/xxx.tld”}//taglib_tld_location[0]表示jar路径,taglib_tld_location[1]为所搜到的tld在jar文件中的相对路径
……
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>c</short-name>
<uri>http://java.sun.com/jstl/core</uri>
<display-name>JSTL core</display-name>
<description>JSTL 1.0 core library</description>
……
<tag>
<name>catch</name>
<tag-class>org.apache.taglibs.standard.tag.common.core.CatchTag</tag-class>
<body-content>JSP</body-content>
<description>
Catches any Throwable that occurs in its body and optionally
exposes it.
</description>
<attribute>
<name>var</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
</tag>
……
Ø Tld文件的解析逻辑
以jstl为例:
Web容器遇到类似【<c:import】标签时,就会通过在头部中定义的<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>找到uri,再根据此uri便可以定位到taglib_tld_location。当taglib_tld_location[0]不是jar文件时,便直接使用java的FileInputStream读取tld文件;当taglib_tld_location[0]是jar文件时,则会
通过如下代码读取tld文件。
URL jarFileUrl = new URL("jar:" + location[0] + "!/");
ZipEntry jarEntry = jarFile.getEntry(location[1]);
Ø 总结:
Tld的定义可以不在web.xml中定义,这时需要保证tld在web应用能够访问的jar中,并且保存在jar的META-INF目录下。此时JSP直接使用tld中定义的<uri>便可;
如果在web.xml中定义tld的路径的话,可以直接指定tld文件路径,此时要保证tld不在jar包中(比如在WEB-INF目录下);也可以指定为jar文件路径,此时要保证tld在jar中且路径为META-INF/taglib.tld。
在web.xml中定义的uri优先级要高于tld文件中定义的优先级。
- 自定义标签库中的tld文件
- 自定义标签库中的tld文件
- 自定义标签库中的tld文件
- 如何引用自定义标签库中的tld文件
- 如何引用自定义标签库中的tld文件
- 自定义标签文件--tld注意事项
- Java 自定义tld标签库
- Struts框架 自定义标签的tld文件
- 描述自定义标签的TLD文件
- TLD文件配置详解(自定义标签)
- 自定义标签的开发之tld文件
- JSP自定义标签TLD文件详解
- 使用tld文件注册自定义标签注意事项
- 标签库描述文件TLD
- 自定义标签库描述符-tld
- TLD自定义标签
- TLD自定义标签
- 自定义tld 标签
- 从3个科技公司里学到的57条经验
- Linux里的函数库(Library)
- 维基解密的新家
- 【CMMI学习】CMMI-DEV V1.2中文版模型过程域索引(转)
- EMF学习笔记6——模型验证
- 自定义标签库中的tld文件
- Oracle 表连接方式(内连接/外连接/自连接) 详解
- Java容器类List、ArrayList、Vector及map、HashTable、HashMap的区别与用法
- 百度笔试题7.3
- control bar 的用法 转
- 哈哈,同志们好
- 百度笔试题7.4
- 百度笔试题7.5
- RAID 磁盘阵列