虛擬路徑

虛擬路徑,是計算機中檔案的物理路徑。

概念

當使用Dreamweaver將檔案上傳到遠程服務器後,這些檔案駐留在伺服器本地目錄樹中的某一個資料夾中。例如,在運行MicrosoftIIS的伺服器上,主頁的路徑可能如下所示:

c:\Inetpub\wwwroot\accounts\users\jsmith\index2.htm
此路徑通常稱為檔案的物理路徑。

但是,用來打開檔案的URL並不使用物理路徑。它使用伺服器名稱或域名,後接虛擬路徑。

在為伺服器端組件編程時,你很可能要從相對於web根的路徑來取得某個檔案的真實路徑,但此檔案實際上在站點的一個虛擬路徑上。

方法

JSPservletAPI提供了getRealPath(path)方法,返回給定虛擬路徑的真實路徑,如果轉換錯誤,則返回null。

getRealPath語法定義:
 publicjava.lang.StringgetRealPath(java.lang.Stringpath)
 返回一個字元串,包含一個給定虛擬路徑的真實路徑。例如,虛擬路徑"/index.html"
不管在伺服器檔案系統上具有怎樣的真實路徑,使用"/index.html"總可以找到它。返回的真實路徑使用了相近於servlet容器(srvletcontainer)所在計算機或作業系統的格式,包含了適當的路徑分隔設定。如果servlet容器無法轉換則這個方法將返回null。

參數

path-一個描述了虛擬路徑的字元串
 返回值:
描述真實路徑的字元串或者null

遺憾的是,getRealPath常常返回不同的東西,這取決於伺服器或jsp檔案調用此方法的路徑位置。

一個example站點

假設我們的站點組織如下:

根路徑包含了我們的站點的根:http://address/
a_virtual目錄包含了我們站點提供的虛擬路徑的檔案,例如:
http://addess/virtual_dir/

我們查找file1.txt和file2.txt的真實路徑,它們一個在站點根路徑下,一個在虛擬路徑下。

getRealPath("/file1.txt")應該返回“C:sitesite_rootfile1.txt",
getRealPath("/virtual_dir/file2.txt")應該返回"C:sitea_virtualfile2.txt"
getRealPath("/file3.txt")應該返回null,因為這個檔案不存在。

但getRealPath()並不總是返回同樣的結果,這還取決與你使用的js引擎。

引擎

Tomcat3.1
Tomcat返回的結果具有套用的獨立性(applicationdependant):

它取決與調用getRealPath方法的那個jsp檔案所在的位置。
實際上,當page1.jsp(位於站點根處)對file1.txt和file2.txt調用txtgetRealPath(),它返回正確的結果。(這是在tomcat3.1,3.0版則對file2.txt返回錯誤的路徑)

但是當page2.jsp(位於另一個套用,在一個虛擬路徑中)調用getRealPath,它返回了錯誤的路徑:它連線了該jsp檔案所在的路徑和請求的虛擬路徑。
例如,從page2.jsp中調用getRealPath(/file1.txt)將返回C:sitea_virtualfile1.txt。

這一行為其實是使不同的套用相互獨立的典型的處理方法。

JRun2.3.3和INPRISEAPPLICATIONSERVER4.0(IAS)
JRun和IAS對file1.txt和file2.txt都返回正確的結果。

然而所有這些引擎有一個共同的行為:當getRealPath處理不存在的檔案時,它們都不返回null!

解決之道

既然getRealPath總是返回一個路徑,我們怎么知道它是否正確呢?最簡單的方法是檢查這個返回的路徑是否存在。
這就是isVirtual方法要做的:在對一個給定的檔案調用getRealPath以後,它使用了java.io
存取這個檔案,於是就可以知道它是否存在。

相關詞條

相關搜尋

熱門詞條

聯絡我們