初学者servlet问题:访问.war中的文件,哪个路径?

这个问题在这里已经有了答案:

  • 将上传的文件保存在servlet应用程序中的推荐方法2个答案

  • 读取资源时,不应该依赖文件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?