servletcontext.getRealPath(“/”) 是什么意思,我应该什么时候使用它

2022-08-31 14:42:54

在以下代码段中:

ServletContext context = request.getServletContext();
String path = context.getRealPath("/");

该方法代表什么?我应该何时使用它?/getRealPath()


答案 1

介绍

ServletContext#getRealPath() 旨在将 Web 内容路径(服务器磁盘文件系统上扩展的 WAR 文件夹结构中的路径)转换为绝对磁盘文件系统路径。

表示 Web 内容根目录。即,它表示以下项目结构中的文件夹:"/"web

YourWebProject
 |-- src
 |    :
 |
 |-- web
 |    |-- META-INF
 |    |    `-- MANIFEST.MF
 |    |-- WEB-INF
 |    |    `-- web.xml
 |    |-- index.jsp
 |    `-- login.jsp
 :    

因此,传递 to 将返回项目扩展 WAR 文件文件夹的绝对磁盘文件系统路径。您应该能够在 或 中进一步使用类似的东西。"/"getRealPath()/web/path/to/server/work/folder/some.war/FileFileInputStream

请注意,大多数初学者似乎没有看到/意识到您实际上可以将整个Web内容路径传递给它,并且他们经常使用

String absolutePathToIndexJSP = servletContext.getRealPath("/") + "index.jsp"; // Wrong!

甚至

String absolutePathToIndexJSP = servletContext.getRealPath("") + "index.jsp"; // Wronger!

而不是

String absolutePathToIndexJSP = servletContext.getRealPath("/index.jsp"); // Right!

永远不要在那里写文件

另请注意,即使您可以使用 将新文件写入其中,但每当重新部署WAR时,所有更改(例如新文件或编辑的文件)都将丢失;原因很简单,所有这些更改都不包含在原始 WAR 文件中。因此,所有试图保存上传文件的初学者都做错了。FileOutputStream

此外,当服务器未配置为将 WAR 文件扩展到磁盘文件系统中,而是作为虚拟文件系统扩展到例如内存中时,将始终返回或完全意外的路径。getRealPath()null

getRealPath()不可移植;你最好永远不要使用它

请小心使用。实际上它没有合理的现实世界用例。基于我20年的Java EE经验,有另一种方式比.getRealPath()getRealPath()

如果你真正需要的只是获取一个Web资源,最好使用ServletContext#getResourceAsStream(),无论WAR如何扩展,这都可以工作。所以,如果你想要一个的,那么不要做:InputStreamInputStreamindex.jsp

InputStream input = new FileInputStream(servletContext.getRealPath("/index.jsp")); // Wrong!

但相反,请这样做:

InputStream input = servletContext.getResourceAsStream("/index.jsp"); // Right!

或者,如果您打算获取所有可用 Web 资源路径的列表,请改用 ServletContext#getResourcePaths()。

Set<String> resourcePaths = servletContext.getResourcePaths("/");

您可以通过 ServletContext#getResource() 获取单个资源。当资源不存在时,这将返回。URLnull

URL resource = servletContext.getResource(path);

或者,如果您打算保存上传的文件或创建临时文件,请参阅下面的“另请参阅”链接。

另请参阅:


答案 2

Web 应用程序的上下文路径是包含 Web 应用程序的 WEB-INF 目录的目录。它可以被认为是Web应用程序的“家”。通常,在编写 Web 应用程序时,获取此目录在文件系统中的实际位置可能很重要,因为这允许您执行读取文件或写入文件等操作。

这个位置可以通过ServletContext对象的getRealPath()方法获得。此方法可以传递设置为 File.separator 的 String 参数,以使用操作系统的文件分隔符(UNIX 为“/”,Windows 为“\”)获取路径。


推荐