【问题标题】:How to access a file under WEB-INF folder in java class如何在java类中访问WEB-INF文件夹下的文件
【发布时间】:2012-10-14 15:51:35
【问题描述】:

我在 Web 应用程序中有一个普通的 java 类,并想读取 WEB-INF 文件夹下的配置文件。如果文件位于类路径(WEB-INF/classes 文件夹)中,我知道访问文件的方式。由于WEB-INF/classes 文件夹用于.class 文件,我只想将我的配置文件保存在WEB-INF 文件夹下。

谁能告诉我如何从我的 java 类中访问它?

【问题讨论】:

  • 如果配置文件是用于Java类的,为什么要把它放在WEB-INF文件夹中……为什么不放在src/main/resources文件夹中并从那里访问呢?
  • 我会说getResourceAsStream 应该可以工作
  • 配置应该在src/main/resources,部署web应用时会内置到class文件夹中。为什么要把配置文件放到WEB-INF文件夹下?
  • 我(暂时)同意@Thinhbk:WEB-INF 是用于配置 Web 相关组件(如 servlet 和过滤器)的位置。 'plain Java class' 组件的配置应该在类路径上。也许吧。
  • 我觉得WEB-INF/classes文件夹应该没有配置文件。

标签: java jakarta-ee


【解决方案1】:

ServletContext.getResourceAsStream() 将从相对于 WAR 文件根目录的给定路径加载文件。比如:

ServletContext ctx;
InputStream configStream = ctx.getResourceAsStream("/WEB-INF/config.properties");

这里的主要问题是您需要访问 servlet 上下文才能执行此操作。您可以在 servlet 或过滤器中使用它,但在应用程序更靠后的非 Web 组件中没有。您有几个选择:

  • 通过应用程序范围的变量、注入或其他方式,将 servlet 上下文从 Web 层提供给服务层
  • 将资源加载代码放在 web 层,并暴露给服务层
  • 在web层加载配置,传递给服务层

【讨论】:

  • 没有像普通 java 类这样的非 Web 组件直接执行此操作的方法吗?
  • 我不知道。一个普通的 Java 类不知道它是 Web 应用程序的一部分,因此它无法访问任何 API 来执行特定于 Web 应用程序的事情!
【解决方案2】:

您可以使用ServletContextgetRealPath() 方法获取servlet 的绝对路径,然后将WEB-INF 附加到您获取的路径中。我认为这是非常基本的,可能还有其他一些答案。

【讨论】:

  • 我知道如何在ServletContext 的帮助下做到这一点。但我正在寻找的是在一个普通的 java 类中做到这一点。
【解决方案3】:

hey you all care for context related file loading like application context , web.xml ,config and property file

这里是如何在WEB-INF 下加载任何类型的文件的 java 文件,但它存储在另一个结构上,例如子文件夹 reportFile 您的文件或子文件夹再次 report01--

fullpath is = /WEB-INF/reportFile/report01/report.xml,我已经尝试了很多方法来加载和读取这个 xml 文件...以上都不适用于我,但是,这是未来使用的技巧...

In Action or inservice class you know interface implementation class 没有 imports 这也是很好的部分。

声明你的文件对象

File myClass = new File(getClass().getProtectionDomain().getCodeSource().getLocation().getFile());
System.out.println("Finding calss path first then remove classes from the path "    + myClass.getCanonicalPath().replaceFirst("classes", "")+"reportFIle/report01/reports.xml")

2.通过从上面删除classes来加载路径并添加您的特定路径

File f = new File(myClass.getCanonicalPath().replaceFirst("classes", "")+"reportFile/report01/reports.xml")

那么

你甚至可以使用 xml 解析器来解析它或做任何事情

document = docBuilder.parse(new File(myClass.getCanonicalPath().replaceFirst("classes", "")+"reportFile/report01/reports.xml"));

干杯!!

【讨论】:

    【解决方案4】:

    "新文件输入流( Utility.class.getClassLoader().getResource(keyFileName).getPath() )" 为我工作。

    这里的“Utility”是我的代码调用这一行的类名,“keyFileName”是我需要打开的文件

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-12
      • 1970-01-01
      • 1970-01-01
      • 2014-08-17
      • 2011-01-21
      • 2014-09-08
      相关资源
      最近更新 更多