ExternalContext#getResourceAsStream() возвращает ноль, где разместить файл ресурса?
Я пытаюсь получить файл PNG как InputStream
в моем управляемом бобе, как показано ниже:
ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
InputStream input = externalContext.getResourceAsStream("/myFile.png");
// input is null.
Тем не менее InputStream
всегда ноль. Как это вызвано и как я могу решить это?
1 ответ
Очевидно, вы поместили ресурс в неправильном месте.
ExternalContext#getResourceAsStream()
который делегирует в случае контейнеров сервлетов под крышками ServletContext#getResoruceAsStream()
, имеет свой корень в веб-контенте WAR (родительская папка /WEB-INF
а также /META-INF
таким образом, файлы в нем также доступны), и /META-INF/resources
папка всех JAR в /WEB-INF/lib
, В случае веб-приложения JSF это обычно XHTML, CSS, JavaScript и файлы изображений.
Другими словами, он возвращает веб-ресурсы. Он не возвращает ресурс файловой системы диска, для этого вам нужно new FileInputStream()
вместо. Он также не возвращает ресурс classpath, для этого вам нужно ClassLoader#getResourceAsStream()
вместо. У classpath есть корень в ao /WEB-INF/classes
, все банки в /WEB-INF/lib
и некоторые папки, сконфигурированные для ВМ / сервера, в зависимости от среды выполнения.
В обычной структуре файла веб-контента файл ресурса должен быть расположен именно здесь, чтобы получить его желаемым способом:
WebContent
|-- META-INF
|-- WEB-INF
| |-- faces-config.xml
| `-- web.xml
|-- myFile.png <-- Here.
: