我的Java webapp中有一堆servlet上下文监听器,每个都收集一些有关环境的信息。
其中一些依赖于另一个听众收集的信息。但我无法确定监听器的注册和调用顺序,因此我必须重复代码。
我理解听众是按照他们在web.xml中的顺序注册的,但这对我来说听起来有点模糊,太依赖于它了。
你是否有提示如何解决我的问题?
答案 0 :(得分:25)
所有servlet容器和Java EE容器都严格执行规范的这一部分。您可以依赖于按照您在web.xml中指定的顺序调用侦听器这一事实。
您可以拥有一个Application LEVEL数据结构(HashMap),每个Filter / Listener在遇到请求数据时都会对其进行更新。这将让每个Listener只更新必要的内容。您可以将公共代码放在基本侦听器中,这样就不会出现代码重复。
答案 1 :(得分:9)
为什么这模糊? web.xml中的排序非常具体地是它们被调用的顺序,它在Java EE规范中非常清楚地说明。依靠它完全可以。
答案 2 :(得分:2)
看起来您可以创建一个ListenerManager,您可以将其作为唯一的侦听器放置,并使其包含其他侦听器。当事件进入时,只需按照您需要的顺序调用其他每个监听器(可能是您在ListenerManager的构造函数中创建它们的顺序)。
不幸的是,这意味着在添加Listeners时会更改代码,但您可以通过巧妙使用属性文件和create-from-class-name代码来避免这种情况。