【问题标题】:Programmatically reading static resources from my java webapp [duplicate]以编程方式从我的 java webapp 中读取静态资源 [重复]
【发布时间】:2011-05-06 18:18:07
【问题描述】:

我的 .war 文件中目前有一堆像这样的图像。

WAR-ROOT
  -WEB-INF
  -IMAGES
    -image1.jpg
    -image2.jpg
  -index.html

当我通过我的 servlets/jsp/etc 生成 html 时,我可以简单地链接到

http://host/contextroot/IMAGES/image1.jpg

http://host/contextroot/IMAGES/image1.jpg

不是我正在编写一个 servlet,它需要获取对这些图像的文件系统引用(在这种情况下渲染出复合 .pdf 文件)。有没有人建议如何获取文件系统对放置在战争中的文件的引用,类似于这样?

这可能是我在 servlet 初始化时获取的 url 吗?我显然可以有一个明确指向已安装目录的属性文件,但我想避免额外的配置。

【问题讨论】:

  • Thought EAR 取代了 WAR...你考虑过使用反射吗?
  • 始终没有使用war文件,这不是EJB应用程序。反思有什么帮助?
  • 反射将允许您在不使用相对路径的情况下查找位置
  • @OMG 喝多了? ;)
  • @BalusC: Java 驱使我喝hic :p

标签: java servlets war


【解决方案1】:

如果你能保证 WAR 被扩展,那么你可以使用ServletContext#getRealPath() 将相对 web 路径转换为绝对磁盘文件系统,你可以在通常的 Java IO 中进一步使用它。

String relativeWebPath = "/IMAGES/image1.jpg";
String absoluteDiskPath = getServletContext().getRealPath(relativeWebPath);
File file = new File(absoluteDiskPath);
InputStream input = new FileInputStream(file);
// ...

但是,如果您不能保证 WAR 已扩展(即所有资源仍打包在 WAR 中)并且您实际上对磁盘文件系统的绝对路径以及您实际需要的所有内容不感兴趣 em> 只是其中的一个InputStream,然后改用getServletContext().getResourceAsStream()

String relativeWebPath = "/IMAGES/image1.jpg";
InputStream input = getServletContext().getResourceAsStream(relativeWebPath);
// ...

另见:

【讨论】:

  • 关于你的第二点,在什么情况下不会扩展 .war 文件? AFAIK 当您将 .war 文件上传到常见的 servlet 容器时,它会为您将它们解压缩到工作目录。您知道需要注意的具体案例吗?
  • 这可以在服务器级别进行配置。大多数 servlet 容器默认解压它们。但大多数(如果不是全部)第 3 方主机都配置为不这样做。在这种情况下,getRealPath() 将返回 null。毕竟,如果您实际上只对InputStream 感兴趣,则应避免使用getRealPath(),并在ServletContext 上继续使用getResourceAsStream()
  • 这是一个很好的解决方案!
【解决方案2】:

使用 ServletContext 的getRealPath method

例如:

String path = getServletContext().getRealPath("WEB-INF/static/img/myfile.jpeg");

【讨论】:

    【解决方案3】:

    这相对简单,您只需使用类加载器从类 plath 中获取文件。 :

    InputStream is =  YourServlet.class.getClassLoader().getResourceAsStream("IMAGES/img1.jpg");
    

    还有一些其他的 getResoruce 类值得一看。此外,您不必通过 servlet 上的类变量来获取类加载器。您碰巧知道容器已加载的任何类都应该可以工作。

    【讨论】:

    • 不幸的是,网页内容不是类路径的一部分。只有/WEB-INF/lib/WEB-INF/classes 是。所以这个方法行不通。
    【解决方案4】:

    如果您知道文件的相对位置,您可以使用

    向运行时询问确切位置
    Thread.currentThread().getContextClassLoader().getResource(<relative-path>/<filename>)
    

    这将为您提供一个指向可以找到指定图像的位置的 URL。此 URL 可用于读取指定文件,也可以将其拆分以使用 URL 的不同部分进行进一步处理。

    【讨论】:

    • 不幸的是,网页内容不是类路径的一部分。只有/WEB-INF/lib/WEB-INF/classes 是。所以这个方法行不通。
    猜你喜欢
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    • 2014-10-15
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    • 2020-02-02
    • 1970-01-01
    相关资源
    最近更新 更多