65

次のスニペットでは:

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

/メソッド内で何getRealPath()を表していますか? いつ使用すればよいですか?

4

4 に答える 4

126

序章

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

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

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

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

ほとんどの初心者は、実際に Web コンテンツ パス全体を渡すことができること、および彼らが頻繁に使用することを認識/認識していないようです。

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

あるいは

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

それ以外の

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

そこにファイルを書き込まないでください

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

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

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

getRealPath()慎重に使用してください。実際には、実用的なユースケースはありません。の 20 年間の Java EE の経験に基づいて、getRealPath().

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

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

ただし、代わりに次のようにします。

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

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

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

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

URL resource = servletContext.getResource(path);

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

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

于 2012-08-28T13:56:39.087 に答える
3

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

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

于 2012-08-28T13:51:23.407 に答える
-1

私の方法:

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;
    }
}
于 2018-11-06T16:13:28.333 に答える