2013-03-14 110 views
5

我有两个webapps在两个上下文中运行:c1,c2(都在root之后)。我在c1中放置了一个startupListener来共享一个变量,另一个在c2中检索它。在同一个tomcat的webapps之间共享对象

我在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的背景总是空的,我已经试过“/ c1','c1'。我错过了什么? (我使用的是tomcat6,如果有的话) 谢谢

+0

它是空检索的值,而不是我猜的背景? – 2013-03-14 08:47:32

+0

不,上下文为空,触发下一行的NPE。 – 2013-03-14 11:18:51

回答

2

您需要设置crossContext =启动多个服务真正。从Tomcat文档:

设置为true,如果你想 ServletContext.getContext这个应用程序中调用()成功返回的请求 调度此虚拟主机上运行的其他Web应用程序。 在安全意识环境中设置为false(缺省值),使 getContext()始终返回null。

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

+0

也看到这个问题http://stackoverflow.com/questions/661978/what-does-the-crosscontext-attribute-do-in-tomcat-does-it-enable-session-sharin – brad 2013-03-14 20:54:14

+0

嘿布拉德,我没有设置crossContext在应用程序c1中为true。 – 2013-03-15 01:24:56

+0

如果它对s/o有帮助:Brad的答案是正确的,但请注意crossContext = true在您的tomcat文件夹的config/context.xml中设置。 – 2013-03-15 06:32:00

-1

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

+0

OP在相同的JVM中询问了2个webapps,所以序列化并不需要 – brad 2013-03-14 20:55:36

0

问题:

有一个在应用程序初始化错配可能是APP2之前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> 
+0

嗨,我可以确认c2总是在c1之后启动,我手动按顺序启动它们。 – 2013-03-14 12:45:52