【问题标题】:ExternalContext#getResourceAsStream() returns null, where to place the resource file?ExternalContext#getResourceAsStream() 返回null,资源文件放在哪里?
【发布时间】:2014-11-05 05:27:46
【问题描述】:

我正在尝试在我的托管 bean 中获取一个作为 InputStream 的 PNG 文件,如下所示:

ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
InputStream input = externalContext.getResourceAsStream("/myFile.png");
// input is null.

但是,InputStream 始终为空。这是如何引起的,我该如何解决?

【问题讨论】:

标签: jsf resources externalcontext


【解决方案1】:

显然您将资源放置在错误的物理位置。

ExternalContext#getResourceAsStream(),在 servlet 容器的情况下委托给ServletContext#getResoruceAsStream(),其根位于 WAR 的 Web 内容中(/WEB-INF/META-INF 文件夹的父文件夹,因此文件其中也可以通过这种方式获得),以及/WEB-INF/lib中所有JAR的/META-INF/resources文件夹。对于 JSF Web 应用程序,它通常是 XHTML、CSS、JavaScript 和图像文件。

换句话说,它返回网络资源。它不返回磁盘文件系统资源,因为您需要new FileInputStream()。它也不会返回类路径资源,因为您需要ClassLoader#getResourceAsStream()。类路径的根在 a.o. /WEB-INF/classes/WEB-INF/lib 中的所有 JAR,以及一些虚拟机/服务器配置的文件夹,具体取决于运行时环境。

在通常的 Web 内容文件结构中,资源文件必须准确地放置在此处才能以所需的方式获得它:

WebContent
 |-- META-INF
 |-- WEB-INF
 |    |-- faces-config.xml
 |    `-- web.xml
 |-- myFile.png    <-- Here.
 :

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-09
    • 2015-02-19
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    • 2013-10-02
    相关资源
    最近更新 更多