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

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

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

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

谢谢


答案 1

有几种方法可以做到这一点。只要展开 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 页面使其可用作字段。在 servlet 中,你从你的 servlet 中获取它,然后传递到 servlet 的方法中。如果你在那个时候存储它,你可以在那之后的任何时间获得你的ServletContext。contextServletConfiginit()


答案 2

现在,有了 Java EE 7,您可以使用它更轻松地找到资源

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

https://docs.oracle.com/javaee/7/api/javax/servlet/GenericServlet.html#getServletContext--


推荐