1. 概述
在本篇简明教程中,我们将重点讲解 Java Servlet API 中 HttpServletRequest
类的两个方法:getRequestURI()
和 getPathInfo()
的区别。
这两个方法在处理 HTTP 请求路径时经常被用到,但它们返回的内容有明显不同,理解清楚它们的作用,有助于避免路径处理上的常见“踩坑”。
2. getRequestURI() 与 getPathInfo() 的区别
方法名称 | 含义说明 |
---|---|
getRequestURI() |
✅ 返回完整的请求路径 URI,包括应用部署路径(context path)和 Servlet 映射路径(servlet mapping)以及后续的额外路径信息。 |
getPathInfo() |
✅ 只返回传递给 Servlet 的额外路径信息,即映射路径之后的部分。如果没有额外路径,返回 null 。 |
举例说明:
假设你的应用部署在 /deploy-folder
下,Servlet 映射为 /servlet-mapping
,那么当请求如下 URL:
http://localhost:8080/deploy-folder/servlet-mapping/request-path
getRequestURI()
返回:/deploy-folder/servlet-mapping/request-path
getPathInfo()
返回:/request-path
⚠️ 如果你将应用部署在 Web 容器的根路径(如 /
),并且 Servlet 映射为 /
,那么两个方法将返回相同的字符串。
3. 示例请求说明
为了更直观地理解两者的区别,我们创建一个简单的 Servlet 示例。
3.1 示例 URL
我们访问的完整 URL 是:
http://localhost:8080/deploy-folder/servlet-mapping/request-path?function=getRequestURI
3.2 示例 Servlet 代码
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
PrintWriter writer = response.getWriter();
String function = request.getParameter("function");
if ("getPathInfo".equals(function)) {
writer.println(request.getPathInfo());
} else if ("getRequestURI".equals(function)) {
writer.println(request.getRequestURI());
}
writer.flush();
}
3.3 测试 getRequestURI()
执行如下命令:
curl http://localhost:8080/deploy-folder/servlet-mapping/request-path?function=getRequestURI
输出结果为:
/deploy-folder/servlet-mapping/request-path
3.4 测试 getPathInfo()
执行如下命令:
curl http://localhost:8080/deploy-folder/servlet-mapping/request-path?function=getPathInfo
输出结果为:
/request-path
4. 总结
通过本篇文章,我们清晰地了解了:
getRequestURI()
返回完整的请求路径;getPathInfo()
只返回映射路径之后的“附加路径”;- 两者在部署路径不同或映射路径不同时会返回不同的结果。
✅ 使用建议:
- 如果你需要获取完整的请求路径,使用
getRequestURI()
; - 如果你只想处理附加在 Servlet 映射后的路径信息(比如 RESTful 风格路径),使用
getPathInfo()
。
本示例完整代码可在 GitHub 仓库 中找到。