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


95

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

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

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

ありがとう

回答:


138

これを行うにはいくつかの方法があります。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)

これにより、探しているリソースへの完全なシステムパスが得られます。ただし、サーブレットコンテナーが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)

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

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


3
これを機能させるには、次のように、パスに最初の/を置く必要があることを指摘する価値があります。context.getResourceAsStream( "/ WEB-INF / test / foo.txt");
Mick Sear

1
質問にタグが付けられているため、appengineでは単純には機能しません。
Renascienza 2016年

2
6年前に正解になりました。GoogleがApp Engine APIを変更したか、デプロイメントにバグがあります。標準サーブレットを実行している場合は、context.getResourceAsStream()バリエーションを使用できるはずです。
Berin Loritsch

2
これは良いようですが、Java 1.8を使用していて、getContext()はデフォルトでは存在しません。それを使用するにはどのjarファイルが必要ですか?
f1wade

3
ServletContextはjavax.servlet、J2EEライブラリのパッケージの一部です。サーブレットクラス(つまりextends java.servlet.GenericServlet)から参照を取得します。ところで、GenericServletを今する方法があるgetServletContext() docs.oracle.com/javaee/6/api/javax/servlet/...~~Vを
Berin Loritsch


1

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

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();           
InputStream stream = classLoader.getResourceAsStream("../test/foo.txt");
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.