在阅读JSF2.0属性文件可以在战争中也工作(Reading properties file in

2019-08-22 07:51发布

要读取properties与Glassfishv3 Web服务器,它位于JSF2.0文件root directory我的web应用程序中,我使用下面的代码-

    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"));

下面是网站的截图portal-

虽然运行门户我得到FileNotFound错误,因为文件中不存在的GlassFish域。

有什么办法读取属性文件,同时可在该情况下工作,在发展阶段和在战争文件还?

Answer 1:

你永远不应该使用java.io.File指网络资源。 因此它不知道它是坐在情况下,你也永远不应该使用ServletContext#getRealPath()因为它可能会返回null时,服务器被配置扩展内存,而不是磁盘上的WAR文件,这是超出第三方控件主机。

只要使用ExternalContext#getResourceAsStream()来直接访问网络资源在味道InputStream 。 这需要相对于所述web内容根目录的路径。

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

也可以看看:

  • 的getResourceAsStream()VS的FileInputStream
  • 什么的ServletContext.getRealPath(“/”)的意思是,我应该使用它时,
  • 在哪里放置以及如何在基于servlet的应用程序读取配置资源文件?

更新似乎并没有被Web资源都没有。 您应该将文件移入“的WebContent”文件夹截图所示。 或者,更好的/WEB-INF文件夹,以便没有人可以通过URL访问它。

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

另一种方法是把它在classpath中,如截图所示的“Java源”文件夹中。 你不需要把它放在一个包,这是可选的。 假设你没有把它放在一个包,那么这样做:

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

(注意,路径可能不是以斜线开始!)



文章来源: Reading properties file in JSF2.0 which can work in war also