servletcontext.getRealPath(“/”) 是什么意思,我应该什么时候使用它
在以下代码段中:
ServletContext context = request.getServletContext();
String path = context.getRealPath("/");
该方法代表什么?我应该何时使用它?/
getRealPath()
在以下代码段中:
ServletContext context = request.getServletContext();
String path = context.getRealPath("/");
该方法代表什么?我应该何时使用它?/
getRealPath()
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/
File
FileInputStream
请注意,大多数初学者似乎没有看到/意识到您实际上可以将整个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如何扩展,这都可以工作。所以,如果你想要一个的,那么不要做:InputStream
InputStream
index.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()
获取单个资源。当资源不存在时,这将返回。URL
null
URL resource = servletContext.getResource(path);
或者,如果您打算保存上传的文件或创建临时文件,请参阅下面的“另请参阅”链接。
Web 应用程序的上下文路径是包含 Web 应用程序的 WEB-INF 目录的目录。它可以被认为是Web应用程序的“家”。通常,在编写 Web 应用程序时,获取此目录在文件系统中的实际位置可能很重要,因为这允许您执行读取文件或写入文件等操作。
这个位置可以通过ServletContext对象的getRealPath()方法获得。此方法可以传递设置为 File.separator 的 String 参数,以使用操作系统的文件分隔符(UNIX 为“/”,Windows 为“\”)获取路径。