一尘不染

Servlet实路径

tomcat

我正在目录博客下运行一个webapp。(例如www.example.com/blog)。

我想获取请求的真实文件系统路径。

例如www.example.com/blog/test-file.html->
/usr/share/tomcat7/webapps/blog/test-file.html

我尝试了以下方法:

 public String realPath(HttpServletRequest request, ServletContext servletContext){
    String requestURI = request.getRequestURI();
    String realPath = servletContext.getRealPath(requestURI);
    return realPath;
}

但是,这返回

/usr/share/tomcat7/webapps/blog/blog/test-file.html

正确的方法是什么?


阅读 229

收藏
2020-06-16

共1个答案

一尘不染

简短答案

要获得所需的结果,请使用HttpServletRequest#getServletPath()method作为method的参数getRealPath()

这是最接近您想要完成的工作(请阅读下面的注释)。


说明

之所以得到这样的路径(带有double blog),是因为您使用的是 getRequestURI() 方法返回的结果。

所述 getRequestURI() 方法返回开始与该路径 应用上下文 。在您的情况下,它将是:
/blog/test-file.html

然后会发生什么, getRealPath() 方法 getRequestURI() 方法返回的字符串 附加
到文件夹的实际路径/物理路径,您的应用程序位于文件系统上,在您的情况下为:
/usr/share/tomcat7/webapps/blog/

因此,结果路径为:
/usr/share/tomcat7/webapps/blog/blog/test-file.html

那就是你双重blog问题的原因。


重要的提示

免责声明
OP可能已经知道下面编写的信息,但是出于完整性考虑而编写。

您尝试获取的真实路径 并不意味着 您正在获取 文件系统上真实路径 。的url- pattern在被配置 的web.xml
(或者如果你在相关注释的Servlet使用3.0+)实际上是一个 逻辑/虚拟路径 ,其可以或可以不涉及实际的,物理路径的文件系统上,即,
图案(指定的路径)不必物理存在

还引用ServletContext.getRealPath(String)文档(重点是我的):

获取对应于给定 虚拟路径 的真实 路径

2020-06-16