我们war/WEB-INF文件夹中资源的文件路径是什么?

100

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

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

我该如何构建路径以便与File()函数一起使用,就像上面显示的那样?

谢谢

3个回答

144

有几种方法可以实现这个。只要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中,您可以从传递到servlet的“init()”方法的“ServletConfig”中获取它。如果在那时存储它,您可以在此之后随时获取Servlet上下文。

3
值得指出的是,为了使其工作,我需要在路径前加一个初始的斜线,像这样: context.getResourceAsStream("/WEB-INF/test/foo.txt"); - Mick Sear
1
在AppEngine上不像问题标记的那样简单工作。 - Renascienza
2
它在6年前被标记为正确答案。要么是Google更改了应用程序引擎API,要么是您的部署存在错误。如果您正在运行标准Servlet,则应该能够使用context.getResourceAsStream()变体。 - Berin Loritsch
2
这看起来不错,但我正在使用Java 1.8,getContext()默认不存在,需要哪个jar文件才能使用它? - f1wade
3
ServletContext是J2EE库中javax.servlet包的一部分。您可以从servlet类(即扩展了 java.servlet.GenericServlet 的类)获得对它的引用。顺便说一下,GenericServlet现在有一个方法 getServletContext() 可以使用。http://docs.oracle.com/javaee/6/api/javax/servlet/GenericServlet.html#getServletContext() - Berin Loritsch
显示剩余3条评论

5

1
getServletContext() 方法从哪里来? - AdamHurwitz
1
Adam,你可以从Java Servlet 3.1开始找到它。 - Daniel De León

3

我知道现在有些晚了,但这是我通常的做法:

这段话与IT技术无关。
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();           
InputStream stream = classLoader.getResourceAsStream("../test/foo.txt");

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