Java Web 应用程序:为啥 getContextPath 为空?

Posted

技术标签:

【中文标题】Java Web 应用程序:为啥 getContextPath 为空?【英文标题】:Java Web-Application: Why is getContextPath empty?Java Web 应用程序:为什么 getContextPath 为空? 【发布时间】:2015-08-24 15:05:59 【问题描述】:

对于这个网址: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 是空的? 如果重要的话,这是部署在码头上的 Eclipse 中的(谷歌)网络项目。

我正在尝试获取 servlet 名称之后的部分 URL,即在这种情况下为 /item。

【问题讨论】:

你认为它应该返回/myapp?为什么? Sotirios> 它不应该是空白 - 不是吗? 这取决于你如何配置你的容器。 您使用的是哪个容器?如果您的应用程序被部署为根,请检查。如果是这样,我就没有上下文了。 这从 Eclipse 中部署在 Jetty 上,正如您在 URL 中看到的那样:localhost:8888/myapp/myservlet/item,“myapp”部分是应用程序名称,所以我猜它不是 root。我正在尝试获取“myservlet/”即项目之外的 URL 的最后一部分 - 我如何得到它? 【参考方案1】:

我发现这张来自HttpServletRequest Path Decoding 的图片很有用:

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

以上是关于Java Web 应用程序:为啥 getContextPath 为空?的主要内容,如果未能解决你的问题,请参考以下文章

Java Web 应用程序:为啥 getContextPath 为空?

为啥我可以将 Web 服务用作 Java 应用程序,但不能使用 struts2

在Java中怎么实现将界面分成9块,在其中一块随机生成数字

java问题

MimeBodyPart getContent 损坏二进制数据

为啥我的电脑不能运行java web start