web-dev-qa-db-ja.com

servletcontext.getRealPath( "/")の意味と使用するタイミング

次のスニペットで:

ServletContext context = request.getServletContext();
String path = context.getRealPath("/");

メソッドgetRealPath()/は何を表しますか?いつ使用すべきですか?

60
saplingPro

前書き

ServletContext#getRealPath() は、Webコンテンツパス(サーバーのディスクファイルシステム上の展開されたWARフォルダー構造内のパス)を絶対ディスクファイルシステムパスに変換することを目的としています。

"/"は、Webコンテンツのルートを表します。つまり以下のプロジェクト構造のように、webフォルダーを表します。

YourWebProject
 |-- src
 |    :
 |
 |-- web
 |    |-- META-INF
 |    |    `-- MANIFEST.MF
 |    |-- WEB-INF
 |    |    `-- web.xml
 |    |-- index.jsp
 |    `-- login.jsp
 :    

したがって、"/"getRealPath()に渡すと、プロジェクトの展開されたWARファイルの/webフォルダーの絶対ディスクファイルシステムパスが返されます。 FileまたはFileInputStreamでさらに使用できる/path/to/server/work/folder/some.war/のようなもの。

ほとんどのスターターは、Webコンテンツパス全体を実際に渡すことができ、頻繁に使用することに気づかないようです。

String absolutePathToIndexJSP = servletContext.getRealPath("/") + "index.jsp"; // Wrong!

あるいは

String absolutePathToIndexJSP = servletContext.getRealPath("") + "index.jsp"; // Wronger!

の代わりに

String absolutePathToIndexJSP = servletContext.getRealPath("/index.jsp"); // Right!

そこにファイルを書かないでください

また、FileOutputStreamを使用して新しいファイルを書き込むことができますが、すべての変更(新しいファイルや編集されたファイルなど)はget lost WARが再デプロイされるたび。これらのすべての変更が元のWARファイルに含まれていないという単純な理由があります。したがって、アップロードされたファイルをそこに保存しようとするすべての初心者は、それを間違っています。

さらに、サーバーがWARファイルをディスクファイルシステムに展開するように構成されていない場合、getRealPath()は常にnullまたは完全に予期しないパスを返しますが、代わりに仮想ファイルシステムとしてのメモリ。

getRealPath()は移植できません。絶対に使わないほうがいい

getRealPath()を慎重に使用してください。実際には、no実用的な実用的なケースがあります。私のJava EEの20年の経験に基づいて、alwaysgetRealPath()よりもはるかに優れており、より移植性の高い別の方法があります。

実際に必要なのがWebリソースのInputStreamを取得することだけである場合は、代わりに ServletContext#getResourceAsStream() を使用してください。これは、WARの展開方法に関係なく機能します。したがって、たとえばindex.jspInputStreamが必要な場合、donotdo:

InputStream input = new FileInputStream(servletContext.getRealPath("/index.jsp")); // Wrong!

しかし、代わりに:

InputStream input = servletContext.getResourceAsStream("/index.jsp"); // Right!

または、使用可能なすべてのWebリソースパスのリストを取得する場合は、代わりに ServletContext#getResourcePaths() を使用します。

Set<String> resourcePaths = servletContext.getResourcePaths("/");

ServletContext#getResource() を介してURLとして個々のリソースを取得できます。これは、リソースが存在しないときにnullを返します。

URL resource = servletContext.getResource(path);

または、アップロードしたファイルを保存する場合、または一時ファイルを作成する場合は、以下の「参照」リンクを参照してください。

こちらもご覧ください:

104
BalusC

Webアプリケーションのコンテキストパスは、WebアプリケーションのWEB-INFディレクトリを含むディレクトリです。これは、Webアプリの「ホーム」と考えることができます。多くの場合、Webアプリケーションを作成するとき、ファイルシステムでこのディレクトリの実際の場所を取得することが重要になる場合があります。これにより、ファイルからの読み取りやファイルへの書き込みなどを実行できるからです。

この場所は、ServletContextオブジェクトのgetRealPath()メソッドを介して取得できます。このメソッドにStringパラメーターセットをFile.separatorに渡して、オペレーティングシステムのファイル区切り記号(UNIXの場合は「/」、Windowsの場合は「\」)を使用してパスを取得できます。

3
Sathish

Java 7とJava 8の間にも変更があります。確かに、これは非推奨の呼び出しを伴いますが、プログラムを機能させるために「/」を追加する必要がありました。これを議論するリンクはこちら Tomcat 8でservletContext.getRealPathがnullを返すのはなぜですか?

2
user96265

私の方法:

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

    try {
        String path = request.getRealPath("/WEB-INF/conf.properties");
        Properties p = new Properties();
        p.load(new FileInputStream(path));

        String StringConexion=p.getProperty("StringConexion");
        String User=p.getProperty("User");
        String Password=p.getProperty("Password");
    }
    catch(Exception e){
        String msg = "Excepcion " + e;
    }
}
0
Julio Azocar