前端
<form action="hello" method="post">
1.?不加斜杠
(相對路徑,如?action="hello"
)
-
解析規則:基于當前頁面的?URL 路徑部分?進行拼接。
假設當前頁面 URL 是?http://域名:端口/應用上下文/xxx.html
(例如?http://localhost:8080/test/page.html
),則:- 瀏覽器會將?
hello
?拼接到?當前路徑的最后一級目錄后。 - 若當前路徑是?
/test/
(比如頁面是?/test/index.html
,其路徑部分為?/test/
),則?action="hello"
?解析為?http://域名:端口/test/hello
。 - 若當前路徑是?
/test/sub/
(頁面是?/test/sub/page.html
),則解析為?http://域名:端口/test/sub/hello
。
- 瀏覽器會將?
-
特點:繼承當前頁面的路徑前綴(包括應用上下文、子目錄等),適用于?同應用內的路徑跳轉(比如后端接口在應用上下文內,如?
/test/hello
)。
2.?加斜杠
(根路徑,如?action="/hello"
)
-
解析規則:從?域名的根路徑?開始拼接(忽略當前頁面的路徑前綴)。
無論當前頁面 URL 是什么(比如?http://localhost:8080/test/page.html
?或?http://localhost:8080/other/page.html
),action="/hello"
?都會解析為?http://域名:端口/hello
(直接指向根路徑下的?hello
,與當前頁面的路徑無關)。 -
特點:強制從根開始,適用于?跨應用或根路徑下的接口(若后端接口確實在根路徑,如?
/hello
,但實際開發中較少見,因為 Web 應用通常有上下文路徑)。
?舉例對比
(假設應用上下文是?/test
,當前頁面是?/test/index.html
):
- 不加斜杠:
action="hello"
?→ 解析為?http://localhost:8080/test/hello
(帶應用上下文,正確訪問應用內的接口)。 - 加斜杠:
action="/hello"
?→ 解析為?http://localhost:8080/hello
(不帶應用上下文,若后端接口不在根路徑,會 404 錯誤)。
總結:
- 不加斜杠:跟著當前頁面的路徑走(適合應用內的相對路徑,自動帶上應用上下文)。
- 加斜杠:直接從根開始(適合根路徑下的絕對路徑,與當前頁面路徑無關)。
后端?
@WebServlet("/hello")
后端 Servlet 路徑
(@WebServlet("/hello")
)
-
路徑含義:
該 Servlet 映射到?應用上下文內的?/hello
?路徑。假設應用上下文是?/test
(如之前配置的?Context path
),則:- 訪問 URL?為?
http://域名:端口/應用上下文/hello
(例如?http://localhost:8080/test/hello
)。 - 映射規則:Servlet 路徑是?相對于應用上下文的根(即?
/test
?是應用上下文,Servlet 路徑?/hello
?直接跟在后面,形成?/test/hello
)。
- 訪問 URL?為?
-
為什么必須加斜杠?
Servlet 規范規定,映射路徑?必須以斜杠開頭(表示從應用上下文的根開始),否則編譯器會報錯(如?@WebServlet("hello")
?是非法的,無法啟動 Tomcat)。這是后端代碼的?語法強制要求,和前端路徑的解析邏輯不同。