如何以可移植方式从 servlet 读取配置数据

2022-09-04 01:01:33

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

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

是否有任何“标准”接口可供 servlet 获取此类键/值配置数据?如果编程接口在任何地方都相同,也可以,但是设置配置数据的实际方式取决于实际使用的 Servlet 容器。

我更喜欢便携式解决方案,但我会满足于只能在Tomcat和Jetty中工作的东西。


答案 1

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

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

对于码头,您可以将以下内容添加到码头.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 值的方法不同,但读取配置的代码始终相同。


答案 2

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

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