Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.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 在Tomcat中加载资源_Java_Tomcat7_War_Web Inf_Embedded Tomcat 7 - Fatal编程技术网

Java 在Tomcat中加载资源

Java 在Tomcat中加载资源,java,tomcat7,war,web-inf,embedded-tomcat-7,Java,Tomcat7,War,Web Inf,Embedded Tomcat 7,我正在用Tomcat7尝试一个简单的web应用程序。它在index.html中有一个javascript调用,用于加载属性文件。使用以下代码进行get调用 var req = new XMLHttpRequest(); req.open("GET", "xyz.properties"); req.onreadystatechange = function() { if (req.readyState == 4) { if (req.status == 200) {

我正在用Tomcat7尝试一个简单的web应用程序。它在index.html中有一个javascript调用,用于加载属性文件。使用以下代码进行get调用

var req = new XMLHttpRequest();
req.open("GET", "xyz.properties");
req.onreadystatechange = function() {
    if (req.readyState == 4) {
        if (req.status == 200) {
        }
    }
}
req.send();
尝试了以下用例

  • 将属性文件直接保存在war文件内部,即WEB-INF外部-这是可行的。
  • 将其保存在WEB-INF/classes下-不起作用
  • 将其包装在罐子中,并将其保存在WEB-INF/lib下-不起作用
  • 将jar放在Tomcat/lib下-无法工作 据我所知,每个资源/类请求都通过WebAppClassloader,它按以下顺序查看

  • Jvm引导程序
  • 系统加载器
  • web-inf/class
  • web inf/lib
  • 共享/库
  • 在我的实际应用程序中,我使用的是嵌入式tomcat,目标是通过jar将属性文件外部化(在战争之外)。因此,上述测试旨在了解tomcat的基本资源加载

    有没有人能解释一下上述测试中遗漏了什么。通常,如果get请求通过类加载器,它不应该在所有情况下都能找到文件

    据我所知,每个资源/类请求都通过WebAppClassloader,它按以下顺序查看

    是和否

    是的,当webapp代码(或任何东西)试图使用
    Class.getResource
    或等效工具通过类加载器定位资源时,就会发生这种情况

    但当你向你的webapp发送一个GET请求时,情况就不是这样了。GET请求根本不涉及类加载器。相反,它必须由servlet处理;e、 一个是您自己编写的,一个是从JSP生成的,或者是“默认”servlet。。。可用于提供内容文件

    假设您希望提供通过类加载器定位的属性文件,servlet的
    doRequest
    doGet
    方法需要:

    • 找到资源,并将其作为输入流打开
    • 打开请求输出流
    • 将输入流复制到输出流,然后
    • 关闭输入流

    如果您这样做,该方法需要确保它只提供您想要的特定资源。允许客户端获取类加载器可以找到的任何资源将是一个非常糟糕的主意

    我认为,容器将使用类加载器来加载资源。但显然从你的解释来看,情况并非如此。那么,它是否只是试图在web存档中查找该资源的相对路径?至于类加载器,要使用它,必须通过servlet/filter/etc显式调用它。