Web項目中的路徑問題


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的絕對路徑,所以訪問成功


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM