在JSF Web应用程序的静态代码中读取.properties文件

时间:2012-04-01 09:35:33

标签: jsf properties

我想从静态块中的属性文件中获取数据库连接参数。属性文件位置为WEB-INF/classes/db.properties

我更愿意使用getResourceAsStream()方法。我尝试了很多方法,但他们都返回了null

private static Properties prop = new Properties();
static{
    try {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        ServletContext servletContext = (ServletContext) facesContext.getExternalContext().getContext();
        InputStream inputStream = servletContext.getResourceAsStream("/db.properties"); 
        InputStream is = prop.getClass().getResourceAsStream("/db.properties");
        if(inputStream!=null){//it is null
            prop.load(inputStream);
        }
        if(is!=null){//it is null
            prop.load(is);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

这是如何引起的?如何解决?

2 个答案:

答案 0 :(得分:1)

正如Thufir在评论中写道,从Java代码中读取属性有一个很好的教程:http://jaitechwriteups.blogspot.ca/2007/01/how-to-read-properties-file-in-web.html

/** 
 * Some Method 
 *  
 * @throws IOException 
 *  
 */  
public void doSomeOperation() throws IOException {  
    // Get the inputStream  
    InputStream inputStream = this.getClass().getClassLoader()  
            .getResourceAsStream("myApp.properties");  

    Properties properties = new Properties();  

    System.out.println("InputStream is: " + inputStream);  

    // load the inputStream using the Properties  
    properties.load(inputStream);  
    // get the value of the property  
    String propValue = properties.getProperty("abc");  

    System.out.println("Property value is: " + propValue);  
}  

答案 1 :(得分:1)

InputStream inputStream = servletContext.getResourceAsStream("/db.properties"); 

此尝试期望文件位于/WebContent/db.properties

InputStream is = prop.getClass().getResourceAsStream("/db.properties");

此尝试期望它至少与java.util.Properties类属于同一档案(JAR)。

这些尝试都不会读取您放在/WEB-INF/classes/db.properties中的文件。您可以通过两种方式解决此问题。

  1. 将其直接移至/WEB-INF文件夹/WEB-INF/db.properties并按以下方式加载:

    InputStream input = externalContext.getResourceAsStream("/WEB-INF/db.properties");
    

    (请注意,您不需要从JSF的引擎盖下拖出ServletContext;已经有了委托方法)

  2. 相对于/WEB-INF/classes中也存在的类加载它,例如当前的托管bean类。

    InputStream input = Bean.class.getResourceAsStream("/db.properties");
    

    或者只是使用上下文类加载器,它可以访问所有内容。

    InputStream input = Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties");
    

    (请注意缺少/前缀)

  3. 另见: