我有一个Tomcat 7 webapp,我有两个不同的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之前加载,它会失败吗?
答案 0 :(得分:1)
好的,所以我终于找到了答案here
J2EE容器的所有servlet容器都严格执行规范的这一部分。您可以依赖于按照您在web.xml中指定的顺序调用侦听器这一事实。
您可以拥有一个Application LEVEL数据结构(HashMap),每个Filter / Listener在遇到请求数据时都会对其进行更新。这将让每个Listener只更新必要的内容。您可以将公共代码放在基本侦听器中,这样就不会出现代码重复。
因此,加载顺序严格按 web.xml
中的出现顺序确定