Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果在应用服务器上放置JAR';我们如何从JSP引用它_Java_Jsp_Struts - Fatal编程技术网

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映射到标记库描述符中:

  • 它将URI解析为TLD资源[URL]路径(与上下文相关的URL路径,以“/”开头,没有协议或主机-即相对于webapp的基本URL)

    此映射通过构建自(按优先级顺序)的标记库映射发生:

    • A) JavaEE平台标记库映射(JSP标记库和JSF库)
    • B) web.xml中的Taglib映射
    • C) WEB-INF/lib/.jar、WEB-INF/.tld和WEB-INF/*/.tld中tld的隐式映射项
    • D) 容器中的隐式映射项
    • E) 一种回退策略,针对临时开发使用,其中URI被解释为TLD的直接路径
    这里B)或D)可能对您有用。但是D)是容器可用的可选优先级扩展机制,它插入容器实现/提供的taglib映射。阅读SUN 9.1文档,它似乎没有提供D)。因此,如果SUN 9.1没有在类路径上的jar中检测到TLD,您应该使用B),就像您在Q中开始做的那样

  • 它从TLD资源路径派生TLD对象。 TLD资源路径应解析为:

    • 直接创建TLD文件
    • 或指向在META-INF/taglib.TLD位置具有TLD文件的JAR文件
    如果TLD资源路径不是这两种情况之一,则将发生致命的转换错误

    这两项目前都不适用于您。因此,根据该标准,您需要提取jar内容并将
    指向生成的TLD文件
    ,或者
    META-INF/taglib.TLD
    插入类路径上的jar文件
    ,并将指向jar文件


  • 我假设您已经熟悉了TLD在
    WEB-INF
    中的工作方式,以及容器如何构建映射以匹配JSP
    taglib
    指令的
    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部署不同的应用程序。。。您可以在