如何处理JSF类中的资源?

如何处理JSF类中的资源?,jsf,properties,resources,classpath,Jsf,Properties,Resources,Classpath,我在JSF项目中的src/main/resources中放置了一个属性文件 我怎么处理呢?我知道EL在支持bean中不起作用 注意:文件位于src/main/resources-而不是src/main/webapps/resources,因此以下内容不起作用: FacesContext context = FacesContext.getCurrentInstance(); File value = context.getApplication().evaluateExpressionGet(c

我在JSF项目中的
src/main/resources
中放置了一个属性文件

我怎么处理呢?我知道EL在支持bean中不起作用

注意:文件位于
src/main/resources
-而不是
src/main/webapps/resources
,因此以下内容不起作用:

FacesContext context = FacesContext.getCurrentInstance();
File value = context.getApplication().evaluateExpressionGet(context, "#{resource['resources:email.properties']}", File.class);

因此,它位于类路径中。您可以使用从中获取
InputStream
。假设
src
是类路径根,而
main/resources
是包:

InputStream input = Thread.currentThread().getContextClassLoader().getResourceAsStream("main/resources/foo.properties");
Properties properties = new Properties();
properties.load(input);
// ...
或者,如果它应该是特定于webapp的,因此不应该被类路径中具有较高类加载优先级(例如,在appserver的lib或JRE的lib中)的同一路径上的文件覆盖,则使用


至于
{resource}
语法,这确实是专门针对放置在公共web内容的
/resources
文件夹中的CSS/JS/图像资源。另请参见

精彩绝伦!再次感谢BalusC。我想我的Tomcat7安装有点问题-实际上出现了一个空指针异常,没有按照我的预期工作?我尝试了一个前导斜杠,但这也不起作用。我的JSF应用程序具有通常的Maven原型,文件路径是src/main/resources/foo.propertiesOh,那么我认为您需要
getResourceAsStream(“foo.properties”)
。或者可能
getResourceAsStream(“resources/foo.properties”)
。这取决于Maven是如何构建战争的,我不能从头顶上说出来,因为我没有使用它。只需阅读Maven文档或提取WAR并探索
/WEB-INF/classes
即可了解构建结构。在线程的上下文类加载器中不应使用前导斜杠,它将始终返回
null
。它在webapp资源加载器中是可选的,但使用它总是希望它是公共webcontent资源。InputStream input=Thread.currentThread().getContextClassLoader().getResourceAsStream(“/foo.properties”)起作用。FacesContext的示例没有。谢谢不好吧,那将是一件令人惊奇的事。无论如何,再次欢迎你:)
InputStream input = FacesContext.getCurrentInstance().getExternalContext().getResourceAsStream("main/resources/foo.properties");
Properties properties = new Properties();
properties.load(input);
// ...