如何从servlet中可移植地读取配置数据

我正在编写一个需要读取一些特定于站点的配置数据的Java servlet; 我希望系统管理员在部署时可以轻松访问/修改它。 没有合理的默认值,因此数据必须由站点管理员提供。
它由几个字符串键/值对组成(想想属性)。 它只会被读取一次(在初始化时)。

我知道这个SO问题和ServletContext.getInitParameter()机制,但据我的理解,它们需要将数据捆绑在servlet包中(作为属性文件,或在web.xml指定) ),这使得升级servlet代码变得不方便。

servlet是否有任何“标准”接口来获取这种键/值配置数据? 如果编程接口在任何地方都相同,那就没问题,但设置配置数据的实际方式取决于所使用的实际servlet容器。

我更喜欢便携式解决方案,但我会满足于仅适用于Tomcat和Jetty的东西。

为Web应用程序配置应用程序服务器的推荐方法是每个JNDI。

每个应用程序服务器(包括Jetty和Tomcat)都允许您配置JNDI参数。

对于Jetty,您可以将以下内容添加到jetty.xml以添加JNDI参数param.file

   param.file etc/config.properties true  

然后在您的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值的方法因其他应用程序服务器而异,但读取配置的代码始终相同。

Servlet init参数是定义可由管理员配置的属性的正确(和标准化)方式 。 许多应用程序服务器提供可以配置参数的GUI后端。

有关Tomcat的示例,请参阅定义Tomcat servlet上下文参数

  • 配置属性的外部位置 – 通过jvm参数(启动servlet容器时)或web.xml

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

您可以使用首选项或hack with user.home,user.dir等。但是对于一些键/值,保持简单。

编写一个小的Singleton来包装Properties并从修复和绝对位置加载它们

 public class LocalConfig extends Properties { public static LocalConfig $ = new LocalConfig(); private LocalConfig() throws IOException { load(new File("/etc/myconfig.properties")); } }