我有一个正在从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参数是否正确?任何帮助表示赞赏。
答案 0 :(得分:3)
规范要求的URI的优先顺序是:
您的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文件中重复加载监听器。