前端
<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)。这是后端代码的 语法强制要求,和前端路径的解析逻辑不同。