【问题标题】:Best practices to store and access resource files in java web application在 Java Web 应用程序中存储和访问资源文件的最佳实践
【发布时间】:2012-12-22 19:13:38
【问题描述】:

我有一堆文本、xml 和其他文件(即资源),我需要在 java web 应用程序中使用 servlet 访问它们。例如,有一个 xml 文件,其中一部分是通过用户查询与 servlet 一起返回的。我正在使用Tomcat。存储这些文件并从 Java 代码访问它们的最佳实践是什么? 1) 我应该将它们放在哪里的默认文件夹是什么,我需要将它们放入 Web 存档中还是放入其中一个罐子中? 2)如何从java代码访问文件?如何设置它们的路径以便它可以在任何环境中工作? 附言我已经阅读了许多与此主题相关的帖子,其中大多数建议将资源存储在 jar 中并使用 java.lang.Class.getResourceAsStream(String) 访问它们。这似乎很奇怪,因为类和数据应该分开。

【问题讨论】:

    标签: file web-applications servlets war


    【解决方案1】:

    使用类加载器加载静态资源非常好。例如,这就是 ResourceBundle 加载国际化属性文件时所做的。

    将它们与您的类文件一起放入WEB-INF/classes,或放入WEB-INF/lib 内的jar 中,并按照您已阅读的答案所示使用ClassLoader 加载它们。

    这并不禁止您将这些文件放置在与项目中的 Java 源文件不同的目录中。构建过程应该确保将它们放在适当的位置以供运行时使用。 Maven 和 Gradle 约定是将源文件放在src/main/java 下,将资源文件放在src/main/resources 下。

    【讨论】:

    • 1) 如果我已经在 WEB-INF/resources 文件夹中有资源怎么办?它们被 HTML 页面中的 JavaScript 使用。该页面是WEB-INF/index.html,脚本使用相对路径引用资源。 2)我应该在哪里存储资源文件夹的路径? web.xml 或其他静态资源中是否有位置?
    • WEB-INF中的资源无法从外部访问,因此无法从浏览器加载WEB-INF中的JS文件。您可以使用 ServletContext.getResourceAsStream() 从 webapp 中的任何位置(包括 WEB-INF)加载资源,但这会强制加载类访问 ServletContext。我不明白你的第二个问题。这是一个静态资源。为什么不在某个常量中硬编码路径?
    • 需要一个 servlet 实例来获取上下文,然后获取资源或文件夹路径。有没有办法在不实例化任何东西的情况下实现静态?我的第二个问题与我应该存储这些常量的位置有关。在一些与 web 相关的资源中是否有位置,例如 web.xml(而不是在其中一个类源代码中有一个常量)?
    • 您可以添加一个过滤器,将当前请求存储在 ThreadLocal 中,并在代码中使用此 ThreadLocal 来访问请求,然后访问 servlet 上下文。但我只会使用类加载器。通过外部化路径而不是使用常量,你会得到什么?您现在有两种可能的错误:将文件放在错误的位置,或者在 web.xml 中设置一个错误的值 not value。如果你真的想这样做,那么使用 context-param(需要 servletcontext)或 env-entry(你可以使用 JNDI 查找或作为资源注入)
    猜你喜欢
    • 2011-02-18
    • 1970-01-01
    • 2013-03-10
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    • 1970-01-01
    • 1970-01-01
    • 2014-01-22
    相关资源
    最近更新 更多