轉發、重定向和 Servlet 的路徑問題
參考博客
https://blog.csdn.net/m0_46132054/article/details/115255971
https://wenku.baidu.com/view/9af2e9025bfb770bf78a6529647d27284b7337b3.html
https://blog.csdn.net/qq_38296051/article/details/84953356
https://www.cnblogs.com/hi3254014978/p/11610997.html
https://www.cnblogs.com/xuchenyang/p/15998277.html
https://blog.csdn.net/u011975349/article/details/110857481
絕對路徑 VS 相對路徑
轉發和重定向的 url 前有加 / 為絕對路徑,反之為相對路徑(就是 url 前面沒有 /),
精髓:開發程序中建議使用絕對路徑,
絕對路徑【推薦使用】
前端 HTML
-
在 HTML 中絕對路徑 " / " 表示的也是到達 Tomcat 的 webapps,不包括當前專案路徑,
-
只要是 HTML 前端的 " / " 到達的都是:
http://localhost:8080/
前端:
- form 表單:<form action="/"></form>
- script 標簽的 src 屬性:<script type="text/javascript" src="https://www.cnblogs.com/"></script>
- a 標簽:<a href="https://www.cnblogs.com/">跳轉</a>
- link:<link rel="stylesheet" type="text/css" href="https://www.cnblogs.com/">
- location.href:<script type="text/javascript"> window.location.href = "https://www.cnblogs.com/"; </script>
以上的 " / " 都表示:http://localhost:8080/
重定向
重定向的 / 表示:http://服務器ip:埠/(對應 Tomcat 的
目錄)
// 重定向的地址為:http://localhost:8080/project/index.html
response.sendRedirect("/project/index.html");
- 指定其他 Web 容器
// 回應重定向的引數可以指定其他 Web 容器
response.sendRedirect("http://www.baidu.com"); // 完整的 URL 路徑
注意:上面的引數必須是完整的 URL 路徑,否則就會按相對路徑處理,
請求轉發
請求轉發的 / 表示:http://服務器ip:埠/專案名/(對應 maven 下的
目錄)
// 請求轉發的地址為:http://localhost:8080/project/index.html
request.getRequestDispatcher("/index.html").forward(req, resp);
為什么請求轉發的 / 表示:http://服務器ip:埠/專案名/?
答:因為轉發是在服務器內部進行的,寫絕對路徑 / 開頭指的是當前的 Web 應用程式,
總結
怎么記憶呢?
從需求的角度記憶:
- 在可以跨域的地方 "/" 表示的是到達 http://localhost:8080/;不能跨域的地方則表示到達 http://localhost:8080/projectName/
從理解的角度記憶:
- 很簡單,重定向是瀏覽器發來的,只知道發到某個服務器,但是不知道發到服務器的哪個 project,所以需要自己用代碼宣告,
- 而請求轉發是服務器某個 project 內部的轉發,轉來轉去都是在某個 project 內部,所以不需要手動宣告專案名,
Servlet
Servlet 中,所有路徑的配置都要用絕對路徑,
那什么是絕對路徑呢?就是以 “/” 開頭的路徑(開發中就這樣理解),
Servlet 中 "/" 表示:http://localhost:8080/projectName/
web.xml 中使用 “ / ”,給 Servlet 指定 url-pattern 是為 Servlet 指定通過什么路徑能夠訪問到當前的 Servlet,
- 比如我們設定 “ /test ”,那其實我們需要通過
http://localhost:8080/projectName(專案名)/test才能夠訪問到 Servlet, - 所以這里的" / "表示的是:
http://localhost:8080/projectName(專案名)/, - " / "可以理解為是一個縮寫,
為什么 Servlet 的 "/" 表示:http://localhost:8080/projectName/ ?
答:因為 Servlet 是后臺(服務器內部)代碼,只針對某個應用有效,因此范圍設定為當前專案就非常合適,
區分記憶??:
- 前端和重定向:http://localhost:8080/
- Servlet 和 請求轉發:http://localhost:8080/專案名/
相對路徑
在相對路徑的情況下,請求轉發和重定向生成的路徑相同,
結論:使用相對路徑,其結果完整路徑都變為 ==> http://localhost:8080/專案名/自己寫的資源
// 重定向:
response.sendRedirect("index.html");
// 生成相對路徑:http://localhsot:8080/專案名/index.html
// 請求轉發:
request.getRequestDispatcher("index.html").forward(req, resp);
// 相對路徑情況下,生成的完整 URL 與重定向方法相同,也為:
// http://localhsot:8080/專案名/index.html
通過表單請求指定的 url 資源:action="LoginServlet", 則表單生成的請求地址為:
http://localhost:8080/專案名/LoginServlet
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/522852.html
標籤:Java

目錄)
目錄)