1

私はTomcat7Webアプリケーションを持っており、2つの異なるものがあり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の前にロードされた場合に失敗する可能性がありますか?

4

1 に答える 1

1

さて、私はついにここで答えを見つけました

すべてのサーブレットコンテナ、J2EEコンテナは、仕様のこの部分を厳密に実装します。web.xmlで指定した順序でリスナーが呼び出されるという事実に頼ることができます。

リクエストからのデータに遭遇すると、各フィルター/リスナーによって更新されるアプリケーションレベルのデータ構造(HashMap)を持つことができます。これにより、各リスナーは重要なものだけを更新できます。コードの重複がないように、共通コードをベースリスナーに配置できます。

したがって、ロードの順序は、web.xmlでの出現順序によって厳密に決定されます。

于 2012-10-11T08:43:53.530 に答える