Java Web应用因tld文件损坏出现的错误

部署一个 Web 应用到 WebSphere Application Server 中,浏览 index.jsp 页面时而正常,时而出现500错误,查看服务器输出日志可以看到以下错误,

E SRVE0026E: [Servlet Error]-[This absolute uri (http://jakarta.apache.org/struts/tags-logic) cannot be resolved in either web.xml or the jar files deployed with this application]: org.apache.jasper.JasperException: This absolute uri (http://jakarta.apache.org/struts/tags-logic) cannot be resolved in either web.xml or the jar files deployed with this application
at org.apache.jasper.compiler.TagLibraryInfoImpl.<init>(TagLibraryInfoImpl.java:224)
at org.apache.jasper.compiler.TagLibraryInfoImpl.<init>(TagLibraryInfoImpl.java:189)
..........

很明显示是因为标签库的问题,index.jsp 中使用了 logic 标签,引入标签是这样写的:


  1. <
    %@taglib 
    uri
    =
    "http://jakarta.apache.org/struts/tags-logic"
     
    prefix
    =
    "logic"
     %
    >
      

对于这个问题,我这边是因为 logic.tld 损坏,偶然用 Eclipse3.2+MyEclipse5.0 打开这个文件,发现不能正常显示要,关闭再次打开,又没问题了,保存它,替换掉服务器上的这个文件,运行正常。难道我在访问 index.jsp 时也是有时候能正常解析 logic.tld 文件,有时候又不行,读入 logic.tld 配置也应该是一次性完成啊。

下面叙述我对这个问题寻求解决的过程。

怎么会找不到标签呢,在 web.xml 中没有关于 taglib 的配置,这也是可行的,在 WEB-INF 下有相应的 struts-logic.tld 文件啊,只要该标签说明文件中的 uri 属性说明是 http://jakarta.apache.org/struts/tags-logic 就行。

为什么有时是好的,有时又有问题呢?要是总是出错还说得过去。

于是在网上大搜了一把,有许多解释使用 jstl 标签库时会出现类似的错误。

有说要放在支持 Servlet 2.4 规范的容器中运行,那不可能,原来我这个 web 应用在 WAS 5.1 下跑得好好的啊,WAS5.1 也只支持 Servlet 2.3 规范。

有说必须在 web.xml 文件中配置标签库说明,比如:


  1. <
    taglib
    >
      
  2.     
    <
    taglib-uri
    >
    /WEB-INF/struts-logic.tld
    </
    taglib-uri
    >
      
  3.     
    <
    taglib-location
    >
    /WEB-INF/struts-logic.tld
    </
    taglib-location
    >
      


  4. </
    taglib
    >
      

那也是用不着的,因为我在 Eclipse3.2+MyEclipse5.0 下建一个 web 应用,都不需要这样配置都可以正常使用 logic 标签。

还有说应把 struts-logic.tld 拷贝到 WEB-INF 目录中,也不一定,这样做只是基于上面那种 web.xml 配置方式才需要的,我自己实验的 web 应用,只需要引入 struts.jar 就行,在 WEB-INF 都不要放置 struts 的 tld 文件。

因为 WEB-INF 下可以不要 tld 文件,web.xml 中也可以不用 taglib 的配置,只要在 jsp 文件中用代码


  1. <
    %@taglib 
    uri
    =
    "http://jakarta.apache.org/struts/tags-logic"
     
    prefix
    =
    "logic"
    %
    >
      

 引入 logic 标签就能使用它了,为此还琢磨了一下,应用是如何加载标签描述的。打开 struts.jar 包发现在 META-INF.tlds 中有 strtus-logic.tld 文件,并且属性 urihttp://jakarta.apache.org/struts/tags-logic,可见 jsp文件就是通过这个 uri 在struts.jar的适当地方定位哪个标签库实现的。只要 jsp 中和 tld 中的 uri 属性一致即可。

而在 web.xml 配置


  1. <
    taglib
    >
      
  2.     
    <
    taglib-uri
    >
    /WEB-INF/struts-logic.tld
    </
    taglib-uri
    >
      
  3.     
    <
    taglib-location
    >
    /WEB-INF/struts-logic.tld
    </
    taglib-location
    >
      


  4. </
    taglib
    >
      

却给自己添更多麻烦了,首先需要从 struts.jar 解出 tld 文件放到 WEB-INF 下,在 jsp 文件中引入 taglib 要写成与在 web.xml 中配置的 uri 一致了,如:


  1. <
    %@
    tagliburi
    =
    "/WEB-INF/struts-logic.tld"
     
    prefix
    =
    "logic"
     %
    >
      

通过这一问题的解决过程,也加深了jsp自定义标签库的两种配置方法:

1. 把 tld 文件放在 jar 包的 META-INF.tlds (WEB-INF/classes/目录的 META-INF.tlds 目录中应该也行),jsp 文件引入标签库时用与 tld 文件中一样的 uri

2. 把 tld 文件放在某个地方,一般是 /WEB-INF/ 目录下,然后在 web.xml 中自定义出一个 taglib-uri 属性,jsp 文件引入标签库时就用这个配置的 uri 属性。

类别: Java/JEE. 标签: , , . 阅读(169). 订阅评论. TrackBack.

Leave a Reply

Be the First to Comment!

avatar
wpDiscuz