在我们的应用程序上,我们收到一个错误,内容是:
PWC6117: File "/struts-tags" not found文件中给出错误的代码是:
<%@ taglib prefix="s" uri="/struts-tags" %>该文件位于struts2-core.jar中,该文件位于应用服务器(Sun9.1)的类路径中。
当jar实际位于应用程序的WEB-INF/lib中时,与位于appserver的类路径中相比,代码将工作得很好,并且不会出现错误。但我们不能改变这一点。它必须在appservers类路径上。
但是,我们应该如何更改代码才能消除这个错误呢?
我可以在我的web.xml中创建映射,以便更改标记uri。但是taglib-location应该改成什么呢?所以它引用了应用服务器类路径?
<taglib>
<taglib-uri>/WEB-INF/struts-tags.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-tags.tld</taglib-location>
</taglib>发布于 2009-10-28 04:30:51
可能是应用程序服务器和web应用程序本身在运行两个不同的类加载器。因此,确保jar文件不仅在应用程序服务器的类路径中可用,而且在应用程序本身的类路径中可用。如果有一个“共享的”lib目录(这就是它在WebSphere中的位置……不确定Sun)把它放在那里
发布于 2013-06-25 12:19:03
JSP标准不要求应用服务器使用类路径来定位/加载标记库tld文件。这只是应用程序服务器可用来存储常用TLD的一个选项。但是,容器将使用类路径来定位与标记库关联的类文件。但是作为开始步骤,它必须首先定位并加载tld文件;为此,假设类路径不存在。
根据JSP 2.2标准,JSP容器分两步将taglib指令中使用的URI映射到标记库描述符:
此映射通过标记库映射进行,构建自(按优先级顺序):
- A) Java EE platform tag library mappings (JSP Tag Library & JSF libraries)
- B) Taglib Map in web.xml
- C) Implicit Map Entries from TLDs in WEB-INF/lib/_.jar, WEB-INF/_.tld & WEB-INF/\*_/_.tld
- D) Implicit Map Entries from the Container
- E) A fallback, targetted to casual development use, where URI is interpreted as a direct path to the TLD.这里的B)或D)可能对您有用。但D)是容器可用的可选优先级扩展机制,其中它插入容器实现/提供的标签库的映射。正在阅读SUN 9.1文档,似乎没有提供D)。因此,如果Sun9.1在类路径上的JAR中没有检测到TLD,那么您应该使用B),就像您在Q中已经开始做的那样。
- a TLD file directly,
- or to a JAR file that has a TLD file at location META-INF/taglib.tld. 如果TLD资源路径不是这两种情况之一,则会发生致命的转换错误。
这些目前都不适用于您。因此,根据标准,您要么需要将JAR内容插入到生成的TLD文件中,要么应该在类路径上将 META-INF/taglib.tld 插入到jar文件中,然后将<>e241><>e145>指向JAR文件<>e246>。
发布于 2013-06-25 21:08:01
我假设您已经熟悉了将TLD放入WEB-INF中时的工作方式,以及容器如何构建映射以匹配JSP指令的uri属性。因此,我将在这里更多地关注您的classpath问题。
根据JSP2.0规范
容器仅在以下四个位置查找TLD文件
采用/META-INF/MyTags.tld
的
为了不破坏JSP2.0之前的web应用程序,最新的容器仍然支持在web.xml中找到的任何<taglib>映射。但是,它对您没有任何帮助,因为<taglib-location>仍然受上述位置的约束。我还没有遇到任何流行的容器,它允许从应用程序的/WEB-INF外部加载.tld。
回答
但是,该约束仅适用于标记库描述符。实际的标记实现类只需要在classpath中。通常,标记类(以及tld)被打包到jar (如struts2-core.jar)中,然后放入WEB-INF/lib中。
但是,它们很可能是分开的:在WEB-INF/classes中;或者在WEB-INF/lib中的其他jar中,或者应用服务器的共享库本身。所以,你需要做的就是:
struts2-core.jar/META-INF/struts-tags.tld struts-tags.tld inside /WEB-INF (/tlds或/struts等)<taglib>映射(如果在JSP2.0兼容容器上运行)有些人更喜欢保留映射,只是为了记录正在加载的所有tld文件的位置。或者,您可以将/META-INF/struts-tags.tld捆绑在struts2-core-tags.jar中,然后将其放入/WEB-INF/lib中。
https://stackoverflow.com/questions/1633414
复制相似问题