背景:
在剛開始學習javaweb,使用servlet和jsp開發web項目的過程中,一直有一個問題困擾着我:servlet 和 jsp 之間相互跳轉,跳轉的路徑應該如何書寫,才能正確的訪問到相應的servlet或jsp文件?后來,在課堂上,經過老師的講解,再加上自己的一些思考和實驗,終於對web項目中文件中路徑的訪問有了一些了解。
注:以下只是我個人在測試中的一些理解,內容並不全面。
案例准備:
為了更好的解釋web項目中的路徑問題,我准備了一個簡單的web項目,項目的結構如下圖:
上圖結構只需要關注紅框圈起來的部分,第一個紅色框圈起來的是servlet文件;而我們知道,在eclipse的動態web項目中,html 和 jsp等文件都是在WebContent這個文件夾下的,我在WebContent文件夾下創建了一個叫做VIEW文件夾,里面放了兩個前端頁面,這就是上圖的第二個紅框;在WebContent文件夾下也直接放置兩個前端頁面,這就是上圖的第三個紅框。
訪問路徑的分類:
1、相對路徑:
相對路徑的概念這里就不解釋了,直接來談一談在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的上一級,使用相對路徑就難以實現了,因為路徑的前綴已經定死了。這時,我們只能使用絕對路徑來訪問。
2、絕對路徑
絕對路徑的使用方式就是在路徑的開始加上“/”,若在路徑開始處加上了一個“/”,那相對路徑前綴就會被“清零”,路徑從最初位置開始。
那么,絕對路徑的最初位置路徑是什么呢?就是服務器的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。運行結果如下:
總結:
1、絕對路徑就是在路徑開頭加“/”,那路徑的起始就是服務器IP地址;
2、而相對路徑就是開頭不加“/”,而起始就是發起跳轉的文件的所在路徑;