war / WEB-INF文件夹中资源的文件路径?


95

我的App Engine项目的war / WEB-INF文件夹中有一个文件。我在FAQ中读到,您可以在Servlet上下文中从那里读取文件。我不知道如何形成资源的路径:

/war/WEB-INF/test/foo.txt

我将如何构造指向该资源的路径以与File()一起使用,就像上面一样?

谢谢

Answers:


138

有两种方法可以做到这一点。只要扩展WAR文件(一组文件而不是一个.war文件),就可以使用以下API:

ServletContext context = getContext();
String fullPath = context.getRealPath("/WEB-INF/test/foo.txt");

http://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/ServletContext.html#getRealPath(java.lang.String)

这将为您提供所需资源的完整系统路径。但是,如果Servlet容器从不展开WAR文件(例如Tomcat),那将不起作用。起作用的是使用ServletContext的getResource方法。

ServletContext context = getContext();
URL resourceUrl = context.getResource("/WEB-INF/test/foo.txt");

或者,如果您只想要输入流:

InputStream resourceContent = context.getResourceAsStream("/WEB-INF/test/foo.txt");

http://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/ServletContext.html#getResource(java.lang.String)

无论您使用哪种Servlet容器以及应用程序的安装位置,后一种方法都将起作用。前一种方法仅在部署前解压缩WAR文件时才有效。

编辑: getContext()方法显然是您必须实现的东西。JSP页面使其可用作context字段。在Servlet中,您可以从中获取它,ServletConfig并将其传递到Servlet的init()方法中。如果在那时存储它,那么之后您可以随时获取自己的ServletContext。


3
值得指出的是,我需要在路径中添加一个首字母/,以使其正常运行,如下所示:context.getResourceAsStream(“ / WEB-INF / test / foo.txt”);
米克·塞尔

1
在问题上被标记为问题,因此在appengine上工作不那么简单。
Renascienza

2
6年前,它被标记为正确答案。Google更改了App Engine API,或者您的部署中存在错误。如果运行的是标准Servlet,则应该能够使用该context.getResourceAsStream()变体。
Berin Loritsch '16

2
这似乎很好,但是我使用的是Java 1.8,默认情况下不存在getContext(),需要使用哪个jar文件?
f1wade

3
ServletContext是javax.servletJ2EE库软件包的一部分。您可以从servlet类获得对它的引用(即extends java.servlet.GenericServlet)。顺便说一句,GenericServlet现在具有一种前往getServletContext() docs.oracle.com/javaee/6/api/javax/servlet/…
Berin Loritsch 2016年


1

我知道这很晚了,但这是我通常的做法,

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();           
InputStream stream = classLoader.getResourceAsStream("../test/foo.txt");
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.