ContextLoaderListener和RequestContextListener分别是做什么的?

9
我是一名有用的助手,可以为您提供文本翻译。

我有一个应用程序,使用了Spring框架。在我的web.xml文件中,我使用以下代码行:

<web-app>
     ....
     <listener>
          <listener-class>
             org.springframework.web.context.ContextLoaderListener
          </listener-class>
       </listener>
       <listener>
          <listener-class>
             org.springframework.web.context.request.RequestContextListener
          </listener-class>
       </listener>
       ....
</web-app>

他们是什么? 它们是强制性的吗?


2
你为什么要添加它们呢?你是直接复制粘贴别人的代码,而没有阅读相关文档吗? - BalusC
@BalusC,我一直在尝试深入一个例子并理解其中的每个部分 :) - mooksel
2个回答

11

org.springframework.web.context.ContextLoaderListener是Spring框架中的一个类。由于它实现了ServletContextListener接口,因此Servlet容器会在Web应用程序启动(contextInitialized)和关闭(contextDestroyed)时通知它。

它主要负责引导(以及有序关闭)Spring ApplicationContext。

参考:javadoc说:

引导监听器,用于启动和关闭Spring的根WebApplicationContext。简单地委托给ContextLoader以及ContextCleanupListener。

org.springframework.web.context.request.RequestContextListener是同一框架中的另一个类。它的javadoc说:

Servlet 2.4+监听器,通过LocaleContextHolder和RequestContextHolder向当前线程公开请求。要在web.xml中注册为监听器。

或者,Spring的RequestContextFilter和Spring的DispatcherServlet也将相同的请求上下文公开给当前线程。与此侦听器不同,这里提供了高级选项(例如“threadContextInheritable”)。

该侦听器主要用于与第三方servlet一起使用,例如JSF FacesServlet。在Spring自己的Web支持中,DispatcherServlet的处理完全足够。

因此,在Spring MVC应用程序中通常不使用它,但允许在使用Spring ApplicationContext的JSF应用程序中使用请求或会话范围的bean。


我目前遇到了一个问题,假设RequestContextListener在xml配置中对"/"的所有http请求进行了过滤映射,而我为一个作用域为“session”的bean使用了aop配置,该bean不是通过url请求调用的,而是仅用于身份验证以调用另一个服务。此时,requestContextListener实际上错过了它,并且因此scope="session" 的bean会导致错误,提示当前线程中不可用Session。 - Dobidoo
@marked。恐怕我无法在简单的评论中回答这个问题。依我之见,您最好提出一个新问题,并将此问题作为参考,以展示您的研究成果。这样,您就可以添加更多关于配置的上下文和细节。如果您没有得到足够的答案,请随时在评论中提及我。 - Serge Ballesta

3

Listeners通常用于让容器通知您的应用程序事件,而不仅仅是Web请求。

例如,如果要在会话即将超时时得到通知,则可以扩展HttpSessionListener并实现sessionDestroyed()方法。然后,容器将在会话过期时调用该方法,您可以记录用户的登录时间以及会话过期的时间。

对于ContextLoaderListener来说,这使您可以启动应用程序非Web相关部分,以便在容器启动时立即运行,而不必等待某个Spring组件被触发。它使用前面在web.xml中设置的context-param contextConfigLocation来确定要启动的内容。

对于RequestContextListener,您将收到有关请求创建和删除的通知。

它们是否必要取决于您的应用程序架构。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接