以编程方式从我的java webapp读取静态资源

时间:2011-05-06 18:18:07

标签: java servlets war

我目前在我的.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吗?我显然可以有一个明确指向已安装目录的属性文件,但我想避免其他配置。

4 个答案:

答案 0 :(得分:13)

如果您可以保证扩展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中)并且你实际上对绝对磁盘文件系统路径并不感兴趣实际需要的所有只是InputStream,然后使用getServletContext().getResourceAsStream()代替。

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

另见:

答案 1 :(得分:5)

使用ServletContext的getRealPath method

例如:

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

答案 2 :(得分:-2)

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

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

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

答案 3 :(得分:-3)

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

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

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