Java Web 应用程序:为什么 getContextPath 为空?

Jas*_*per 5 java servlets web-applications

对于此 URL:
http://localhost:8888/myapp/myservlet/item

在我的 servlet 里面 doGet 方法:

System.out.println("req.getServletPath(): " + req.getServletPath());
System.out.println("req.getRequestURL(): " + req.getRequestURL());
System.out.println("req.getRequestURI(): " + req.getRequestURI());
System.out.println("req.getContextPath(): " + req.getContextPath());
System.out.println("req.getPathInfo(): " + req.getPathInfo());
Run Code Online (Sandbox Code Playgroud)

控制台输出:

req.getServletPath(): 
req.getRequestURL(): http://localhost:8888/myapp/myservlet/item
req.getRequestURI(): /myapp/myservlet/item
req.getContextPath(): 
req.getPathInfo(): /myapp/myservlet/item
Run Code Online (Sandbox Code Playgroud)

为什么 getContextPath 和 getServletPath 是空的?
如果重要的话,这是一个部署在码头上的 eclipse 中的(谷歌)网络项目。

在这种情况下,我试图获取位于 servlet 名称之后的 URL 的一部分,即 /item。

Agi*_*Pro 10

我发现来自HttpServletRequest Path Decoding 的这个图形很有用:

在此处输入图片说明

看起来问题是应用程序部署在根上,然后servlet 有一个包含应用程序名称的路径。附加 web.xml 文件以验证这一点。


小智 3

关于上下文路径 - 该路径是加载到容器的应用程序的“子路径”。由于您的 contextPath 为空,因此您的应用程序在容器中配置为没有 contextPath 的默认应用程序。这是完全正确的 - 在大多数情况下,您实际上并不需要任何上下文路径。但您应该准备好使用它。

关于 getServletPath - 我不确定...但看起来您的应用程序管理您的 servlet,而 getServletPath 方法询问容器(而容器不知道有关您的 servlet 的任何信息)。要控制容器管理的内容和应用程序管理的内容,您可以查看 web.xml 文件并读取所有<servlet><servlet-mapping>元素