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

Ric*_*rri 14 java servlets properties servletconfig

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

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

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

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

van*_*nje 18

为Web应用程序配置应用程序服务器的推荐方法是根据JNDI.

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

对于Jetty,您可以将以下内容添加到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> 
Run Code Online (Sandbox Code Playgroud)

然后在您的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");
}
Run Code Online (Sandbox Code Playgroud)

设置JNDI值的方法因其他应用程序服务器而异,但读取配置的代码始终相同.