文档章节

如何引用自定义标签库中的tld文件

陈狐
 陈狐
发布于 2017/08/11 09:59
字数 1135
阅读 5
收藏 0

在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文件的映射关系如下:

本文主要介绍的便是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文件中定义的优先级。

 

本文转载自:http://blog.csdn.net/xiangbq/article/details/50072981

陈狐
粉丝 1
博文 53
码字总数 12650
作品 0
武汉
私信 提问
自定义标签

一、概述 JSP 2.0 中提供了两种新的开发自定义标记的方法: 1、简单标签机制SimpleTag JSP 2.0 中加入了新的创建自定义标记的API:javax.servlet.jsp.tagext.SimpleTag,该API 定义了用来实现...

你我他有个梦
2015/12/18
1
0
(六)JSP之自定义标签

JSP自定义标签实现方式: 1.使用TLD文件 2.使用tag文件 一、使用TLD文件 1.创建一个标签处理类 (1)继承TagSupport类 实例1 HelloWorldTag.java 实例2 IterateTag .java (2)继承SimpleTagSupp...

iborder
2016/09/05
1
0
Java程序员从笨鸟到菜鸟之(二十)jsp自定义标签

一、基本概念 1、标签(Tag) 标签是一种XML元素,通过标签可以使JSP网页变得简洁并且易于维护,还可以方便地实现同一个JSP文件支持多种语言版本。由于标签是XML元素,所以它的名称和属性都是大...

长平狐
2012/11/12
96
0
javaweb学习总结———jsp自定义标签与el表达式结合使用

第一种方式(标签签到el表达式)实现从内存取数据,通过key获取value: 一.编写一个实现Tag接口的Java类或者继承TagSupport 等...tag好多实现类,都可以继承实现(标签处理器类),此种方式可以...

hello菜bird
2016/09/01
197
0
学习JSP标签库

清单A:执行XML/XSL 转换的示例标签及其所在的HTML页面 <%@ taglib uri="http://www.jspinsider.com/jspkit/JAXP" prefix="JAXP"%> c:/xml/example.xml c:/xml/example.xsl 以上的示例使用了......

e良师益友
2016/01/09
50
0

没有更多内容

加载失败,请刷新页面

加载更多

4.01、Linux异常

1、无法连接虚拟设备ide1:0,因为主机上没有响应的设备 解决方法:找到“虚拟机” —— 打开“虚拟机设置” —— 单击“CD/DVD(IDE)”,右侧选中“使用ISO映像文件”,然后选中自己的镜像,重启...

静以修身2025
15分钟前
0
0
不允许有匹配 "[xX][mM][lL]" 的处理指令目标

Bug解决方案:org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 8; 不允许有匹配 "[xX][mM][lL]" 的处理指令目标 Caused by: org.xml.sax.SAXParseException; lineNumber: 1; c......

我叫小糖主
18分钟前
0
0
Mysql InnoDB 行锁和表锁介绍

mysql 的 InnoDB引擎支持行锁,与Oracle不同,mysql的行锁是通过索引加载的,即是行锁是加在索引响应的行上的,要是对应的SQL语句没有走索引,则会全表扫描,行锁则无法实现,取而代之的是表...

嘴角轻扬30
18分钟前
1
0
springboot+jpa 错误信息org.springframework.beans.factory.BeanCreationException

报错信息 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/a......

冥焱
36分钟前
1
0
威胁快报|新兴挖矿团伙借助shodan作恶,非web应用安全再鸣警钟

近日,阿里云安全发现了一个使用未授权访问漏洞部署恶意Docker镜像进行挖矿的僵尸网络团伙。我们给这一团伙取名为Xulu,因为该团伙使用这个字符串作为挖矿时的用户名。 Xulu并不是第一个攻击...

迷你芊宝宝
43分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部