25

Java webapp に多数のサーブレット コンテキスト リスナーがあり、それぞれが環境に関する情報を収集しています。

それらのいくつかは、別のリスナーによって収集された情報に依存しています。しかし、リスナーが登録されて呼び出される順序を特定できないため、コードを複製する必要があります。

リスナーが web.xml での順序で登録されていることは理解していますが、これは私には少しあいまいに聞こえます。あいまいすぎて信頼できません。

私の問題を解決する方法のヒントはありますか?

4

3 に答える 3

31

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

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

于 2008-10-07T14:58:13.833 に答える
10

なぜそれが曖昧なのですか?web.xml での順序付けは、それらが呼び出される順序です。これは、Java EE 仕様で非常に明確に述べられています。それに頼るのはまったく問題ありません。

于 2008-10-07T14:06:19.570 に答える
2

唯一のリスナーとして配置する ListenerManager を作成し、他のリスナーを含めることができるようです。イベントが発生したら、必要な順序 (おそらく、ListenerManager のコンストラクターで作成した順序) で他のリスナーをそれぞれ呼び出します。

残念ながら、これはリスナーを追加するときにコードが変更されることを意味しますが、プロパティ ファイルと create-from-class-name コードをうまく使用することでこれを回避できます。

于 2008-10-07T14:05:00.117 に答える