雖然在web開發的過程中經常使用相對路徑,但是一直沒有怎麼對相對路徑做一個系統的理解,記得在剛開始用tomcat的時候就一直理解不了以斜杠開頭的相對路徑和沒有斜杠的相對路徑之間的差別,儘管用的時候都能夠用正確。最近看JSTL in Action,才總算有了一個清楚的認識。
1.什麼是絕對路徑
絕對路徑是與相對路徑相對立的,通常一個完整的URL包括兩個部分:
● scheme:尋找資料的所採用的機制,就是我們常說的協議,如http、ftp等等;
● 用來描述到哪兒去尋找資料的資訊
上面兩部分是分號分隔的,如http://java.sun.com就是一個絕對路徑,它表明了這
樣一個含義:使用http協議從一個名字為java.sun.com的web服務上擷取資訊。絕對路徑無論出現在哪兒都指代相同的內容,一個url如果包含scheme和伺服器那麼它就是絕對路徑。
2.相對路徑
有時候我們並不想總是寫出完整的路徑,就可以使用相對路徑,而且使用相對路徑也方便我們項目的整體移植。同絕對路徑不同,在不同的地方,相對路徑所指代的內容可能是不同的。為了更好的理解相對路徑,我們可以想象一下平常我們是如何使用電話號碼的。
以在中國為例,一個完整的號碼是區號+號碼,這就像是我們的絕對路徑一樣。比如說0755-88888888,如果我現在在深圳,那麼只需直接撥88888888即可,而如果我現在在武漢,那麼我就要撥0755-88888888,更變態一點,我現在在國外,那麼就需要撥86-0755-88888888了。還有很多企業裡面,員工之間通話只需撥後4位分機號就可以了,這些都是使用了類似於相對路徑的原理。
相對路徑可以分為兩類:page-relative與context-relative。
所謂page-relative相對路徑就是指那些不是已斜杠開頭的相對路徑。如cindy.html、pinkskirt.img都屬於page-relative相對路徑,它們只是簡單的指明了一個檔案名稱或者部分檔案路徑。假設上述相對路徑都出現在cmtobby.jsp這個頁面中,那麼伺服器在解析這些個相對路徑的時候,就會從cmtobby.jsp所在的目錄開始進行尋找。比如cindy.html,那麼伺服器會在cmtobby.jsp所在的目錄下面尋找cindy.html這個檔案。page-relative相對路徑在html標籤和JSTL中標籤中的工作原理是相同的。
所謂context-relative路徑就是指那些已斜杠開頭的相對路徑,實際上,這種說法是不準確的。在HTML標籤和JSTL標籤中,以斜杠開頭的相對路徑所起的作用是不同的,在JSTL中以斜杠開頭的相對路徑才稱為context-relative,而在純粹的html標籤中,以斜杠開頭的相對路徑應該叫做server-relative。怎麼理解呢?在JSTL中,以斜杠開頭就表示從當前應用內容相關的根目錄下開始尋找所學資源,而在html中,以斜杠開頭則表示從整個web伺服器的根目錄下開始尋找,如在tomcat中,就表示從webapps目錄下開始進行尋找。時間上在很多架構中使用的都是context-relative相對路徑,比如說在Struts2標籤中,那麼以斜杠開頭的相對路徑都是指context-relative相對路徑。