Java 如果在应用服务器上放置JAR';我们如何从JSP引用它
在我们的应用程序中,我们会收到一个错误,错误是:Java 如果在应用服务器上放置JAR';我们如何从JSP引用它,java,jsp,struts,Java,Jsp,Struts,在我们的应用程序中,我们会收到一个错误,错误是: PWC6117: File "/struts-tags" not found 给出错误的文件中的代码是: <%@ taglib prefix="s" uri="/struts-tags" %> 该文件位于struts2-core.jar中,该文件位于应用服务器(Sun 9.1)的类路径上 当jar实际位于应用程序的WEB-INF/lib中时,与在appserver的类路径上相比,代码将工作良好,并且不会抱怨。但我们不能改变这一
PWC6117: File "/struts-tags" not found
给出错误的文件中的代码是:
<%@ taglib prefix="s" uri="/struts-tags" %>
该文件位于struts2-core.jar中,该文件位于应用服务器(Sun 9.1)的类路径上
当jar实际位于应用程序的WEB-INF/lib中时,与在appserver的类路径上相比,代码将工作良好,并且不会抱怨。但我们不能改变这一点。它必须位于appservers类路径上
但是我们应该如何更改代码以消除这个错误呢
我可以在我的web.xml中创建映射,以便更改标记uri。但taglib位置应该更改为什么?所以它引用了应用服务器类路径
<taglib>
<taglib-uri>/WEB-INF/struts-tags.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-tags.tld</taglib-location>
</taglib>
/WEB-INF/struts-tags.tld
/WEB-INF/struts-tags.tld
可能是应用程序服务器和web应用程序本身正在运行两个不同的类加载器。因此,确保jar文件不仅在应用服务器的类路径中可用,而且在应用程序本身的类路径中可用。如果有一个“共享”的lib目录(它在WebSphere中的位置…不确定Sun的情况)将其放在那里JSP标准不要求应用程序服务器使用类路径来定位/加载标签库tld文件。这只是应用服务器用于存储公共TLD的一个选项。但是,容器将使用类路径来定位与标记库关联的类文件。但作为开始步骤,它必须首先定位并加载tld文件;为此,假设类路径不存在
根据JSP 2.2标准,JSP容器通过两个步骤将taglib指令中使用的URI映射到标记库描述符中:
- A) JavaEE平台标记库映射(JSP标记库和JSF库)
- B) web.xml中的Taglib映射
- C) WEB-INF/lib/.jar、WEB-INF/.tld和WEB-INF/*/.tld中tld的隐式映射项
- D) 容器中的隐式映射项
- E) 一种回退策略,针对临时开发使用,其中URI被解释为TLD的直接路径
- 直接创建TLD文件
- 或指向在META-INF/taglib.TLD位置具有TLD文件的JAR文件李>
指向生成的TLD文件,或者将META-INF/taglib.TLD
插入类路径上的jar文件,并将指向jar文件我假设您已经熟悉了TLD在
WEB-INF
中的工作方式,以及容器如何构建映射以匹配JSPtaglib
指令的uri
属性。因此,这里我将更关注您的类路径问题
根据JSP2.0规范
容器仅在以下四个位置查找TLD文件
- /WEB-INF/MyTags.tld
- /WEB-INF/Any Sub Dir/MyTags.tld
- /WEB-INF/lib/tag-lib.jar和/META-INF/MyTags.tld
- /WEB-INF/lib/tag-lib.jar和/META-INF/Any Sub Dir/MyTags.tld
为了不破坏JSP 2.0之前的web应用程序,最新的容器仍将支持在web.xml
中找到的任何
映射。但是,它对您没有任何帮助,因为
仍然受上述位置的约束。我还没有遇到任何流行的容器允许从应用程序的/WEB-INF
外部加载.tld
答复
但是,该约束仅适用于标记库描述符。实际的标记实现类只需要位于类路径中。通常,标记类(以及tld
)被打包在jar中(比如struts2 core.jar
),并放入WEB-INF/lib
但是,它们很可能是分开的:内部WEB-INF/classes
;或者,WEB-INF/lib
中的其他jar或应用程序服务器的共享库本身。因此,您需要做的就是:
- 从
struts2 core.jar
- 将
struts标签.tld
放在/WEB-INF
内(/tlds
或/struts
等)
- 删除
映射(如果在符合JSP 2.0的容器上运行)
有些人更喜欢保留映射,只是为了记录正在加载的所有tld
文件的位置。或者,您可以将/META-INF/struts tags.tld
捆绑在struts2 core tags.jar
中,然后将其放入/WEB-INF/lib
中。它认为应用服务器的类路径对于这个jar来说是一个非常奇怪的地方;由于您可能希望在其上使用不同版本的struts部署不同的应用程序。。。您可以在