App Engineプロジェクトのwar/WEB-INFフォルダーにファイルがあります。 FAQで、サーブレットコンテキストでそこからファイルを読み取れることを読んでいます。しかし、リソースへのパスを形成する方法がわかりません:
/war/WEB-INF/test/foo.txt
上記のように、File()で使用するリソースへのパスをどのように構築しますか?
ありがとう
これを行うにはいくつかの方法があります。 WARファイル(1つの.warファイルではなく一連のファイル)が展開されている限り、このAPIを使用できます。
ServletContext context = getContext();
String fullPath = context.getRealPath("/WEB-INF/test/foo.txt");
これにより、探しているリソースへの完全なシステムパスが取得されます。ただし、サーブレットコンテナが(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");
後者のアプローチは、使用するサーブレットコンテナやアプリケーションのインストール場所に関係なく機能します。前者のアプローチは、展開前にWARファイルを解凍した場合にのみ機能します。
EDIT:getContext()メソッドは明らかに実装しなければならないものです。 JSPページは、context
フィールドとして使用可能にします。サーブレットでは、サーブレットのinit()
メソッドに渡されるServletConfig
から取得します。その時点で保存すると、その後いつでもServletContextを取得できます。
Java EE 7を使用すると、次のようにしてリソースをより簡単に見つけることができます。
InputStream resource = getServletContext().getResourceAsStream("/WEB-INF/my.json");
https://docs.Oracle.com/javaee/7/api/javax/servlet/GenericServlet.html#getServletContext--
私はこれが遅いことを知っていますが、これは私が通常行う方法です、
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream stream = classLoader.getResourceAsStream("../test/foo.txt");