2013-04-11 33 views
1

我有一個正在從Tomcat 5.5.35遷移到Tomcat 7.0.39的Web應用程序。目前,有幾個自定義標籤庫,每個都在其自己的tld文件中定義。這裏有一個例子:信息:TLD跳過。 URI:<tag name URI>已定義

<?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 uri="customTag" prefix="db" %>

我有看着this question但它似乎並不適用。我已經添加了<jsp-config>,它沒有幫助。我是否稱taglib錯誤? URI參數是否正確?任何幫助表示讚賞。通過規範所要求的URI

+0

您可以嘗試從web.xml中刪除整個' ..'節並查看它是否仍然可以找到taglib。如果是這樣,它被定義在你不知道的地方。 – 2013-04-11 20:45:30

+0

我這樣做是通過刪除已經在jar文件和WEB-INF中定義的tld文件。這消除了錯誤,但現在我的JSP頁面變成純文本了嗎? – Bizmarck 2013-04-12 13:58:12

+0

您需要將tld文件放在jar中的一個或war中的WEB-INF中,或者在最近版本的JSP中的web.xml中引用。只是一個地方,但。 – 2013-04-12 16:38:49

回答

3

優先順序是:

  1. J2EE平臺的標籤庫 - Tomcat沒有在提供這些
  2. web.xml入口
  3. JARS WEB-INF/lib目錄& TLD下的WEB-INF(同等優先級)
  4. 來自集裝箱的其他條目

您的tld加載了兩次,第一次來自web.xml,第二次來自掃描WEB-INF,它是子文件夾。

的解決方案是

1,從web.xml中刪除它

2,把你的TLD文件在/ WEB-INF /標籤/


OK這只是一個簡短的故事。如果你想知道更多。

1,tomcat 5.5具有相同的邏輯,它只是不會做煩人的日誌。

2,這個日誌發生在tomcat啓動時。在tomcat正在啓動時加載tld是只有用於在tld文件中查找監聽器。

3,這是tld在jsp中真正使用的另一個故事。

當第一個jsp被編譯時,tomcat將爲uri和位置對構建一個緩存。

的URI載量是相同的順序

1)的web.xml條目,該標籤URI是從下的web.xml WEB-INF得到

2)掃描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文件,它是tmp://www.mx.com/releasemgr/releasemgr-db-taglib。 Tomcat需要避免添加重複的tld偵聽器,因此它會檢查uri是否存在於集合中。如果uri已經存在,它會記錄消息並跳過添加tld監聽器。

把它們放在一起,

1,如果在你的TLD文件沒有聽衆,不需要掃描TLD當Tomcat啓動。 您可以通過在上下文中將processTlds設置爲false來禁用它。

當第一個jsp被編譯時,tomcat將爲uri和位置對構建一個緩存。

2,您可以忽略警告。這只是爲了避免在tld文件中重複加載監聽器。