次のスニペットで:
ServletContext context = request.getServletContext();
String path = context.getRealPath("/");
メソッドgetRealPath()
の/
は何を表しますか?いつ使用すべきですか?
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年の経験に基づいて、alwaysはgetRealPath()
よりもはるかに優れており、より移植性の高い別の方法があります。
実際に必要なのがWebリソースのInputStream
を取得することだけである場合は、代わりに ServletContext#getResourceAsStream()
を使用してください。これは、WARの展開方法に関係なく機能します。したがって、たとえばindex.jsp
のInputStream
が必要な場合、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);
または、アップロードしたファイルを保存する場合、または一時ファイルを作成する場合は、以下の「参照」リンクを参照してください。
Webアプリケーションのコンテキストパスは、WebアプリケーションのWEB-INFディレクトリを含むディレクトリです。これは、Webアプリの「ホーム」と考えることができます。多くの場合、Webアプリケーションを作成するとき、ファイルシステムでこのディレクトリの実際の場所を取得することが重要になる場合があります。これにより、ファイルからの読み取りやファイルへの書き込みなどを実行できるからです。
この場所は、ServletContextオブジェクトのgetRealPath()メソッドを介して取得できます。このメソッドにStringパラメーターセットをFile.separatorに渡して、オペレーティングシステムのファイル区切り記号(UNIXの場合は「/」、Windowsの場合は「\」)を使用してパスを取得できます。
Java 7とJava 8の間にも変更があります。確かに、これは非推奨の呼び出しを伴いますが、プログラムを機能させるために「/」を追加する必要がありました。これを議論するリンクはこちら Tomcat 8でservletContext.getRealPathがnullを返すのはなぜですか?
私の方法:
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;
}
}