65

在以下代码段中:

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

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

4

4 回答 4

126

介绍

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

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

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

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

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

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

甚至

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

代替

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

永远不要在那里写文件

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

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

getRealPath()不便携;你最好永远不要使用它

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

如果您真正需要的只是获取InputStreamWeb 资源,则更好地使用ServletContext#getResourceAsStream()它,无论 WAR 的扩展方式如何,这都将起作用。因此,例如,如果您想要InputStreamof 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("/");

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

URL resource = servletContext.getResource(path);

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

也可以看看:

于 2012-08-28T13:56:39.087 回答
3

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

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

于 2012-08-28T13:51:23.407 回答
2

Java 7 和 Java 8 之间也有一个变化。诚然,它涉及一个已弃用的调用,但我必须添加一个“/”才能让我们的程序正常工作!这是讨论它的链接为什么servletContext.getRealPath在tomcat 8上返回null?

于 2017-01-16T23:58:23.933 回答
-1

我的方法:

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

    try {
        String path = request.getRealPath("/WEB-INF/conf.properties");
        Properties p = new Properties();
        p.load(new FileInputStream(path));

        String StringConexion=p.getProperty("StringConexion");
        String User=p.getProperty("User");
        String Password=p.getProperty("Password");
    }
    catch(Exception e){
        String msg = "Excepcion " + e;
    }
}
于 2018-11-06T16:13:28.333 回答