java學習筆記:JavaWeb裏訪問資源路徑問題的學習筆記,重點:帶/與不帶/的實例測試對比

在平時進行網頁開發時,不論是點擊超鏈接還是進行請求的轉發等需要訪問資源的操作時,總會讓我有個疑問:這裏的路徑需不需要帶工程名?要不要帶斜槓? 一直都是先帶上,找不到了就去掉,反正試幾次總能成,又不影響啥。。。但今天還是好好研究一下吧:)


首先,總結出了我認爲會牽扯到這些疑問的地方,不全面的地方大家可以在評論補充或者私信一起學習交流:

1.前臺頁面上的超鏈接。
2.提交form表單 <form action="" 》 (這裏不打成書名號收尾會被解析成博客頁面的HTML標記,請忽略此處錯誤哈哈)
3.重定向 response.sendRedirect(“路徑”);
4.轉發 request.getRequestDispatcher(“路徑”).forward(request, response);

之後,經過一番查閱,我知道了幾個很重要的知識點:
1.需要訪問路徑的角色有兩個:瀏覽器和服務器。大家都知道對於網頁開發,最簡單的工作原理圖就是這樣的

在這裏插入圖片描述

自始至終其實需要問路的就是他倆,在上面提到的四個方式裏,只有第四個轉發是服務器在問路,而其餘的都是瀏覽器來問路。
2.(請帶着這一點的信息觀看下文的實例對比)瀏覽器發起的請求中的“/”表示“Tomcat/webapps”目錄下,例如我在地址欄中輸入“localhost:8080/ExamOnline”中的“/”就是表示Tomcat/webapps,調用資源的時候需要寫/ExamOnline/login.jsp,而當服務器進行資源請求時,“/”就會代表Tomcat/webapps/工程名。不論瀏覽器還是服務器訪問,不帶斜槓時都是當前路徑+我們書寫的路徑段。
3.斜槓"/“的帶與不帶只討論相對路徑而與絕對路徑無關,畢竟對於絕對路徑來說,從開頭到末尾無論是請求頭或是讀文件時的盤符,一個字都不能省的,包括斜槓。而接下來的重點就要看對於瀏覽器與服務器來說,帶了”/“與不帶”/"的相對路徑都變成了什麼。補充: 真實路徑=當前路徑+咱們手寫的路徑。

下面對於開頭的四個情況分別進行測試,多圖警告!

1.超鏈接訪問資源測試:

在這裏插入圖片描述

首先我將通過login頁面的超鏈接來訪問Top頁面,此時的路徑無斜槓,結果如下:

在這裏插入圖片描述

可以看到路徑變爲了http://localhost:8180/ExamOnline/Top.jsp,而將超鏈接的路徑前加上斜槓會變爲                      http://localhost:8180                      /Top.jsp       如下圖在這裏插入圖片描述
對比後發現不加斜槓將會是login.jsp所處的當前路徑拼接上Top.jsp變爲一個正確的訪問路徑http****/tomcat/webapps/ExamOnline/Top.jsp ,上文提到過

瀏覽器發起的請求中的“/”表示“Tomcat/webapps”目錄下,例如我在地址欄中輸入“localhost:8080/ExamOnline”中的“/”就是表示Tomcat/webapps,調用資源的時候需要寫/ExamOnline/login.jsp”

所以此時看到超鏈接/Top.jsp其實是變成了 http****/tomcat/webapps/Top.jsp 少了項目名ExamOnline,所以找不到。
2.提交表單訪問資源測試: 由於表單中action的值與Servlet或者Controller在配置文件或者註解中的值都是寫定且必須一樣的,所以這個方式沒有找到合適的能做對比看少什麼的例子。
3.重定向訪問資源測試:

現在,我將login頁面的表單提交到了LoginController中,只執行一句重定向,首先是路徑爲/login.jsp ,根據第一個測試的小字段落,猜想應該是http*****/Login.jsp,因爲/在瀏覽器這裏代表的只是Tomcat/webapps,看結果:
在這裏插入圖片描述
在這裏插入圖片描述
確實,此處少了項目名,我試着給他加上項目名:
在這裏插入圖片描述
嗯~ o( ̄▽ ̄)o,果然好了,那麼同樣我將前面的/去掉改爲直接 login.jsp,他應該是從這個個servlet的當前路徑拼接上我手寫的後半段,拼接成http:*****/controller/login.jsp,然後報錯,看看結果:在這裏插入圖片描述
在這裏插入圖片描述
是吧?這樣一來,代表瀏覽器的前三個方式就能看出來,對於相對路徑來說:

前三張瀏覽器訪問資源的結論

不帶斜槓就是當前的路徑拼接上咱們手寫的那一段,帶斜槓就是從web工程拼接一個我們寫的那一段

也就是說,當我們程序走到servlet或者controller裏時,現在去請求jsp頁面時不帶斜槓是肯定錯的,因爲jsp和你的servlet肯定不在一個目錄裏,你用servlet的當前路徑拼成放jsp的文件夾的路徑怎麼都不可能是對的。 反過來,如果你的一個hhh頁面在a文件夾裏的b文件夾裏的c文件夾中,那麼你想訪問他的時候直接/hhh.jsp那肯定是找不到了,你可不得把a/b/c帶上。


最後再討論一下服務器做轉發時路徑的變化,接着上圖

在這裏插入圖片描述

這裏只處理一句轉發,先加了斜槓,根據

服務器發起的請求中“/”表示“Tomcat/webapps/ExamOnline”的目錄,調用的時候寫/login.jsp

我們的/Login.jsp理論上將會變爲http:******/ExamOnline/Login.jsp這樣的正確路徑,我們將能成功找到該頁面,但是我們也知道,轉發時URL框不會變化,所以我們就看能不能找到吧。上圖。

在這裏插入圖片描述

是吧,路徑還是那個servlet的路徑,但是確實已經訪問到了Login頁面,那麼不加斜槓會怎麼樣呢?

在這裏插入圖片描述

看來不帶斜槓確實就只是當前路徑開拼,這倒是和瀏覽器訪問一樣的。
測試記錄就到這裏了。 上最終結論

不管是從服務器訪問資源還是瀏覽器訪問資源,不帶斜槓都是當前路勁開始拼上我們寫的路徑。而對於帶斜槓,瀏覽器訪問時/代表Tomcat/Webapps ,服務器會補充上項目名 /代表 Tomcat/Webapps/項目名。

今天的筆記就到這了,有不對的地,方希望大家可以評論或者私信指正,大家一起交流一起進步,謝謝啦。 最後中國加油,共度難關!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章