背景:
html
在剛開始學習javaweb,使用servlet和jsp開發web項目的過程當中,一直有一個問題困擾着我:servlet 和 jsp 之間相互跳轉,跳轉的路徑應該如何書寫,才能正確的訪問到相應的servlet或jsp文件?後來,在課堂上,通過老師的講解,再加上本身的一些思考和實驗,終於對web項目中文件中路徑的訪問有了一些瞭解。
前端
注:如下只是我我的在測試中的一些理解,內容並不全面。java
案例準備:web
爲了更好的解釋web項目中的路徑問題,我準備了一個簡單的web項目,項目的結構以下圖:瀏覽器
上圖結構只須要關注紅框圈起來的部分,第一個紅色框圈起來的是servlet文件;而咱們知道,在eclipse的動態web項目中,html 和 jsp等文件都是在WebContent這個文件夾下的,我在WebContent文件夾下建立了一個叫作VIEW文件夾,裏面放了兩個前端頁面,這就是上圖的第二個紅框;在WebContent文件夾下也直接放置兩個前端頁面,這就是上圖的第三個紅框。 服務器
訪問路徑的分類:eclipse
一、相對路徑:jsp
相對路徑的概念這裏就不解釋了,直接來談一談在web項目中的相對路徑是什麼樣以及如何使用的吧。
學習
在web項目中,若咱們在訪問路徑的最前端不加上「/」,那就是使用相對路徑,以下圖所示:
測試
上圖中是一個html頁面,它就是項目中WebContent下的login2.html。這個html中寫了一個form表單,表單的提交路徑action叫UserController,他就是項目中第一個紅框裏的UserControllerServlet,點擊提交後,表單數據將會提交到這個servlet當中。UserController前沒有加「/」,因此使用的就是相對路徑。那這個相對路徑是相對於誰呢?就是相對於當前的這個html所在的文件夾。
首先咱們明確一點,在eclipse的web項目中,前端頁面(html,jsp......)的默認起始路徑就是WebContent,而java文件的起始路徑就是src。假設咱們要訪問我這個項目中的login2.html,那路徑以下圖:
能夠看到,訪問路徑是不須要加上WebContent的。同理,如果想要訪問servlet這種src下的Java文件,也是直接「IP地址/項目名/servlet」,不須要寫上包名。
而相對路徑相對的就是當前文件所在的路徑的前綴,也就是上圖中的http://localhost:8080/Jsp_Lab2/,也就是說,上面的form表單提交數據到UserController這個servlet,那提交路徑實際上就是將UserController這個字符串與當前路徑的前綴拼接起來,也就是成了http://localhost:8080/Jsp_Lab2/UserController,而這正是我項目中的UserControllerServlet這個servlet的路徑。經過瀏覽器頂端的url顯示能夠獲得驗證:
再好比,在WebContent下有一個VIEW文件夾,裏面也有一個login.html文件,它的代碼以及路徑以下所示:
由於WebContent是初始地址,因此要訪問WebContent裏面的子文件夾裏面的文件,就須要加上子文件夾的名稱,就如上面的VIEW文件夾。而這時,若在此login.html頁面使用相對路徑,那相對的就是http://localhost:8080/Jsp_Lab2/VIEW。
能夠看到,上圖的表單中,action依然爲UserController,因此表單被提交後,提交的路徑就是將UserController與相對路徑拼接,也就是http://localhost:8080/Jsp_Lab2/VIEW/UserController,數據將被髮送到這個地址。以下圖:
能夠看到,瀏覽器中的路徑確實如此,而且產生了404錯誤。這是由於在這個路徑是錯誤的,在這個路徑下並無這個文件的存在。由於上圖的login.html在WebContent中的VIEW文件夾下,因此使用相對路徑,那最後的路徑中也必定有VIEW的存在。
而UserController的路徑其實是http://localhost:8080/Jsp_Lab2/UserController。這時,咱們想要訪問的servlet是在/VIEW/login.html的上一級,使用相對路徑就難以實現了,由於路徑的前綴已經定死了。這時,咱們只能使用絕對路徑來訪問。
二、絕對路徑
絕對路徑的使用方式就是在路徑的開始加上「/」,若在路徑開始處加上了一個「/」,那相對路徑前綴就會被「清零」,路徑從最初位置開始。
那麼,絕對路徑的最初位置路徑是什麼呢?就是服務器的IP地址+端口號,好比在本機訪問,那就是http://localhost:8080。也就是說使用絕對地址,那訪問所寫的路徑將會被拼接到http://localhost:8080以後。
使用以前報404的例子來演示,在UserController前加一個‘/’表示表單提交使用絕對路徑。以下圖所示:
運行以後的路徑如圖所示:
提交表單後,跳轉到的頁面以下所示:
能夠看到,UserController確實被直接拼接到了服務器IP地址以後,也就證實了絕對路徑的起點就是服務器的IP地址。
那如今咱們來解決一下相對路徑的最後一個案例:VIEW當中的頁面使用相對來說沒法跳轉到位於src下的servlet中去。
由於咱們知道,src下的UserController這個servlet的訪問路徑是http://localhost:8080/Jsp_Lab2/UserController,在IP地址後還有一個項目名Jsp_Lab2,因此咱們能夠將form表單的action改爲下圖中的樣子:
首先以「/」開頭,表示相對路徑,再加上項目名,再加上servlet的 url 映射,最後就拼接成了完整的url。運行結果以下:
總結:
一、絕對路徑就是在路徑開頭加「/」,那路徑的起始就是服務器IP地址;
二、而相對路徑就是開頭不加「/」,而起始就是發起跳轉的文件的所在路徑;