Web項目中的路徑問題
一、絕對路徑和相對路徑
絕對路徑:絕對路徑就是形如http://ip:port/web項目名/資源名
的寫法
相對路徑:任何不以http://ip:port/
開頭的寫法 都稱之為相對路徑,包括以下幾種:
-
/
開頭的寫法,形如/demo.jsp
或/img/a.jpg
-
./
開頭(等於啥也不寫),形如image/a.jpg
(這種寫法等價於./image/a.jpg
) -
../
開頭,形如../image/a.jpg
而用戶要訪問服務器中資源,要通過瀏覽器,我們在各種資源中寫的相對路徑(例如表單提交的路徑,超鏈接跳轉的路徑,請求轉發跳轉的路徑,重定向的路徑),在用戶瀏覽器的地址欄里,最終都會被轉換為絕對路徑,因為瀏覽器(客戶端)的作用,就是查找資源,這個查找到資源的路徑,就必須是絕對路徑,否則是無法定位資源的
二、相對路徑中是否以"/"開頭的區別
以下的討論建立在假設項目名(Application Context)為/test的基礎上,項目結構如圖:
1.前台路徑(html/jsp文件中的路徑)
-
路徑是以
/
開頭的:這個/
就等於瀏覽器中的http://ip:port/
也就是服務器的路徑- 例如:在a.html中有以下超鏈接
<!--假設此時瀏覽器地址欄為http://ip:port/test/a.html--> <a href="/b.html">跳轉</a>
- 點擊這個超鏈接的結果是瀏覽器地址框變為:
http://ip:port/b.html
- 此時,是找不到/test項目下的b.html資源的,瀏覽器會報404 NOT FOUND
-
路徑不以
/
開頭:此時以瀏覽器地址正在訪問的這個資源所在的目錄為基准- 例如:在a.html中有以下超鏈接
<!--假設此時瀏覽器地址欄為http://ip:port/test/a.html--> <a href="b.html">跳轉</a>
- 點擊這個超鏈接的結果是瀏覽器地址欄變為:`http://ip:port/test/b.html`
- 此時,可以找到/test項目下的b.html資源
### 2.后端路徑(Servlet)
- **后端路徑如果是以`/`開頭的,這里的`/`就等於瀏覽器中的`http://ip:port/test/`也就是項目的路徑**
- 但是后端的路徑有特殊情況
#### 2.1請求轉發跳轉
##### 2.1.1路徑以`/`開頭
**請求轉發跳轉,是服務器內部的跳轉,瀏覽器地址欄不變.**所以是后端的路徑跳轉,因此`/`還是代表`http://ip:port/test/`
例如:在DemoServlet(urlPatterns="/demo")中有以下代碼
```java
//其他代碼省略
request.getRequestDispatcher("/a.html").forward(request,response);
- 如果訪問DemoServlet,需要在瀏覽器地址欄中輸入
http://ip:port/test/demo
,然后,地址欄不變,但是顯示的頁面變成了a.html
中的內容,證明瀏覽器訪問到了a.html
這個資源 - 實際上,瀏覽器訪問的是
http://ip:port/test/a.html
但是瀏覽器地址欄還是顯示的http://ip:port/test/demo
,這是請求轉發跳轉的特點,也能證明請求轉發跳轉中/
代表項目路徑http://ip:port/test/
2.1.2路徑不以/
開頭
此時,此時以瀏覽器地址正在訪問的這個資源所在的目錄為基准
例如:在DemoServlet(urlPatterns="/demo")中有以下代碼
//其他代碼省略
request.getRequestDispatcher("a.html").forward(request,response);
- 訪問DemoServlet,需要在瀏覽器地址欄中輸入
http://ip:port/test/demo
,然后,也會訪問到a.html
這個資源 - 因為此時瀏覽器訪問/demo這個servlet,所在的目錄為
http://ip:port/test/
,所以只需在這個目錄后加上a.html,結果也就是a.html的絕對路徑,所以訪問成功
2.2重定向跳轉
2.2.1路徑以/
開頭
重定向跳轉,是瀏覽器的跳轉,瀏覽器地址改變.所以,可以認為是前台路徑的跳轉,因此,這里的/
代表服務器路徑http://ip:port/
例如:在DemoServlet(urlPatterns="/demo")中有以下代碼
//其他代碼省略
response.sendRedirect("/a.html");
- 如果訪問DemoServlet,需要在瀏覽器地址欄中輸入
http://ip:port/test/demo
,然后,地址欄改變為:http://ip:port/a.html
,此時,是訪問不到資源的,瀏覽器報404 - 因為在重定向跳轉中
/
代表http://ip:port/
2.2.2路徑不以/
開頭
此時,此時以瀏覽器地址正在訪問的這個資源所在的目錄為基准
例如:在DemoServlet(urlPatterns="/demo")中有以下代碼
//其他代碼省略
response.sendRedirect("a.html");
- 如果訪問DemoServlet,需要在瀏覽器地址欄中輸入
http://ip:port/test/demo
,然后,地址欄改變為:http://ip:port/test/a.html
,訪問到了a.html - 因為此時瀏覽器訪問/demo這個servlet,所在的目錄為
http://ip:port/test/
,所以只需在這個目錄后加上a.html,結果也就是a.html的絕對路徑,所以訪問成功