【问题标题】:How to load a resource from WEB-INF directory of a web archive如何从 Web 存档的 WEB-INF 目录加载资源
【发布时间】:2009-07-10 08:43:21
【问题描述】:

我有一个网络存档,其中有一个文件放在 WEB-INF 目录中。

如何在 java 类中加载该文件?

我知道我可以将它放在类目录中并从那里加载它。它只会放在WEB-INF中。

【问题讨论】:

    标签: java


    【解决方案1】:

    在 ServletContext 对象上使用getResourceAsStream() 方法,例如

    servletContext.getResourceAsStream("/WEB-INF/myfile");
    

    您如何获得对 ServletContext 的引用取决于您的应用程序...您想从 Servlet 还是从 JSP 进行?

    已编辑:如果您在 Servlet 对象中,请调用 getServletContext()。如果您在 JSP 中,请使用预定义变量 application

    【讨论】:

    • 如果你在Servlet里面,你可以直接使用getServletContext()。 :)
    • 你也可以从request->session->servletContext访问servletContext。以防万一,您所拥有的只是一个请求对象。
    • 在 Tomcat 6 上我必须做 application.getResourceAsStream("/WEB-INF/myConfig.xml");
    • @AdeelAnsari:我在答案中加入了您的第一个建议,而不是 getServletConfig().getServletContext()
    • 除了ServletContext.getResourceAsStream(String)ServletContext.getResource(String) 方法也可以用于获取引用文件的 URL,而不是 InputStream
    【解决方案2】:

    这就是它在不使用 Servlet 的情况下对我的工作方式。

    假设我正在尝试访问项目/WebContent/WEB-INF/web.xml 中的 web.xml

    1. 在项目属性 Source-tab 中,通过指向 WEB-INF 文件夹的父容器(在我的例子中为 WebContent )添加源文件夹

    2. 现在让我们使用类加载器:

      InputStream inStream = class.getClass().getClassLoader().getResourceAsStream("Web-INF/web.xml")
      

    【讨论】:

    • 这会遇到问题,因为使用类将使用系统类。
    • 这会将你所有的网络资源复制到WEB-INF/classes,你仍然不能访问WEB-INF/web.xml,而是WEB-INF/classes/WEB-INF/web.xml。因此,尽管在 IDE 中配置源文件夹对于许多项目设置来说是不够的,但您最终会得到一个两倍大的应用程序,并且在各种重复问题中运行。
    【解决方案3】:

    我在访问我在 java (jersey) 服务器中创建的 sqlite db 文件时遇到的问题完全是由于路径所致。一些文档说 jdbc 连接 url 应该看起来像“jdbc:sqlite://path-to-file/sample.db”。我认为双斜杠是 htt 协议样式路径的一部分,并且在部署时会正确映射,但实际上,它是绝对或相对路径。因此,当我将文件放在 WebContent 文件夹(tomcat 项目)的根目录时,类似这样的 uri 工作“jdbc:sqlite:sample.db”。

    让我感到震惊的一件事是,当我单步调试调试器时,我收到一条消息,上面写着“正在打开数据库:...权限被拒绝”。我认为这是文件系统权限或sql用户权限的问题。在发现 SQLite 没有 MySQL 等角色/权限的概念后,我最终确实更改了文件权限,然后才得出我认为正确的解决方案,但我认为这只是一个坏消息(即权限被拒绝,而不是找不到文件)。

    希望这对某人有所帮助。

    【讨论】:

    • 快速更新。这在 Eclipse 中有效,但在实际部署到我的 tomcat 实例时失败。这在两个地方都有效:
    • 抱歉,没有及时添加修改。这在 Eclipse 和部署到 tomcat 实例时都有效: ServletContext context; DBConnection = DriverManager.getConnection("jdbc:sqlite:"+context.getRealPath("sample.db"));
    猜你喜欢
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    • 1970-01-01
    相关资源
    最近更新 更多