14

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

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

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

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

4

4 回答 4

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> 

然后在您的 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 值的方式不同,但读取配置的代码始终相同。

于 2010-09-27T14:27:41.490 回答
4

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

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

于 2010-09-27T14:36:29.187 回答
3
  • 配置属性的外部位置 - 通过 jvm 参数(启动 servlet 容器时)或在 web.xml 中

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

于 2010-09-27T13:48:21.820 回答
0

您可以使用 Preferences 或使用 user.home、user.dir 等进行破解。但是对于一些键/值,请保持简单。

编写一个小单例来包装属性并从固定和绝对位置加载它们

public class LocalConfig extends Properties {

  public static LocalConfig $ = new LocalConfig();

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

}
于 2010-09-27T14:00:05.647 回答