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

sap*_*Pro 60 java servlets realpath

在以下代码段中:

ServletContext context = request.getServletContext();
String path = context.getRealPath("/");
Run Code Online (Sandbox Code Playgroud)

是什么/在方法getRealPath()代表什么呢?我应该什么时候使用它?

Bal*_*usC 106

介绍

ServletContext#getRealPath()被intented到Web内容的路径(在服务器的磁盘文件系统上展开的WAR文件夹结构的路径)转换为绝对磁盘文件系统路径.

"/"代表Web内容根.即它代表web以下项目结构中的文件夹:

YourWebProject
 |-- src
 |    :
 |
 |-- web
 |    |-- META-INF
 |    |    `-- MANIFEST.MF
 |    |-- WEB-INF
 |    |    `-- web.xml
 |    |-- index.jsp
 |    `-- login.jsp
 :    
Run Code Online (Sandbox Code Playgroud)

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

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

String absolutePathToIndexJSP = servletContext.getRealPath("/") + "index.jsp"; // Wrong!
Run Code Online (Sandbox Code Playgroud)

代替

String absolutePathToIndexJSP = servletContext.getRealPath("") + "index.jsp"; // Wronger!
Run Code Online (Sandbox Code Playgroud)

不要在那里写文件

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

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

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

getRealPath()小心使用.实际上没有合理的现实世界用例.如果您真正需要的只是获取getRealPath()Web资源,那么更好地使用它InputStream,无论WAR如何扩展,这都将起作用.所以,如果你想例如一个ServletContext#getResourceAsStream()InputStream,那么就不能这样做:

String absolutePathToIndexJSP = servletContext.getRealPath("/index.jsp"); // Right!
Run Code Online (Sandbox Code Playgroud)

而是做:

InputStream input = new FileInputStream(servletContext.getRealPath("/index.jsp")); // Wrong!
Run Code Online (Sandbox Code Playgroud)

或者,如果您打算获取所有可用Web资源路径的列表,请index.jsp改用.

InputStream input = servletContext.getResourceAsStream("/index.jsp"); // Right!
Run Code Online (Sandbox Code Playgroud)

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

Set<String> resourcePaths = servletContext.getResourcePaths("/");
Run Code Online (Sandbox Code Playgroud)

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

也可以看看:

  • 我100%肯定@BalusC会回答这个问题并且答案非常棒.说真的,你太棒了. (13认同)