Как определить порядок слушателей в web.xml - PullRequest
22 голосов
/ 07 октября 2008

В моем веб-приложении Java есть группа прослушивателей контекста сервлета, каждый из которых собирает некоторую информацию об окружающей среде.

Некоторые из них зависят от информации, которую собирает другой слушатель. Но я не могу определить порядок регистрации и вызова слушателей, поэтому мне приходится дублировать код.

Я понимаю, что слушатели регистрируются в порядке их следования в web.xml, но для меня это звучит немного расплывчато, слишком расплывчато, чтобы на это полагаться.

У вас есть подсказка, как я могу решить мою проблему?

Ответы [ 3 ]

26 голосов
/ 07 октября 2008

Все контейнеры сервлетов и контейнеры Java EE строго реализуют эту часть спецификации. Вы можете положиться на тот факт, что слушатели вызываются в порядке, указанном в web.xml.

У вас может быть структура данных уровня приложения (HashMap), которая будет обновляться каждым фильтром / прослушивателем при получении данных из запросов. Это позволит каждому слушателю обновлять только то, что необходимо. Вы можете поместить общий код в базовый прослушиватель, чтобы избежать дублирования кода.

9 голосов
/ 07 октября 2008

Почему это расплывчато? Порядок в web.xml очень точно соответствует порядку их вызова, это очень четко указано в спецификации Java EE. На это можно положиться.

2 голосов
/ 07 октября 2008

Казалось бы, вы можете создать ListenerManager, который вы поместите в качестве единственного слушателя, и он будет содержать других слушателей. Когда событие наступает, просто вызовите каждого из других слушателей в том порядке, в котором вы нуждаетесь (возможно, в том порядке, в котором вы их создали в конструкторе ListenerManager).

К сожалению, это означает изменение кода при добавлении прослушивателей, но этого можно избежать с помощью умного использования файлов свойств и кода create-from-class-name.

...