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

时间:2012-08-28 13:46:27

标签: java servlets realpath

在以下代码段中:

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

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

4 个答案:

答案 0 :(得分:101)

简介

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

"/"代表网络内容根。即它代表web文件夹,如下面的项目结构:

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

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

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

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

而不是

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

不要在那里写文件

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

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

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

仔细使用getRealPath()。实际上没有合理的现实世界用例。如果你真正需要的只是获得InputStream的网络资源,那么最好使用ServletContext#getResourceAsStream(),无论WAR如何扩展,这都会有效。因此,如果您想要InputStream index.jsp,那么执行:

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

但请做:

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

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

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

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

URL resource = servletContext.getResource(path);

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

另见:

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

Java 7和Java 8之间也存在变化。不可否认,它涉及一个已弃用的调用,但我必须添加一个“/”来使我们的程序正常工作!以下是讨论它的链接Why does servletContext.getRealPath returns null on tomcat 8?

答案 3 :(得分:0)

我的方法:

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;
    }
}