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

8
对于这个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());

控制台输出:

req.getServletPath(): 
req.getRequestURL(): http://localhost:8888/myapp/myservlet/item
req.getRequestURI(): /myapp/myservlet/item
req.getContextPath(): 
req.getPathInfo(): /myapp/myservlet/item

为什么getContextPath和getServletPath为空? 如果有关系,这是在jetty上部署的eclipse (google) web项目。
我正在尝试获取servlet名称后面的URL部分,即在此例中的/item。

你认为它应该返回/myapp吗?为什么? - Sotirios Delimanolis
Sotirios> 它不应该是空白的 - 是吗? - Jasper
这取决于您如何配置容器。 - Sotirios Delimanolis
你使用的是哪个容器?检查一下你的应用程序是否部署为根。如果是,那么就没有上下文。 - Jafar Ali
2个回答

13

我发现这张来自HttpServletRequest路径解码的图片很有用:

enter image description here

看起来问题在于应用程序部署在根目录,然后servlet具有包括应用程序名称在内的路径。附上web.xml文件以进行验证。


非常好!我会把这个打印出来给同事们看。 - jksevend

3
关于上下文路径 - 这个路径是容器加载应用程序的“子路径”。如果您的contextPath为空,则您的应用程序在容器中配置为没有contextPath的默认应用程序。这是完全正确的 - 在大多数情况下,您确实不需要任何上下文路径。但您应该准备好使用它。
关于getServletPath - 我不太确定... 但看起来您的应用程序管理您的servlet,而getServletPath方法询问容器(容器对您的servlet一无所知)。要控制由容器管理和由应用程序管理的内容,您可以查看您的web.xml文件并阅读所有<servlet><servlet-mapping>元素。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接