在以下代码段中:
ServletContext context = request.getServletContext();
String path = context.getRealPath("/");
方法/
中的getRealPath()
代表什么?我什么时候应该使用它?
答案 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/
的内容,您应该可以在File
或FileInputStream
中进一步使用。
请注意,大多数初学者似乎没有看到/意识到您实际上可以将整个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;
}
}