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

ben*_*rre 5 java servlets war

我目前在我的.war文件中有一堆图像.

WAR-ROOT
  -WEB-INF
  -IMAGES
    -image1.jpg
    -image2.jpg
  -index.html
Run Code Online (Sandbox Code Playgroud)

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

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

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

不是我正在编写一个需要获取文件系统引用这些图像的servlet(在这种情况下呈现复合.pdf文件).有没有人建议如何获得文件系统引用放在战争中的文件类似于这是什么?

它可能是我抓住servlet初始化的URL吗?我显然可以有一个明确指向已安装目录的属性文件,但我想避免其他配置.

Bal*_*usC 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);
// ...
Run Code Online (Sandbox Code Playgroud)

但是,如果你不能保证扩展WAR(即所有资源仍然打包在WAR中)并且你实际上对绝对磁盘文件系统路径不感兴趣,而你实际需要的只是一个InputStream,那么使用getServletContext().getResourceAsStream()来代替.

String relativeWebPath = "/IMAGES/image1.jpg";
InputStream input = getServletContext().getResourceAsStream(relativeWebPath);
// ...
Run Code Online (Sandbox Code Playgroud)

也可以看看:


Mik*_*sen 5

使用ServletContext 的getRealPath方法.

例如:

String path = getServletContext().getRealPath("WEB-INF/static/img/myfile.jpeg");
Run Code Online (Sandbox Code Playgroud)