从Tomcat应用程序中的不同侦听器之间获取Context中的属性

时间:2012-10-10 09:27:14

标签: java tomcat listener servletcontextlistener

我有一个Tomcat 7 webapp,我有两个不同的ServletContextListener

示例:

听众A

public class ListenerA implements ServletContextListener {

    public void contextInitialized(ServletContextEvent sce){

        ObjectA objectA = new ObjectA();
        context.setAttribute("objectA", objectA);
    }

    ...

}

听众B

public class ListenerB implements ServletContextListener {

    public void contextInitialized(ServletContextEvent sce){

        ObjectB objectB = new ObjectB();
        context.setAttribute("objectB", objectB);
    }

    ...

}

的web.xml

...

<listener>
   <description>ListenerA</description>
   <listener-class>com.example.web</listener-class>
</listener>
<listener>
    <description>ListenerB</description>
    <listener-class>com.example.web</listener-class>
</listener>

...

¿web.xml中的外观顺序是否影响加载过程,还是加载到不同的线程中?

我想知道是否可以从ListenerB中的上下文中获取ObjectA。我总是可以将两个侦听器合并为一个独特的侦听器,因此我可以在同一个侦听器中同时拥有对象A和B,但我想知道这是否可行。

我知道我可以选择使用来自attributeAdded接口的ServletContextAttributeEvent,但是,这是否足以完成工作,或者如果ListenerB在ListenerA之前加载,它会失败吗?

1 个答案:

答案 0 :(得分:1)

好的,所以我终于找到了答案here

  

J2EE容器的所有servlet容器都严格执行规范的这一部分。您可以依赖于按照您在web.xml中指定的顺序调用侦听器这一事实。

     

您可以拥有一个Application LEVEL数据结构(HashMap),每个Filter / Listener在遇到请求数据时都会对其进行更新。这将让每个Listener只更新必要的内容。您可以将公共代码放在基本侦听器中,这样就不会出现代码重复。

因此,加载顺序严格按 web.xml

中的出现顺序确定