JSPで仮想パスを処理する


要約は、サーバーのコンポーネントをプログラミングする際に、ウェブのルートに対するパスからファイルの真のパスを取得する可能性が高いですが、このファイルは実際にサイトの仮想パス上にあります。仮想パスは何ですか?一つのウェブサーバでは、仮想パスは物理的に分離された各ファイルを組み合わせて、同じサイトパス上に置いて、アプリケーションサーバ上で、それぞれのアプリケーションは自分の仮想パス上に位置していますが、実際には互いに完璧に分離されています。get RealPath()方法JSP servlet APIは、getRealPath(path)方法を提供し、与えられた仮想パスの真のパスを返す。もし変換が間違っていれば、nullに戻る。getRealPath文法定義:public java.lang.String get RealPath(java.lang.String) パスを含む文字列を返します。例えば、仮想パス "/index.html「サーバーファイルシステム上でどのような真実のルートがあっても、使用」/index.html「それを見つけることができます。戻ってきた真の経路は、servlet容器に近いものを使用している。 container)があるコンピュータまたはオペレーティングシステムのフォーマットには、適切なパス区切りが含まれています。servlet容器が変換できない場合、この方法はnullに戻ります。パラメータ:  パス -仮想パスを記述する文字列の戻り値:  実際のパスを記述する文字列またはnullは、残念ながら、getRealPathは、サーバまたはjspファイルがこの方法を呼び出す経路位置によって異なるものを返します。exampleサイトは、私たちのサイト組織が以下の通りであると仮定します。ルートには私たちのサイトのルートが含まれています。 http://address/a_virtualディレクトリには、我がサイトが提供する仮想パスのファイルが含まれています。例えば、http://addess/virtual_dir/私たちはfile 1.txtとfile 2.txtの真実なパスを探しています。それらは1つのサイトのルートパスの下で、1つは仮想パスの下にあります。getRealPath("/file 1.txt") 「C:\site\site_」に戻るべきです。root\file 1.txt「getRealPath()/virtual_dir/file 2.txt")は帰ってきます。C:\site\a_virtual\file 2.txt"getRealPath("/file 3.txt")はnullに戻るべきです。このファイルは存在しません。しかし、getRealPath()はいつも同じ結果を返していません。これはあなたが使うjsエンジンにも依存します。JSPエンジンTomcat 3.1 Tomcatが返した結果、アプリケーションの独立性があります。 dependent):getRealPathメソッドを呼び出したjspファイルとの位置によって異なります。実は、page 1.jspになります。 (サイトのルートに位置します。file 1.txtとfile 2.txtに対してtxtget RealPathを呼び出します。 正しい結果を返します。これはtomcatです 3.1, 3.0版はfile 2.txtに対してエラーのパスを返しますが、Page 2.jsp(別のアプリケーションに位置しています。一つの仮想パスで)がgetRealPathを呼び出すと、エラーのパスを返します。jspファイルのある経路と要求の仮想パスが接続されています。例えば、Page 2.jspからgetRealPath(/file 1.txt)を呼び出したら戻ります。 C:\site\a_virtual\file 1.txt。この挙動は実際には異なる応用を相互に独立させる典型的な処理方法である。JRun 2.3.3とINPRISE APPLICATION SERVER 4.0 (IAS)JRunとIASはfile 1.txtとfile 2.txtに対して正しい結果を返します。しかし、これらのエンジンには共通の行動があります。 getRealPathが存在しないファイルを処理すると、それらはnullに戻りません。解決の道はgetRealPathがいつも一つの道に戻ってきます。私達はどうやってそれが正しいか分かりますか?最も簡単な方法は、この帰り道が存在するかどうかを確認することである。これはisVirtual方法である。与えられたファイルに対してgetRealPathを呼び出した後、java.ioを使ってこのファイルにアクセスしたので、それが存在するかどうかを知ることができる。 isVirtual* Check if the パス name is a. virtual or not.** @パラム pathName The name 保存先 the パス ト check.*/prvate bollan isVirtual(String) pathName) { // Check if it is a. virtual パス if (m_appication.get RealPath!=null {  java.io.File virtual File = new java.io.File(m_appication.getRealPath(pathName);  if (virtual File.exists() {return true;  else {return false; } else {return false;}