在以下代码段中:
ServletContext context = request.getServletContext();
String path = context.getRealPath("/");
/
方法中getRealPath()
代表什么?我应该什么时候使用它?
ServletContext#getRealPath()
旨在将 Web 内容路径(服务器磁盘文件系统上扩展的 WAR 文件夹结构中的路径)转换为绝对磁盘文件系统路径。
"/"
表示 Web 内容根。即,它代表web
以下项目结构中的文件夹:
YourWebProject
|-- src
| :
|
|-- web
| |-- META-INF
| | `-- MANIFEST.MF
| |-- WEB-INF
| | `-- web.xml
| |-- index.jsp
| `-- login.jsp
:
因此,传递"/"
togetRealPath()
将返回/web
项目扩展 WAR 文件所在文件夹的绝对磁盘文件系统路径。类似的东西/path/to/server/work/folder/some.war/
你应该能够在File
or中进一步使用FileInputStream
。
请注意,大多数初学者似乎没有看到/意识到您实际上可以将整个 Web 内容路径传递给它并且他们经常使用
String absolutePathToIndexJSP = servletContext.getRealPath("/") + "index.jsp"; // Wrong!
甚至
String absolutePathToIndexJSP = servletContext.getRealPath("") + "index.jsp"; // Wronger!
代替
String absolutePathToIndexJSP = servletContext.getRealPath("/index.jsp"); // Right!
另请注意,即使您可以使用 向其中写入新文件,但在重新部署 WAR 时FileOutputStream
,所有更改(例如新文件或编辑的文件)都将丢失;原因很简单,所有这些更改都不包含在原始 WAR 文件中。所以所有试图在其中保存上传文件的初学者都做错了。
此外,当服务器未配置为将 WAR 文件扩展为磁盘文件系统,而是作为虚拟文件系统扩展为例如内存时,getRealPath()
将始终返回或完全意外的路径。null
getRealPath()
不便携;你最好永远不要使用它getRealPath()
小心使用。实际上,它没有合理的现实世界用例。根据我 20 年的 Java EE 经验,总有另一种方式比getRealPath()
.
如果您真正需要的只是获取InputStream
Web 资源,则更好地使用ServletContext#getResourceAsStream()
它,无论 WAR 的扩展方式如何,这都将起作用。因此,例如,如果您想要InputStream
of index.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);
或者,如果您打算保存上传的文件或创建临时文件,请参阅下面的“另请参阅”链接。
Web 应用程序的上下文路径是包含 Web 应用程序的 WEB-INF 目录的目录。它可以被认为是网络应用程序的“家”。通常,在编写 Web 应用程序时,获取此目录在文件系统中的实际位置可能很重要,因为这允许您执行诸如读取文件或写入文件之类的操作。
该位置可以通过 ServletContext 对象的 getRealPath() 方法获得。此方法可以传递一个字符串参数集到 File.separator 以使用操作系统的文件分隔符获取路径(“/”对于 UNIX,“\”对于 Windows)。
Java 7 和 Java 8 之间也有一个变化。诚然,它涉及一个已弃用的调用,但我必须添加一个“/”才能让我们的程序正常工作!这是讨论它的链接为什么servletContext.getRealPath在tomcat 8上返回null?
我的方法:
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;
}
}