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/
,你应该能够在File
或FileInputStream
进一步使用。
请注意,大多数初学者似乎没有看到/意识到,您实际上可以将整个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.jsp
的InputStream
,那么不要这么做:
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?