1. 程式人生 > >Servlet轉發與重定向的資源路徑問題解析

Servlet轉發與重定向的資源路徑問題解析

一. 問題引入  

     轉發和重定向可以說是Servlet中最重要的知識點也不為過,因為它決定著整個向Servlet體系中,執行流程的問題。

     轉發:

        request.getRequestDispatcher("/index.jsp").forward(request, response);

      重定向:

        response.sendRedirect("index.jsp");

     相信上面兩句話大家應該是再熟悉不過了,以我的習慣Servlet轉發時寫絕對路徑,也就是轉發地址用“/”開頭;而重定向時通常使用的是相對路徑,也就是不以“/" 開頭。那Servlet中的絕對路徑和相對路徑具體是什麼,那我們就一起來研究一下。

 

二. 電腦的絕對/相對路徑

 

  如何理解絕對路徑與相對路徑

    在Windows中,以碟符開頭的稱為絕對路徑,見下圖:

    那相對路徑是什麼呢?

    在Linux系統中有一個工作目錄的概念,所謂的工作目錄就是當前使用者所在的目錄,那麼在這裡也暫且將所在目錄稱為工作目錄。相對目錄就是以當前所在目錄開始計算路徑值。

    舉個栗子:

    如果使用者當前這在 E:\ A目錄下,那麼此時 “B \ index.html”這個相對目錄表示的絕對路徑就是 “E:\ A \ B \ index.html”。

 

  相對路徑中的常用用法

    在使用相對路徑時如果想進入下一級目錄可能大家清楚的很,直接在後面加斜槓然後寫上目錄或檔名即可。那如果我們必須進入上一級目錄呢,首先明確我們在什麼需求下需要進入上一級目錄:

      1. 獲取上級目錄中的檔案

      2. 進入當前目錄的同級目錄

    那在相對路徑的寫法中,如何進入上級目錄呢?

    兩個點代表上級目錄。例如: 我們想進入當前目錄的同級目錄haha,我們可以這樣表示“../haha”

    扯得有點遠了,現在我們回到正題,來講一講Servlet中轉發和重定向時相對路徑與絕對路徑的使用。

 

三. 轉發和重定向時的相對路徑與絕對路徑

   

   1. 絕對路徑

     首先需要明確Servlet中的絕對路徑到底是什麼,在Servlet中轉發時所代表的的絕對路徑實際上就是該專案的根路徑。例如:http://localhost:8080/TestWeb/。

     你以為重定向時的絕對路徑初始值也是當前專案根路徑嗎?Servlet在重定向時所代表的的絕對路徑是當前Tomcat容器所在的根路徑(也就是webapps)。例如:http://localhost:8080/  ,說白了就是重定向時絕對路徑的初始值是沒有專案名稱的。

   我們現在就來看一下重定向的絕對路徑的效果。

    Servlet程式碼:

  訪問時的URL:

  回車後:

這樣就會導致找不到我們專案中的index.jsp頁面

   解決方案:

     1. 將路徑寫成相對路徑

     2. 在絕對路徑前面加上專案名

    絕對路徑總結:在轉發時絕對路徑的初始值是帶有專案名的,而在重定向時絕對路徑的初始值是不帶有專案名的。

 

2. 相對路徑

     說完絕對路徑我們再來說一說相對路徑,在絕對路徑中重定向與轉發有一定的區別,而在使用相對路徑中轉發與重定向沒有任何區別,它們都是相對於當前所在目錄來進行訪問的(這句話如果看不懂就自行略過吧:這裡的目錄既代表WebRoot下面的真實目錄,也代表Servlet配置<url-pattern>的邏輯目錄。)既然重定向和轉發在使用相對路徑是的目錄起算點是相同的,那麼我們就以重定向來進行演示。

     訪問時的URL:

      回車後的URL:

 

總結

     在Servlet中使用絕對路徑進行轉發和重定向,他們的路徑起算點是不相同的,轉發時以專案名稱作為起算點,重定向時以埠號作為起算點。而如果使用相對路徑進行重定向或轉發,他們都是以當前所在路徑作為起算點。