我有一个应用程序,我在使用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>
他们是什么? 它们是强制性的吗?
答案 0 :(得分:6)
org.springframework.web.context.ContextLoaderListener
是Spring框架中的一个类。在实现ServletContextListener
接口时,servlet容器会在启动(contextInitialized
)和关闭(contextDestroyed
)Web应用程序时通知它。
它专门负责Spring ApplicationContext的引导(并有序关闭)。
参考:javadoc说:
Bootstrap监听器启动并关闭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
答案 1 :(得分:2)
通常,监听器是容器通知应用程序事件的一种方式,而不仅仅是Web请求。
例如,要在会话超时时收到通知,您需要扩展HttpSessionListener并实现sessionDestroyed()方法。然后容器会在会话到期时调用它,您可以将其与该用户的登录时间一起记录。
对于ContextLoaderListener,这使您可以在容器启动时启动应用程序的非Web相关部分,而不是等待某人点击您的某个弹簧组件。它使用web.xml中先前设置的context-param contextConfigLocation来了解要启动的内容。
对于RequestContextListener,您会收到有关请求创建和删除的通知。
是否有必要取决于应用的架构。