1

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

例子:

听众 A

public class ListenerA implements ServletContextListener {

    public void contextInitialized(ServletContextEvent sce){

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

    ...

}

听众乙

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,但我想知道这是否可能。

我知道我可以选择attributeAddedServletContextAttributeEvent界面使用,但是,这是否足以完成工作,或者如果 ListenerB 在 ListenerA 之前加载,它会失败吗?

4

1 回答 1

1

好的,所以我终于在这里找到了答案

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

您可以拥有一个应用程序级别数据结构 (HashMap),每个过滤器/侦听器在遇到来自请求的数据时都会对其进行更新。这将让每个 Listener 只更新必要的内容。您可以将公共代码放在基础侦听器中,这样就不会出现代码重复。

所以加载顺序严格由web.xml中出现的顺序决定

于 2012-10-11T08:43:53.530 回答