如何从servlet中可移植地读取配置数据
我正在编写一个需要读取一些特定于站点的配置数据的Java servlet; 我希望系统管理员在部署时可以轻松访问/修改它。 没有合理的默认值,因此数据必须由站点管理员提供。
它由几个字符串键/值对组成(想想属性)。 它只会被读取一次(在初始化时)。
我知道这个SO问题和ServletContext.getInitParameter()
机制,但据我的理解,它们需要将数据捆绑在servlet包中(作为属性文件,或在web.xml
指定) ),这使得升级servlet代码变得不方便。
servlet是否有任何“标准”接口来获取这种键/值配置数据? 如果编程接口在任何地方都相同,那就没问题,但设置配置数据的实际方式取决于所使用的实际servlet容器。
我更喜欢便携式解决方案,但我会满足于仅适用于Tomcat和Jetty的东西。
为Web应用程序配置应用程序服务器的推荐方法是每个JNDI。
每个应用程序服务器(包括Jetty和Tomcat)都允许您配置JNDI参数。
对于Jetty,您可以将以下内容添加到jetty.xml以添加JNDI参数param.file
:
param.file etc/config.properties true
然后在您的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值的方法因其他应用程序服务器而异,但读取配置的代码始终相同。
Servlet init参数是定义可由管理员配置的属性的正确(和标准化)方式 。 许多应用程序服务器提供可以配置参数的GUI后端。
有关Tomcat的示例,请参阅定义Tomcat servlet上下文参数
-
配置属性的外部位置 – 通过jvm参数(启动servlet容器时)或web.xml
-
在外部位置使用
config.properties
并使用java.util.Properties
读取它
您可以使用首选项或hack with user.home,user.dir等。但是对于一些键/值,保持简单。
编写一个小的Singleton来包装Properties并从修复和绝对位置加载它们
public class LocalConfig extends Properties { public static LocalConfig $ = new LocalConfig(); private LocalConfig() throws IOException { load(new File("/etc/myconfig.properties")); } }