在Tomcat中加载资源

时间:2014-08-25 10:50:25

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

我正在tomcat 7中尝试一个简单的Web应用程序。它在index.html中有一个javascript调用,它会加载一个属性文件。使用以下代码拨打电话,

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下 - 不起作用
  5. 据我所知,每个资源/类请求都通过WebAppClassloader,它按以下顺序查看事物,

    1. Jvm Boot Strap
    2. 系统加载程序
    3. WEB-INF /类
    4. WEB-INF / lib中
    5. 共享/ lib中
    6. 在我的实际应用程序中,我使用的是嵌入式tomcat,目标是通过jar将属性文件外化(在战争的一侧)。因此上面的测试可以理解tomcat的基本资源加载。

      有人可以对上述测试中遗漏的内容进行一些说明。通常,如果get请求通过类加载器,则不应该在所有情况下都能找到该文件。

1 个答案:

答案 0 :(得分:0)

  

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

是和否。

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

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

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

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

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