如何在Java类中访问WEB-INF文件夹下的文件

20
我有一个普通的Java类在Web应用程序中,并想要读取WEB-INF文件夹下的配置文件。我知道如何访问classpath中的文件(WEB-INF/classes文件夹)。因为WEB-INF/classes文件夹是用于.class文件,所以我想把我的配置文件只放在WEB-INF文件夹下。
请问有人可以告诉我如何从我的Java类中访问它吗?

1
如果配置文件是为Java类而设计的,为什么要将其放在WEB-INF文件夹中...而不是放在src/main/resources文件夹中并从那里访问呢? - Mr T.
我认为getResourceAsStream应该可以工作。 - SJuan76
1
配置文件应该放在src/main/resources目录下,并在部署Web应用程序时编译到类文件夹中。为什么需要将配置文件放置在WEB-INF文件夹中? - Thinhbk
我(暂时)同意@Thinhbk的观点:WEB-INF是用于Web相关组件(如Servlet和Filter)配置的位置。对于“普通Java类”组件的配置应该在类路径上。也许。 - Tom Anderson
我认为 WEB-INF/classes 文件夹不应该包含任何配置文件。 - Newbie
4个回答

22

ServletContext.getResourceAsStream()可以从WAR文件的根目录相对路径加载文件。例如:

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

这里面的一个主要问题是,您需要访问servlet上下文才能做到这一点。您可以在servlet或过滤器中拥有它,但在应用程序中进一步返回的非Web组件中没有。您有几个选项:

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

1
在非 Web 组件(如普通的 Java 类)中没有直接的方法来做到这一点? - Newbie
2
据我所知没有。普通的Java类不知道它是Web应用程序的一部分,因此它无法访问任何特定于Web应用程序的API来执行任务! - Tom Anderson

2
你可以使用ServletContextgetRealPath()方法获取servlet的绝对路径,然后在该路径后添加WEB-INF。我认为这很基础,可能还有其他答案。

2
我知道如何在ServletContext的帮助下完成这个操作。但是我要做的是在一个普通的Java类中完成它。 - Newbie

1

嘿,大家都关注与上下文相关的文件加载,例如应用程序上下文、web.xml、配置和属性文件。

下面是如何加载存储在WEB-INF下的任何类型的Java文件,但其存储在另一个结构中,例如子文件夹reportFile中的文件或子文件夹report01--

完整路径为/WEB-INF/reportFile/report01/report.xml,我已经尝试了许多可能性来加载和读取这个xml文件......上述所有方法都没有奏效,但是,这是未来使用的技巧......

在Action或service类中,您知道接口实现类,而没有导入包,这是好的部分。

声明您的文件对象。

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"));

干杯!!


1
"

对我而言,new FileInputStream(Utility.class.getClassLoader().getResource(keyFileName).getPath())这行代码可用。

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

"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接