6

我有 2 个 webapps 在两个上下文中运行:c1、c2(都紧跟在根之后)。我在 c1 中放了一个 startupListener 来共享一个变量,在 c2 中放另一个来检索它。

我在 c1 中的启动监听器是:

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

4

3 回答 3

3

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

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

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

于 2013-03-14T20:53:32.510 回答
0

问题:

app初始化不匹配可能是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>
于 2013-03-14T08:44:51.327 回答
-1

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

于 2013-03-14T08:44:12.790 回答