web-dev-qa-db-ja.com

リソースをロードするためにサーブレットベースのアプリケーションの作業フォルダーを見つける方法

Javaサーブレットを別のサーバー上のTomcatの多くのインスタンスにインストールしたいのですが、サーブレットはWEB-INFの下のwarファイルにパックされたいくつかの静的ファイルを使用します。これはディレクトリです一般的なインストールの構造:

- Tomcat
-- webapps
--- myapp
---- index.html
---- WEB-INF
----- web.xml
----- classes
------ src
------- .....
----- MY_STATIC_FOLDER
------ file1
------ file2
------ file3

静的ファイルを読み取れるように、MY_STATIC_FOLDERの絶対パスを知るにはどうすればよいですか?

「現在のフォルダー」(新しいFile( "。")で取得するもの)は、Tomcatサーバーがどこから起動されたかに依存するため、信頼できません。これは、インストールごとに異なります。

28

ServletContext#getRealPath() を使用して、相対Webコンテンツパスを絶対ディスクファイルシステムパスに変換できます。

_String relativeWebPath = "/WEB-INF/static/file1.ext";
String absoluteDiskPath = getServletContext().getRealPath(relativeWebPath);
File file = new File(absoluteDiskPath);
InputStream input = new FileInputStream(file);
// ...
_

ただし、InputStreamを取得することが唯一の目的である場合は、代わりにServletContext#getResourceAsStream()nullを返す可能性があるため、代わりに getRealPath() を使用することをお勧めします。 WARはローカルディスクファイルシステムで拡張されません(Tomcatはデフォルトで拡張されますが、拡張しないように構成できます)。

_String relativeWebPath = "/WEB-INF/static/file1.ext";
InputStream input = getServletContext().getResourceAsStream(relativeWebPath);
// ...
_

結局、これは_Java.io.File_アプローチよりもはるかに堅牢です。

以下も参照してください。

40
BalusC