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

在以下代码片段中:

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

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

介绍

ServletContext#getRealPath()用于将Web内容path(服务器磁盘文件系统上展开的WAR文件夹结构中的path)转换为绝对磁盘文件系统path。

"/"代表网页内容的根。 也就是说它代表了下面的项目结构中的web文件夹:

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

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

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

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

代替

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

不要在那里写文件

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

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

getRealPath()getRealPath()移植的; 你最好不要使用它

仔细使用getRealPath() 。 实际上它没有明显的真实世界的用例。 如果您真正需要的是获取Web资源的InputStream ,则最好使用ServletContext#getResourceAsStream()而不pipeWAR的扩展方式如何。 所以,如果你想要一个index.jspInputStream ,那么不要这么做:

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

但是,做:

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

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

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

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

 URL resource = servletContext.getResource(path); 

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

也可以看看:

  • getResourceAsStream()与FileInputStream
  • 将上传的文件保存在servlet应用程序中的推荐方法
  • 保持数据重新部署Java EE 7 Web应用程序的简单方法

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

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

在Java 7和Java 8之间也有所变化。不可否认,它涉及到一个不赞成使用的调用,但是我们必须添加一个“/”才能使我们的程序正常工作! 这里是讨论它的链接为什么servletContext.getRealPath在tomcat 8上返回null?