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