App Engineプロジェクトのwar / WEB-INFフォルダーにファイルがあります。サーブレットコンテキストでそこからファイルを読み取ることができるというFAQを読みました。ただし、リソースへのパスを形成する方法がわかりません。
/war/WEB-INF/test/foo.txt
上記のように、File()で使用するそのリソースへのパスをどのように構築しますか?
ありがとう
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");
これにより、探しているリソースへの完全なシステムパスが得られます。ただし、サーブレットコンテナーが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");
後者のアプローチは、使用するサーブレットコンテナやアプリケーションのインストール場所に関係なく機能します。前者の方法は、WARファイルが展開前に解凍された場合にのみ機能します。
編集:
getContext()メソッドは明らかに実装する必要があるものです。JSPページでは、context
フィールドとして使用できます。サーブレットServletConfig
では、サーブレットのinit()
メソッドに渡されるサーブレットから取得します。その時点で保存しておけば、その後いつでもServletContextを取得できます。
context.getResourceAsStream()
バリエーションを使用できるはずです。
javax.servlet
、J2EEライブラリのパッケージの一部です。サーブレットクラス(つまりextends java.servlet.GenericServlet
)から参照を取得します。ところで、GenericServletを今する方法があるgetServletContext()
docs.oracle.com/javaee/6/api/javax/servlet/...~~Vを
Java EE 7を使用すると、リソースをより簡単に見つけることができます
InputStream resource = getServletContext().getResourceAsStream("/WEB-INF/my.json");
https://docs.oracle.com/javaee/7/api/javax/servlet/GenericServlet.html#getServletContext--
getServletContext()
から来たのですか?