【问题标题】:Loading resources in Tomcat在Tomcat中加载资源
【发布时间】:2014-08-25 10:50:25
【问题描述】:

我在 tomcat 7 中尝试一个简单的 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();

尝试了以下用例,

  1. 将属性文件直接保存在 war 文件中,即在 WEB-INF 之外 - 这可行。
  2. 将其保存在 WEB-INF/classes 下 - 不起作用
  3. 将其包装在 jar 中并保存在 WEB-INF/lib 下 - 不起作用
  4. 将 jar 放在 Tomcat/lib 下 - 不起作用

据我了解,每个资源/类请求都通过 WebAppClassloader,它按以下顺序查看事物,

  1. Jvm 引导带
  2. 系统加载器
  3. web-inf/类
  4. web-inf/lib
  5. 共享/库

在我的实际应用程序中,我使用的是嵌入式 tomcat,目标是通过 jar 将属性文件外部化(在战争之外)。因此,通过上述测试来了解 tomcat 的基本资源加载。

有人可以对上述测试中缺少的内容有所了解吗?通常如果get请求通过类加载器,它不应该在所有情况下都能找到文件吗?

【问题讨论】:

    标签: java tomcat7 war web-inf embedded-tomcat-7


    【解决方案1】:

    据我了解,每个资源/类请求都通过 WebAppClassloader,它按以下顺序查看事物...

    是和不是。

    是的,当 webapp 代码(或其他)尝试使用 Class.getResource 或等效项通过类加载器定位资源时,就会发生这种情况。

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

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

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

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

    【讨论】:

    • 我想,容器会OOB使用类加载器来加载资源。但显然从你的解释来看,事实并非如此。那么它是否只是尝试在 Web 存档中查找该资源的相对路径?至于类加载器,要使用它,必须通过 servlet/filter/etc 显式调用它。
    猜你喜欢
    • 2017-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    • 2016-08-28
    • 1970-01-01
    相关资源
    最近更新 更多