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

以编程方式从我的java webapp读取静态资源,java,servlets,war,Java,Servlets,War,我现在在我的.war文件中有一堆这样的图像 WAR-ROOT -WEB-INF -IMAGES -image1.jpg -image2.jpg -index.html 当我通过servlet/jsp/etc生成html时,我可以简单地链接到 及 我正在编写一个servlet,它需要获取对这些图像的文件系统引用(在本例中是为了呈现一个复合的.pdf文件)。有没有人对如何获得一个文件系统引用来引用放置在战争中的文件有类似的建议 它可能是我在servlet初始化时获取

我现在在我的.war文件中有一堆这样的图像

WAR-ROOT
  -WEB-INF
  -IMAGES
    -image1.jpg
    -image2.jpg
  -index.html
当我通过servlet/jsp/etc生成html时,我可以简单地链接到

我正在编写一个servlet,它需要获取对这些图像的文件系统引用(在本例中是为了呈现一个复合的.pdf文件)。有没有人对如何获得一个文件系统引用来引用放置在战争中的文件有类似的建议

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

使用ServletContext

例:


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

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

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

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

Thread.currentThread().getContextClassLoader().getResource(<relative-path>/<filename>)
Thread.currentThread().getContextClassLoader().getResource(/)

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

如果您可以保证WAR已扩展,则可以使用将相对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
,那么请改为使用

另见:

思想耳朵取代了战争。。。您考虑过使用反射吗?没有war文件一直被使用,这不是一个EJB应用程序。反射有何帮助?反射允许您查找位置,而无需使用相对位置path@OMG喝多了一点?;)@BalusC:Java让我喝hic:pun幸运的是,webcontent不是类路径的一部分。只有
/WEB-INF/lib
/WEB-INF/类
是可用的。所以这个方法行不通。不幸的是,webcontent不是类路径的一部分。只有
/WEB-INF/lib
/WEB-INF/类
是可用的。所以这个方法行不通。第二点,在什么情况下,.war文件不会被扩展?AFAIK当您将.war文件上载到公共servlet容器时,它会将它们解压到一个工作目录中。您知道需要注意的具体情况吗?这可以在服务器级别进行配置。默认情况下,大多数servletcontainers都会将其解压缩。但大多数(如果不是所有的话)第三方主机配置为不这样做。在这种情况下,
getRealPath()
将返回
null
。毕竟,如果您实际上只对
InputStream
感兴趣,那么应该避免使用
getRealPath()
,而在
ServletContext
上继续使用
getResourceAsStream()
。这是一个很好的解决方案!
String relativeWebPath = "/IMAGES/image1.jpg";
String absoluteDiskPath = getServletContext().getRealPath(relativeWebPath);
File file = new File(absoluteDiskPath);
InputStream input = new FileInputStream(file);
// ...
String relativeWebPath = "/IMAGES/image1.jpg";
InputStream input = getServletContext().getResourceAsStream(relativeWebPath);
// ...