【问题标题】:How to portably read configuration data from a servlet如何从 servlet 可移植地读取配置数据
【发布时间】:2011-04-17 19:00:27
【问题描述】:

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

我知道this SO questionServletContext.getInitParameter() 机制,但就 我的理解是,他们需要将数据捆绑在 servlet 包(作为属性文件,或在 web.xml),不方便升级servlet代码。

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

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

【问题讨论】:

  • 推荐的解决方案是使用 JNDI,正如 vanje 在下面回答的那样。考虑到他也有双倍的赞成票作为第二个最佳答案,请给他应得的荣誉并标记他的答案正确。
  • @Yoely:完成。几个月前,当我发布这个问题时,情况还不是很清楚......

标签: java servlets properties servletconfig


【解决方案1】:
  • 配置属性的外部位置 - 通过 jvm 参数(启动 servlet 容器时)或在 web.xml 中

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

【讨论】:

  • 或者只是将其路径添加到运行时类路径并从类路径中加载。
  • 谢谢:很好很简单。但是,除非我误解,否则这将需要我将绝对路径名嵌入到 web.xml 中,或者让系统管理员破解 JVM/servlet 容器启动脚本来定义属性。两种解决方案似乎都有缺点......
【解决方案2】:

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

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

public class LocalConfig extends Properties {

  public static LocalConfig $ = new LocalConfig();

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

}

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • +1 最好通过context-param (我认为JNDI 路由也不错)。
      • 在Jetty中,servlet初始化参数可以在override-web.xml file中定义或覆盖
      猜你喜欢
      • 2018-09-10
      • 2012-10-01
      • 1970-01-01
      • 2012-05-28
      • 2014-01-22
      • 2018-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多