信息:TLD被跳过。 URI:<tag name =“”uri =“”>已定义</tag>

时间:2013-04-11 20:36:05

标签: java jsp tomcat web.xml taglib

我有一个正在从Tomcat 5.5.35迁移到Tomcat 7.0.39的Web应用程序。目前,有几个自定义标记库,每个标记库都在自己的tld文件中定义。这是一个例子:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
    <tlib-version>1.0</tlib-version>
    <jsp-version>1.2</jsp-version>
    <short-name>customTag</short-name>
    <uri>http://www.something.com/util/customTag-db-taglib</uri>
    <description>
        Database tag library for Util 
    </description>
    <tag>
        <name>useBean</name>
        <tag-class>com.mx.releasemgr.tags.db.UseBeanTag</tag-class>
        <tei-class>com.mx.releasemgr.tags.db.UseBeanTEI</tei-class>
        <body-content>EMPTY</body-content>
        <attribute>
            <name>id</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <name>oid</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <name>oidParameter</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <name>type</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <name>scope</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
    </tag>
    ...
</taglib>

WEB-INF文件夹中只有这个tld文件的一个副本。它从未放入jar文件中。

web.xml看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<web-app 
  xmlns="http://java.sun.com/xml/ns/javaee" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
...
<jsp-config>
     <taglib>
    <taglib-uri>customTag</taglib-uri>
    <taglib-location>/WEB-INF/customTag.tld</taglib-location>
</taglib>
</jsp-config>
...

此错误显示在catalina.out

Apr 11, 2013 3:50:08 PM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://www.mx.com/releasemgr/releasemgr-db-taglib is already defined

像这样导入taglib:

<%@ taglib uri="customTag" prefix="db" %>

我看过this question,但似乎并不适用。我添加了<jsp-config>,但没有用。我打电话给taglib错了吗? URI参数是否正确?任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:3)

规范要求的URI的优先顺序是:

  1. J2EE平台taglibs - Tomcat不提供这些
  2. web.xml条目
  3. WEB-INF / lib&amp; amp;中的JARS WEB-INF下的顶级域名(同等优先级)
  4. 容器中的其他条目
  5. 您的tld加载了两次,第一次是来自web.xml,第二次是来自WEB-INF中的扫描及其子文件夹。

    解决方案是

    1,将其从web.xml中删除

    2,将你的tld文件放在/ WEB-INF / tags /


    好的,这只是一个短篇小说。如果你想了解更多。

    1,tomcat 5.5具有相同的逻辑,它只是不做烦人的日志。

    2,当tomcat启动时会发生此日志。在tomcat启动时加载tld 用于在tld文件中查找侦听器。

    3,这是tld真正用于jsp的另一个故事。

    当编译第一个jsp时,tomcat将为uri和位置对构建一个缓存。

    uri加载来自同一个订单

    1)web.xml条目,标签uri来自web.xml

    2)扫描WEB-INF下的tld文件,标签uri来自tld文件

    3)扫描罐子,标签uri来自tld文件。

    因此,在您的配置中,customTag.tld注册了2 uri,customTag和http://www.mx.com/releasemgr/releasemgr-db-taglib

    4)当tomcat启动时。它加载tld以在tld文件中找到侦听器。

    从web.xml加载时,它会将customTag(来自web.xml)和http://www.mx.com/releasemgr/releasemgr-db-taglib(from tld文件放入一个集合中。

    从WEB-INF加载时,uri来自tld文件,即ttp://www.mx.com/releasemgr/releasemgr-db-taglib。 Tomcat需要避免重复的tld监听器添加,因此它会检查集合中是否存在uri。如果uri已经存在,它会记录消息并跳过添加tld listener。

    将它们放在一起,

    1,如果你的tld文件中没有监听器,则在Tomcat启动时不需要扫描tld。 您可以通过在上下文中将processTlds设置为false来禁用。

    当编译第一个jsp时,tomcat将为uri和位置对构建一个缓存。

    2,你可以忽略警告。它只是为了避免在tld文件中重复加载监听器。