Jakarta ee ServletContextAttributeListener的AttributeReaded方法在同一web应用程序中也有ServletContextListener时执行两次
我面临着一个关于Jakarta ee ServletContextAttributeListener的AttributeReaded方法在同一web应用程序中也有ServletContextListener时执行两次,jakarta-ee,deployment-descriptor,servletcontextlistener,Jakarta Ee,Deployment Descriptor,Servletcontextlistener,我面临着一个关于ServletContextAttributeListener的问题 我有一个小型java EE web应用程序,我在其中创建了一个ServletContextAttribute: public class MyServletContextAttributeListener implements ServletContextAttributeListener{ public void attributeAdded(ServletContextAttrib
ServletContextAttributeListener
的问题
我有一个小型java EE web应用程序,我在其中创建了一个ServletContextAttribute
:
public class MyServletContextAttributeListener implements ServletContextAttributeListener{
public void attributeAdded(ServletContextAttributeEvent event){
System.out.println("Connection attribute added to ServletContext");
}
public void attributeRemoved(ServletContextAttributeEvent event){
}
public void attributeReplaced(ServletContextAttributeEvent event){
}
}
我在部署描述符中声明了我的侦听器,如下所示:
<listener>
<listener-class>com.example.listener.MyServletContextAttributeListener</listener-class>
</listener>
我还在部署描述符中声明了ServletContextListener
问题是,当我在apachetomcat
中启动我的应用程序时,attributeaded
方法会执行两次。当我删除ServletContextListener时,attributeAdded
方法运行一次
有人能解释一下为什么吗?
如何在部署描述符中同时声明ServletContextListener和ServletContextAttributeListener而不出现这种奇怪的行为?您看到哪个
属性被添加到ServletContext
了吗?打印要调用attributeaded
的属性的名称。使用ServletContextAttributeEvent#getName()
打印属性的名称。我认为连接不会被添加两次。其他内容可能正在向上下文中添加其他内容。好的!你说得对。我按照你的建议做了,两个不同的属性被添加到了ServletContext
:我明确定义的databaseConnection
属性,以及另一个名为org.apache.jasper.compiler.tldlocationcache
。我阅读了javadoc,它是一个容器,用于在web应用程序中全局访问标记库。由于我在应用程序中不使用JSP,所以将tomcat配置为不自动添加此属性是否安全?如果是,是否有一种方法不是通过编程而是通过使用tomcat配置文件来实现?
public class DatabaseInitializer implements ServletContextListener{
public void contextInitialized(ServletContextEvent event){
...
event.getServletContext().setAttribute("databaseConnection", connection);
...
}
}