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