ExternalContext#getResourceAsStream()返回null,放置资源文件的位置?

时间:2014-09-11 09:59:45

标签: jsf resources externalcontext

我试图在我的托管bean中获取PNG文件InputStream,如下所示:

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

但是,InputStream始终为空。这是怎么造成的,我该如何解决?

1 个答案:

答案 0 :(得分:5)

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

ExternalContext#getResourceAsStream(),在servlet容器的情况下委托给ServletContext#getResoruceAsStream(),其根目录在WAR的Web内容中(/WEB-INF和{{的父文件夹) 1}}文件夹,因此其中的文件也可以这样使用),以及/META-INF中所有JAR的/META-INF/resources文件夹。对于JSF Web应用程序,它通常是XHTML,CSS,JavaScript和图像文件。

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

在通常的Web内容文件结构中,必须将资源文件放在此处,以便以所需方式获取它:

/WEB-INF/lib