初学者servlet问题:访问.war中的文件,哪个路径?
这个问题在这里已经有了答案:
读取资源时,不应该依赖文件IO中的相对路径。 工作目录取决于应用程序的启动方式。 你完全无法控制这一点。 始终在文件IO中使用绝对路径。
正常的方法是:
将资源放入类路径中或将其路径添加到类路径中。 然后你可以通过classloader获得它,如下所示:
String classPathLocation = "filename.ext";
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream(classPathLocation);
// ...
请注意如何获得类加载器和资源。 你不应该像getClass().getResourceAsStream()
那样从当前类中获取它。 在WAR中,可能有多个类加载器。 当前类的类加载器可能不知道所需的资源本身,即上下文。
将资源放入webcontent( WEB-INF
文件夹所在的位置以及所有其他公共Web资源)。 然后你可以获得如下的绝对路径,你可以继续使用通常的文件IO代码:
String relativeWebPath = "/filename.ext";
String absoluteDiskPath = getServletContext().getRealPath(relativeWebPath);
InputStream input = new FileInputStream(absoluteDiskPath);
// ...
请注意,这只在WAR被扩展时才起作用,否则它会返回null
。
我对BalusC有这个答案,但是由于我起初并不是很了解它,所以我简化了它:
工作目录(相对路径的起点)取决于应用程序的启动方式,所以你不能真正控制这个。 幸运的是,有一种方法可以获取Web应用程序根目录中任何内容的绝对路径,如下所示:
getServletContext().getRealPath("pathToAnyFileInYourWebAppDocumentRoot.ext")
(这给了一个字符串)
这就是你必须要做的。 不幸的是,这只适用于应用程序部署为目录时,而不是作为.war文件(它将返回null
)。
(另请参阅BalusC的回答,以及此答案的来源)。
链接地址: http://www.djcxy.com/p/55883.html上一篇: Beginner servlet question: accessing files in a .war, which path?
下一篇: What's the benefit of deploying a war file instead of an exploded directory?