Как определить порядок слушателей в web.xml
У меня есть куча слушателей контекста сервлета в моем Java webapp, каждый из которых собирает некоторую информацию об окружающей среде.
Некоторые из них зависят от информации, которая собирается другим слушателем. Но я не могу определить порядок регистрации и вызова слушателей, поэтому мне нужно дублировать код.
Я понимаю, что слушатели зарегистрированы в порядке их порядка в web.xml, но это звучит немного неопределенно для меня, слишком расплывчато, чтобы полагаться на него.
Есть ли у вас подсказка, как я могу решить свою проблему?
Ответы
Ответ 1
Все контейнеры сервлетов и контейнеры Java EE реализуют эту часть спецификации строго. Вы можете положиться на то, что слушатели вызываются в порядке, указанном в web.xml.
У вас может быть структура данных приложения LEVEL (HashMap), которая будет обновляться каждым фильтром/слушателем, когда она встречает данные из запросов. Это позволит каждому слушателю обновить только то, что необходимо. Вы можете поместить общий код в базовый прослушиватель, чтобы не было дублирования кода.
Ответ 2
Почему это расплывчато? Заказ в web.xml - это именно тот порядок, в котором они называются, это очень четко указано в спецификации Java EE. Это вполне нормально, чтобы полагаться на него.
Ответ 3
Казалось бы, вы можете создать ListenerManager, который вы помещаете в качестве своего единственного слушателя, и содержать в нем других Listeners. Когда событие приходит, просто вызовите каждого из других прослушивателей в нужном вам порядке (вероятно, порядок, который вы создали в конструкторе ListenerManager).
К сожалению, это означает изменение кода при добавлении Listeners, но вы можете избежать этого путем умного использования файлов свойств и кода типа-класса.