在JSF2.0中读取属性文件也可以在战争中工作

时间:2013-04-12 13:04:51

标签: jsf-2 primefaces glassfish-3

要使用Glassfishv3 webserver(位于我的Web应用程序的properties)阅读JSF2.0中的root directory文件,我使用下面的代码 -

    ServletContext ctx = (ServletContext) FacesContext
            .getCurrentInstance().getExternalContext().getContext();
    String deploymentDirectoryPath = ctx.getRealPath("/");
    Properties prop = new Properties();
    prop.load(new FileInputStream(deploymentDirectoryPath
            + File.separator + "portal-config.properties"));

以下是门户网站的屏幕截图 -

enter image description here

在运行门户网站时,我收到FileNotFound错误,因为该文件在glassfish域中不存在。

有没有办法读取属性文件,它既适用于情境,也适用于开发阶段和war文件?

1 个答案:

答案 0 :(得分:9)

您绝不应该使用java.io.File来引用网络资源。它对它所处的上下文一无所知。当服务器配置为在内存而不是磁盘上扩展WAR文件时,你也不应该使用ServletContext#getRealPath(),因为它可能会返回null,这超出了你的范围。在第三方主机中控制。

只需使用ExternalContext#getResourceAsStream()直接获取InputStream的网络资源即可。它需要一个相对于webcontent root的路径。

ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
properties.load(ec.getResourceAsStream("/portal-config.properties"));

另见:


更新它似乎根本不是网络资源。您应该将文件移动到“WebContent”文件夹中,如屏幕截图所示。或者,更好的是,/WEB-INF文件夹,以便任何人都无法通过URL访问它。

properties.load(ec.getResourceAsStream("/WEB-INF/portal-config.properties"));

另一种方法是将其放在类路径中,即“Java源”文件夹,如屏幕截图所示。您不需要将它放在一个包中,这是可选的。假设你没有将它放在一个包中,那么这样做:

ClassLoader cl = Thread.currentThread().getContextClassLoader();
properties.load(cl.getResourceAsStream("portal-config.properties"));

(请注意,路径可能不会以斜杠开头!)