同一个tomcat的webapps之间的共享对象

时间:2013-03-14 08:32:49

标签: java web-applications servlets tomcat6

我有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,如果这很重要) 感谢

3 个答案:

答案 0 :(得分:3)

您需要设置crossContext = true。来自tomcat docs:

  

如果您希望在此应用程序中进行调用,则设置为true   ServletContext.getContext()成功返回请求   在此虚拟主机上运行的其他Web应用程序的调度程序。   在安全意识环境中设置为false(默认值)   getContext()始终返回null。

http://tomcat.apache.org/tomcat-7.0-doc/config/context.html

答案 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)

还有一个选项是使用序列化。在一个应用程序中序列化数据并在另一个应用程序中读取相同内容。