【问题标题】:Remove listener from ServletContext从 ServletContext 中移除监听器
【发布时间】:2013-07-14 10:23:47
【问题描述】:

我想知道如何从 ServletContext (http://docs.oracle.com/javaee/6/api/javax/servlet/ServletContext.html) 中删除 EventListener。后者提供了一个addListener 方法,但没有删除监听器。听众是否可能被弱引用所持有,并且可以通过失去所有强引用来取消注册?或者如果我的应用程序未部署会发生什么?监听器是否仍然处于活动状态?

【问题讨论】:

  • 为什么以及何时需要从上下文中删除 eventlistner ?场景是什么?
  • 我写了一个自定义的Servlet,它需要知道所有创建的会话。因此,我在Servletinit 方法中以编程方式添加了SessionListener。现在我想确保这个监听器不会在 Servlet 中存活,并想在 Servletdestroy 方法上取消注册监听器。
  • 你的方法是错误的。 SessionListener 用于 webApp 而不是 servlet。即使您访问其他一些 servlet,也会创建一个会话。
  • 好吧,我的 Servlet 是手动部署的,即在正在运行的服务器中并通过 addServlet 方法。 servlet 本身独立于任何其他应用程序。因此,没有其他办法。如果你的回答是对的,那么addListener这个方法就不应该存在了。

标签: java servlets listener servlet-3.0 servlet-listeners


【解决方案1】:

这不是问题的答案,我只想说几点。

后者提供了一个 addListener 方法,但没有删除监听器。

因为你需要先决定是否有一个监听器。看Javadoc

用于接收有关 ServletContext 生命周期更改的通知事件的接口。

为了接收这些通知事件,实现类必须在 Web 应用程序的部署描述符中声明,使用 WebListener 进行注释,或者通过 ServletContext 上定义的 addListener 方法之一进行注册。

addListener() 让您可以注册多种类型的侦听器,而不仅仅是ServletContextListener。如果您选择不在 web.xml 中预先声明侦听器,这只是一种可供您使用的方法。

给定的侦听器必须是以下一个或多个接口的实例:

  1. ServletContextAttributeListener
  2. ServletRequestListener
  3. ServletRequestAttributeListener
  4. HttpSessionListener
  5. HttpSessionAttributeListener

如果我的应用程序被取消部署会发生什么

所有侦听器对象都将与应用程序一起销毁。在部署 Web 应用程序时,在 Web 容器中实例化和注册监听器。

Listener 类是在 Web 应用程序部署描述符中使用 listener 元素声明的。它们按类名按调用顺序列出。在 Web 应用程序执行期间,侦听器按照注册的顺序被调用。在应用程序关闭时,侦听器按其声明的反向顺序收到通知,会话侦听器的通知先于上下文侦听器的通知。必须先通知会话侦听器会话失效,然后再通知上下文侦听器应用程序关闭。

【讨论】:

  • 为什么这不是我的问题的答案?非常感谢!
  • 什么时候可以调用addListener()方法?我通过在码头上托管的 servlet 过滤器调用它,我有一个 IllegalStateException
猜你喜欢
  • 2014-11-29
  • 2018-06-20
  • 1970-01-01
  • 1970-01-01
  • 2017-11-11
  • 1970-01-01
  • 2023-03-03
  • 2011-12-30
  • 1970-01-01
相关资源
最近更新 更多