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

时间:2010-09-27 13:45:53

标签: java servlets properties servletconfig

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

我知道this SO questionServletContext.getInitParameter()机制,但至于 据我所知,他们需要将数据捆绑在一起 servlet包(作为属性文件,或在 web.xml),这使得升级servlet代码变得不方便。

servlet是否有任何“标准”接口来获取此类 键/值配置数据?编程就好了 界面到处都是一样的,但实际的设置方式 配置数据取决于正在使用的实际servlet容器。

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

4 个答案:

答案 0 :(得分: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值的方法因其他应用程序服务器而异,但读取配置的代码始终相同。

答案 1 :(得分:4)

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

有关Tomcat的示例,请参阅Defining Tomcat servlet context parameters

答案 2 :(得分:3)

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

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

  • 阅读

答案 3 :(得分:0)

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

编写一个小的Singleton来包装属性并从修复程序中加载它们。绝对位置

public class LocalConfig extends Properties {

  public static LocalConfig $ = new LocalConfig();

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

}