2010-09-27 42 views
13

我正在編寫一個Java servlet,它需要讀取一些特定於站點的配置數據 ;我希望系統管理員在部署時可以方便地訪問/修改 。沒有明智的默認, 所以數據必須由網站管理員提供
它由幾個字符串鍵/值對組成(認爲屬性)。 它只會被讀取一次(在初始化時)。如何從servlet中輕鬆讀取配置數據

我所知道的this SO questionServletContext.getInitParameter()機制,但據 我的理解去,他們需要的數據在 servlet包(無論是作爲一個屬性文件,或在 web.xml指定捆綁),這使得升級servlet代碼變得不方便。

是否有任何「標準」接口讓servlet獲得這種 鍵/值配置數據?如果編程 接口在任何地方都是一樣的,但設置 配置數據的實際方式取決於正在使用的實際servlet容器。

我在尋找最好的便攜式解決方案,但我會滿足於 東西,只有在Tomcat和Jetty的作品。

+0

推薦的解決方案是使用JNDI作爲vanje以下回答。考慮到他作爲第二個最好的答案也有雙倍的優惠,請給他他應得的信用,並標記他的答案是正確的。 – HipsterZipster 2011-02-17 15:14:26

+0

@完全:完成。幾個月前,當我發佈這個問題時,情況並不是那麼明顯...... – 2011-02-21 16:19:56

回答

17

加載它們,建議的方法來配置網絡應用的應用服務器爲每JNDI。

每個應用程序服務器(包括Jetty和Tomcat)都允許您配置JNDI參數。

對於碼頭,你可以添加以下到您的jetty.xml添加JNDI參數param.file

<!-- JNDI java:comp/env --> 
<New id="param.file" class="org.mortbay.jetty.plus.naming.EnvEntry"> 
    <Arg>param.file</Arg> 
    <Arg type="java.lang.String"><SystemProperty name="jetty.home" default="."/>etc/config.properties</Arg> 
    <Arg type="boolean">true</Arg> 
</New> 

然後在你的servlet可以讀取JNDI參數:

import javax.naming.InitialContext; 
import javax.naming.NamingException; 

... 

public Object readJndi(String paramName) { 
    Object jndiValue = null; 
    try { 
    final InitialContext ic = new InitialContext(); 
    jndiValue = ic.lookup("java:comp/env/" + paramName); 
    } catch (NamingException e) { 
    // handle exception 
    } 
    return jndiValue; 
} 


public String getConfigPath() { 
    return (String) readJndi("param.file"); 
} 

方式爲其他應用程序服務器設置JNDI值不同,但讀取配置的代碼始終相同。

3
  • 配置屬性的外部位置 - 要麼通過JVM參數(起始servlet容器時),或在web.xml

  • 在外部位置使用config.properties並用java.util.Properties讀取它

+1

或者只是將其路徑添加到運行時類路徑並從類路徑加載它。 – BalusC 2010-09-27 14:41:18

+1

感謝:好,簡單。但是,除非我誤解,否則這將需要我將絕對路徑名嵌入到web.xml中,或者使用sysadmin來破解JVM/servlet容器啓動腳本以定義屬性。這兩種解決方案似乎都有缺陷...... – 2010-09-29 11:16:19

0

您可以採取首或的user.home,user.dir來,等技巧,但幾個鍵/值讓事情變得簡單。

寫小單張環繞屬性和修復&絕對位置

public class LocalConfig extends Properties { 

    public static LocalConfig $ = new LocalConfig(); 

    private LocalConfig() throws IOException { 
    load(new File("/etc/myconfig.properties")); 
    } 

} 
4

Servlet初始化參數是定義可由管理員配置的屬性的正確(和標準化)方式。許多應用程序服務器都提供了可以配置參數的GUI後端。

對於Tomcat的示例,請參見Defining Tomcat servlet context parameters

+0

+1最好通過'context-param'(我認爲JNDI路由也很好)。 – Bruno 2010-09-27 14:46:22

+1

在Jetty中,servlet初始化參數可以在[override-web.xml文件](http://docs.codehaus.org/display/JETTY/override+web.xml)中定義或覆蓋。 – 2010-10-21 08:11:07

相關問題