Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java war/WEB-INF文件夹中资源的文件路径?_Java_Google App Engine_Web Applications - Fatal编程技术网

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

Java war/WEB-INF文件夹中资源的文件路径?,java,google-app-engine,web-applications,Java,Google App Engine,Web Applications,我的应用程序引擎项目的war/WEB-INF文件夹中有一个文件。我在常见问题解答中读到,您可以在servlet上下文中从那里读取文件。但我不知道如何形成到资源的路径: /war/WEB-INF/test/foo.txt 我将如何构造指向该资源的路径,以便与File()一起使用,正如上面所示 谢谢有几种方法可以做到这一点。只要扩展了WAR文件(一组文件而不是一个.WAR文件),就可以使用以下API: ServletContext context = getContext(); String fu

我的应用程序引擎项目的war/WEB-INF文件夹中有一个文件。我在常见问题解答中读到,您可以在servlet上下文中从那里读取文件。但我不知道如何形成到资源的路径:

/war/WEB-INF/test/foo.txt
我将如何构造指向该资源的路径,以便与File()一起使用,正如上面所示


谢谢

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

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

这将为您获取所查找资源的完整系统路径。但是,如果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");

无论您使用什么Servlet容器以及应用程序安装在何处,后一种方法都会起作用。前一种方法只有在WAR文件在部署之前解压缩时才有效

编辑:
getContext()方法显然是必须实现的。JSP页面将其作为
上下文
字段提供。在servlet中,您可以从
ServletConfig
获得它,它被传递到servlet的
init()
方法中。如果您当时存储它,您可以在此后的任何时间获取您的ServletContext。

现在使用Java EE 7,您可以更轻松地使用

InputStream resource = getServletContext().getResourceAsStream("/WEB-INF/my.json");

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

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();           
InputStream stream = classLoader.getResourceAsStream("../test/foo.txt");

值得指出的是,我需要在路径中添加一个初始/以使其工作,如:context.getResourceAsStream(“/WEB-INF/test/foo.txt”);在appengine上没有问题标记的那么简单。它在6年前被标记为正确答案。谷歌更改了应用程序引擎API,或者您的部署中存在错误。如果您运行的是标准的Servlet,您应该能够使用
context.getResourceAsStream()
变体。这似乎不错,但我使用的是java 1.8,默认情况下getContext()不存在,需要哪个jar文件来使用它?ServletContext是J2EE库的
javax.Servlet
包的一部分。您可以从servlet类(即扩展
java.servlet.GenericServlet
)中获得对它的引用。顺便说一句,GenericServlet现在有了一个方法来
getServletContext()
这个
getServletContext()
从何而来?您可以从JavaServlet3.1开始找到它。