1.基本概念的了解
絕對路徑:絕對路徑就是你的首頁上的檔案或目錄在硬碟上真正的路徑,(URL和實體路徑)例如:C:/xyz/test.txt 代表了test.txt檔案的絕對路徑。http://www.baidu.com/index.html也代表了一個URL絕對路徑。絕對路徑,是指根據給出的通路路徑可以準确定位到資源的路徑。例如,你要告訴對方你現在的位置,你說:我現在在北京故宮遊客 A 入口處。這就是個絕對位址,聽者根據你所述位址,可以準确的找到你。而對于計算機中 Web 應用的絕對路徑,則是指帶通路協定的路徑。例如下面的路徑就是一個帶有 http 通路協定的絕對路徑。http://127.0.0.1:8080/primary/index.jsp
相對路徑:相對與某個基準目錄的路徑。包含Web的相對路徑(HTML中的相對目錄),例如:在Servlet中,"/"代表Web應用的跟目錄。和實體路徑的相對表示。例如:"./" 代表目前目錄,"../"代表上級目錄。這種類似的表示,也是屬于相對路徑。相對路徑,是指僅根據通路路徑無法準确定位資源的路徑。相對路徑必須要結合其參照路徑才可組成可以準确定位資源的絕對路徑。參照路徑的不同,所形成的可以準确定位資源的絕對路徑也是不同的。在進行資源通路時,必須要将相對路徑轉換為絕對路徑才可完成資源的準确定位。例如,你要告訴對方你現在的位置,你說:我在人民公園的正門門口。這就是個相對位址。因為很多城市都有人民公園,每個人民公園也都有正門。當對方不知道你在哪個城市時,他是無法準确定位你的。當然,你隻是以不說是哪個城市,是因為這裡存在一個預設的參照路徑:與聽者在同一個城市。聽者會将你所說的相對位址,自動轉換為一個絕對位址:與聽者在同一城市的人民公園正門門口。在 Web 應用中,相對路徑的寫法有兩種:一種是以斜杠開頭的相對路徑,一種是不以斜杠開頭的相對路徑。根據相對路徑是否以斜杠開頭,且出現的檔案所處位置的不同,其預設的參照路徑是不同的。這也是相對路徑容易出錯的地方:确定參照路徑。
下面這兩種就分别是不以斜杆開頭的和以斜杆開頭的相對路徑:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CXwUleNdXTq50MNpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2LcRHelR3LcJzLctmch1mclRXY39TM0YDNwIjMxIDOwkDM4EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
對于浏覽器請求的送出方式,可以有表單送出、超連結送出、Ajax 送出等。與位址欄送出不同的時,這些送出方式均需要将請求寫在頁面檔案中。下面以超連結送出方式來講解有關路徑問題。
2.通路路徑與資源名稱
通常的 URL 由資源通路路徑由兩部分構成:通路路徑與資源名稱。資源名稱指的是要通路資源的直接名稱,如 show.jsp,或與要通路資源存在映射關系的間接名稱,如 show.do。而通路路徑,則是通過該路徑則可以定位到指定的資源,即在 URL 資源通路路徑中除了資源名稱以外的其它部分。
一般情況下,在 URL 通路路徑中,最後一部分為資源名稱,而其它部分則為通路路徑。
3.詳細的解釋
相對路徑又分為以斜杆開頭的路徑和不以斜杆開頭的路徑,根據路徑所在檔案所處位置的不同,分為兩種:前台路徑與背景路徑。
A、 前台路徑
所謂前台路徑是指,由浏覽器解析執行的代碼中所包含的路徑。例如,html、css、js中的路徑,及 jsp 中靜态部分的路徑。像 html 及 jsp 中的靜态部分中的<img src=" "/>、<a href=" " target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" ></a>、<form action=" "></form>等;像 css 中的 background:img("")等;像 js 中的window.location.href=" " target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" 等,都屬于前台路徑。前台路徑的參照路徑是 Web 伺服器的根路徑,即 http://127.0.0.1:8080/
B、 背景路徑
所謂背景路徑是指,由伺服器解析執行的代碼及檔案中所包含的路徑。例如,java 代碼中的路徑、jsp 檔案動态部分(java 代碼塊)中的路徑、xml 檔案中的路徑(xml 檔案是要被java 代碼加載入記憶體,并由 java 代碼解析的)等。背景路徑的參照路徑是 Web 應用的根路徑。如 http://127.0.0.1:8080/primary/ primary是Web應用的項目名。
C、 背景路徑特例
對于背景路徑的參照路徑有一個特例:當代碼中使用 response 的 sendRedirect()方法進行重定向時,其參照路徑不是 web 應用的根路徑,而是 web 伺服器的根路徑。例如,執行 response.sendRedirect(“/show.jsp”);将會報 404 錯誤。因為其參照路徑是Tomcat 的根,而非目前項目的根。是以若要使用重定向,要麼寫為無斜杠的相對路徑(參照的是目前資源的通路路徑):response.sendRedirect(“show.jsp”);要麼寫在路徑上添加上項目名稱:response.sendRedirect(request.getContextPath + “/show.jsp”);
D、不以斜杠開頭的相對路徑
不以斜杠開頭的相對路徑,無論是前台路徑,還是背景路徑,其參照路徑都是目前資源的通路路徑,而不是目前資源的儲存路徑。
4、問題示範
項目名:accessPath。隻需要在 index.jsp 頁面中添加一個超連結。
通過 index.jsp 頁面的超連結,可以完成對/WEB-INF/jsp/welcome.jsp 頁面的正确通路。但問題也就出現了:為什麼在 springmvc.xml 中注冊處理器時其 id 屬性值是以斜杠開頭,而 index.jsp 頁面中的連結卻沒有以斜杠開頭呢?
若在 index.jsp 的超連結前添加上斜杠,在通路時會報 404 錯誤,找不到相應資源。
那這是為什麼呢?這裡面就涉及到通路路徑問題了。
5、相關現象解析
(1) 為什麼頁面超連結的 herf 屬性值加上斜杠會報錯
A、 原因分析
為什麼在 springmvc.xml 中注冊處理器時其 id屬性值是以斜杠開頭,而 index.jsp 頁面中的超連結的 herf 屬性值加上斜杠後會報錯?
springmvc.xml 中注冊處理器的<bean/>标簽的 id 屬性中加上斜杠的路徑,是背景路徑,其參照路徑是目前 Web 應用的根:http://127.0.0.1:8080/accessPath/。即指出目前注冊的處理器 IndexController的資源通路絕對路徑是:http://127.0.0.1:8080/accessPath/hello.do。
index.jsp 頁面中的加上斜杠的路徑,是前台路徑,其參照路徑是目前 Web 伺服器的根:http://127.0.0.1:8080/。即其送出的通路絕對路徑是:http://127.0.0.1:8080/hello.do。這個絕對路徑當然是無法通路到處理器 IndexController 的。hello.do 這個資源在 Web 伺服器的根下當然也是不存在的,是以會報 404 錯誤。
B、 解決辦法
若還想加上斜杠,還不想出錯,則解決為法就是手工為 href 屬性值的相對路徑上添加項目名稱。
但這樣做不好的是,若在項目釋出時項目名稱發生了改變,則必須将每一個請求的路徑進行改變。是以,可以通過 EL 表達式${pageContext.request.contextPath}動态的擷取到項目名稱。
(2) 為什麼跳轉回 index 頁面後位址欄會多出一個 test
A、 問題重制
項目:accessPath2。在項目 accessPath 基礎上修改。
a、 修改 springmvc 配置檔案
為了建構發生這種異常的場景,在注冊處理器時,為該<bean/>的 id 屬性中添加上一個/test,表示子產品資訊。即表示的意義為,若要通路 IndexController 這個處理器,則需要送出http://127.0.0.1:8080/accessPath2/test/hello.do 請求。
b、 修改 index 頁面
修改 index 頁面,讓 index 頁面的超連結 href 屬性采用無斜杠的路徑。将這個超連結請求暫且當作是一個表單的送出請求。
c、 修改處理器
修改 IndexController 中 ModelAndView 中指定要跳轉的頁面為/index.jsp,表示重新傳回index 頁面,用于模拟當表單資料填寫錯誤後重新傳回表單頁面的場景。
項目釋出運作後,在 index 頁面中點選連結,可以正常傳回 index 頁面。但若此時再次點選這個連結,會抛出 404 異常。然後卻發現位址欄多出了一個 test。
B、 原因分析
為什麼會多出一個/test 呢?因為超連結的 herf 屬性值為無斜杠的相對路徑,是以其參
照路徑為目前的通路路徑。在第一次送出時的“目前通路路徑”為
http://127.0.0.1:8080/accessPath2/ , 所 以 相 對 于 它 的 訪 問 路 徑 即 為
http://127.0.0.1:8080/accessPath2/test/login.do。在此通路路徑下再次點選超級連結後,此時
的“目前通路路徑”已經發生變化,變為了 http://127.0.0.1:8080/accessPath2/test/。其所訪
問路徑就變為了 http://127.0.0.1:8080/accessPath2/test/test/login.do,而這個資源是沒有定
義的,是以會報 404 錯誤。
C、 解決辦法
a、 使用斜杠開頭的請求路徑
b、 不使用斜杠開頭的請求路徑
若不使用斜杠開頭的請求,則需要使用 JSP 的<base/>标簽。頁面中的<base/>标簽,會在目前頁面的資源請求路徑前自動加上<base/>标簽所代表的路徑,将相對路徑變為帶通路協定的絕對路徑。該方式實際上是修改了不帶斜杠的相對路徑的參照路徑,将由原來的目前通路路徑作為參照路徑,改為了以 basePath 為參照路徑。是以這種方式要求頁面中的請求不能以斜杠開頭
6.總結
看望這篇部落格相信大家對JavaWeb中的相對路徑和絕對路徑有了一個更加深刻的了解和認識,如果大家發現了錯誤請及時指正我哦,謝謝大家支援!歡迎大家轉載,轉載請标明文章出處!