我正在编写一个需要读取某些特定于站点的Java servlet 配置数据;我希望它易于访问/修改 由部署时的系统管理员。没有合理的违约, 所以数据必须由网站管理员提供 它由几个字符串键/值对组成(想想属性)。 它只会被读取一次(在初始化时)。
我知道this SO question
和ServletContext.getInitParameter()
机制,但至于
据我所知,他们需要将数据捆绑在一起
servlet包(作为属性文件,或在
web.xml
),这使得升级servlet代码变得不方便。
servlet是否有任何“标准”接口来获取此类 键/值配置数据?编程就好了 界面到处都是一样的,但实际的设置方式 配置数据取决于正在使用的实际servlet容器。
我最喜欢便携式解决方案,但我很满意 只适用于Tomcat和Jetty的东西。
答案 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"));
}
}