为了账号安全,请及时绑定邮箱和手机立即绑定

什么是servletcontext.getRealPath(“/”),以及何时使用它

什么是servletcontext.getRealPath(“/”),以及何时使用它

牧羊人nacy 2019-06-18 12:56:27
什么是servletcontext.getRealPath(“/”),以及何时使用它在下面的片段中:ServletContext context = request.getServletContext();String path = context.getRealPath("/");什么/在方法中getRealPath()代表?我什么时候该用它?
查看完整描述

3 回答

?
侃侃无极

TA贡献2051条经验 获得超10个赞

导言

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

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

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

所以,通过"/"getRealPath()的绝对磁盘文件系统路径。/web项目的展开WAR文件的文件夹。有点像/path/to/server/work/folder/some.war/你应该可以在FileFileInputStream.

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

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

而不是

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

不要在里面写文件

还请注意,即使您可以使用FileOutputStream,所有更改(例如新文件或编辑的文件)将你给我消失无论何时重新部署战争,原因很简单,所有这些更改都不包含在原始WAR文件中。所以所有试图保存上传文件的初学者都做错了。

此外,getRealPath()永远都会回来null或者,当服务器没有配置为将WAR文件扩展到磁盘文件系统,而是作为虚拟文件系统进入内存时,就会出现一个完全出乎意料的路径。

getRealPath()是不可移植的,你最好不要使用它

使用getRealPath()小心点。实际上,它没有合理的真实世界用例。如果你真正需要的是InputStream更好地利用web资源ServletContext#getResourceAsStream()相反,无论战争是如何扩大的,这都是可行的。所以,如果你想要一个InputStreamindex.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);

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

另见:


查看完整回答
反对 回复 2019-06-18
?
繁花如伊

TA贡献2012条经验 获得超12个赞

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

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


查看完整回答
反对 回复 2019-06-18
?
aluckdog

TA贡献1847条经验 获得超7个赞

Java 7和Java 8之间也有一个变化。诚然,它涉及到一个不受欢迎的调用,但是我不得不添加一个“/”来使我们的程序工作!下面是讨论它的链接为什么servletContext.getRealPath在tomcat 8上返回NULL?


查看完整回答
反对 回复 2019-06-18
  • 3 回答
  • 0 关注
  • 7037 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信