0

我正在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. 把它包在一个罐子里,放在 WEB-INF/lib 下——没用
  4. 将 jar 放在 Tomcat/lib 下 -没有用。

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

  1. Jvm 引导带
  2. 系统加载器
  3. 网络信息/类
  4. 网络信息/库
  5. 共享/库

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

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

4

1 回答 1

1

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

是和不是。

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

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

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

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

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

于 2014-08-25T11:11:31.727 回答