在JSP中使用标签是很平常的事情,在制作自定义标签时,通常都需要写tld文件来定义标签的各种属性,对应的java类,前缀等等。标签与tld文件紧紧相连,那么,到底应该怎么放置tld文件?在web.xml中怎么定义tld文件的位置?
以下是具体的分析
Ø
首先是在头部申明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}">
</c:import>
Ø
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的映射
Ø
如下方式1和方式2只能在2.3版本使用,Servlet2.4开始便不能在web.xml中定义taglib了。
<!DOCTYPE web-app
l
如下所示,在web.xml中定义
</taglib>
如果这样定义的话,映射关系便如下:
/jstl-examples-taglibßà{“/WEB-INF/lib/jstl-examples.tld”,””} //
l
如下所示,在web.xml中定义
</taglib>
如果这样定义的话,映射关系便如下:
/jstl-examples-taglibßà{“/WEB-INF/lib/ jstl-examples.jar”,”
l
不需要在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文件的路径”,”
……
<taglib>
……
……
Ø
以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文件中定义的优先级。
======================================================
/WEB-INF/web.xml
Web应用程序配置文件,描述了 servlet 和其他的应用组件配置及命名规则。
/WEB-INF/classes/
包含了站点所有用的 class 文件,包括 servlet class 和非servlet class,他们不能包含在 .jar文件中。
/WEB-INF/lib/
存放web应用需要的各种JAR文件,放置仅在这个应用中要求使用的jar文件,如数据库驱动jar文件。
/WEB-INF/src/
源码目录,按照包名结构放置各个java文件。
/WEB-INF/database.properties
数据库配置文件
/WEB-INF/tags/
存放了自定义标签文件,该目录并不一定为 tags,可以根据自己的喜好和习惯为自己的标签文件库命名,当使用自定义的标签文件库名称时,在使用标签文件时就必须声明正确的标签文件库路径。例如:当自定义标签文件库名称为 simpleTags 时,在使用 simpleTags 目录下的标签文件时,就必须在 jsp 文件头声明为:<%@ taglibprefix="tags" tagdir="/WEB-INF /simpleTags" % >。
/WEB-INF/jsp/
jsp 1.2 以下版本的文件存放位置。改目录没有特定的声明,同样,可以根据自己的喜好与习惯来命名。此目录主要存放的是 jsp 1.2 以下版本的文件,为区分 jsp 2.0 文件,通常使用 jsp 命名,当然你也可以命名为 jspOldEdition 。
/WEB-INF/jsp2/
与 jsp 文件目录相比,该目录下主要存放 Jsp 2.0 以下版本的文件,当然,它也是可以任意命名的,同样为区别 Jsp 1.2以下版本的文件目录,通常才命名为 jsp2。
META-INF
相当于一个信息包,目录中的文件和目录获得Java 2平台的认可与解释,用来配置应用程序、扩展程序、类加载器和服务
manifest.mf文件,在用jar打包时自动生成。