我有2个webapps在两个上下文中运行:c1,c2(都在根之后)。我把一个startupListener放在c1中共享一个变量,另一个放在c2中来检索它。
我在c1中的startuplistener是:
public void contextInitialized(ServletContextEvent sce) {
HashMap <String,Object> database ;
//some code to init database
ServletContext context = sce.getServletContext().getContext("/c1");
if (context!=null)
{
context.setAttribute("crossContext", true);
context.setAttribute("cache", database);
}
}
在c2应用程序中,它是这样的:
public void contextInitialized(ServletContextEvent sce) {
ServletContext context = sce.getServletContext().getContext("/c1");
HashMap<String,Object> database = (HashMap) context.getAttribute("cache");
}
c2的startupListener中的上下文总是为null,我试过'/ c1','c1'。我错过了什么? (我正在使用tomcat6,如果这很重要) 感谢
答案 0 :(得分:3)
您需要设置crossContext = true。来自tomcat docs:
如果您希望在此应用程序中进行调用,则设置为true ServletContext.getContext()成功返回请求 在此虚拟主机上运行的其他Web应用程序的调度程序。 在安全意识环境中设置为false(默认值) getContext()始终返回null。
答案 1 :(得分:0)
问题:
应用初始化不匹配可能是app1在app1之前初始化。
有一种潜在的“解决方法”:如果您实际上有两个(或更多)相互依赖的应用,您可能决定在您身上启动多项服务server.xml:
<Service name="app1">
<Connector .../>
<Engine ...>
<Host appbase="app1" ...>
...
</Host>
</Engine>
</Service>
<Service name="app2">
<Connector .../>
<Engine ...>
<Host appbase="app2" ...>
...
</Host>
</Engine>
</Service>
答案 2 :(得分:-1)
还有一个选项是使用序列化。在一个应用程序中序列化数据并在另一个应用程序中读取相同内容。