web-dev-qa-db-ja.com

war / WEB-INFフォルダー内のリソースへのファイルパス?

App Engineプロジェクトのwar/WEB-INFフォルダーにファイルがあります。 FAQで、サーブレットコンテキストでそこからファイルを読み取れることを読んでいます。しかし、リソースへのパスを形成する方法がわかりません:

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

上記のように、File()で使用するリソースへのパスをどのように構築しますか?

ありがとう

90
user291701

これを行うにはいくつかの方法があります。 WARファイル(1つの.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)

これにより、探しているリソースへの完全なシステムパスが取得されます。ただし、サーブレットコンテナが(Tomcatなどの)WARファイルを展開しない場合は機能しません。動作するのは、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)

後者のアプローチは、使用するサーブレットコンテナやアプリケーションのインストール場所に関係なく機能します。前者のアプローチは、展開前にWARファイルを解凍した場合にのみ機能します。

EDIT:getContext()メソッドは明らかに実装しなければならないものです。 JSPページは、contextフィールドとして使用可能にします。サーブレットでは、サーブレットのinit()メソッドに渡されるServletConfigから取得します。その時点で保存すると、その後いつでもServletContextを取得できます。

134
Berin Loritsch

Java EE 7を使用すると、次のようにしてリソースをより簡単に見つけることができます。

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

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

3
Daniel De León

私はこれが遅いことを知っていますが、これは私が通常行う方法です、

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