代码之家  ›  专栏  ›  技术社区  ›  ravi

正在读取JSF2.0中的属性文件,该文件也可以在战争中使用

  •  2
  • ravi  · 技术社区  · 11 年前

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

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

    enter image description here

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

    有没有任何方法可以读取属性文件,它既可以在开发阶段工作,也可以在战争文件中工作?

    1 回复  |  直到 11 年前
        1
  •  9
  •   Community Jaime Torres    7 年前

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

    只需使用 ExternalContext#getResourceAsStream() 直接以 InputStream 。它采用相对于网络内容根的路径。

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

    (请注意,路径不能以斜线开头!)