requestcontextlistener 和contextloaderlistener 可以在web.xml中同时配置么

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了requestcontextlistener 和contextloaderlistener 可以在web.xml中同时配置么相关的知识,希望对你有一定的参考价值。

在SSH2、SSM等web应用开发框架的配置过程中,因为都要用到spring,所以,往往我们首先都要配置Spring。Spring配置过程中要考虑两个监听器:ContextLoaderListener与RequestContextListener。这两个监听器是什么意思?是不是两个监听器都需要配置?它们之间到底存在什么关系?下面,根据实验和网上的资料解释,我将汇总如下:

ContextLoaderListener与RequestContextListener
ContextLoaderListener
ContextLoaderListener extends ContextLoader implements ServletContextListener。

ServletContextListener extends EventListener。
ServletContextListener只负责监听Web容器的启动和关闭的事件。

ContextLoaderListener(或ContextLoaderServlet)将Web容器与spring容器进行整合。

这是使用Spring 必须配置 的:

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
1
2
3
1
2
3
Spring配置文件的声明:

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
1
2
3
4
1
2
3
4
如果没有显式声明,则 系统默认 在WEB-INF/applicationContext.xml。

在一个团队使用Spring的实际项目中,应该需要多个Spring的配置文件,如何使用和交叉引用的问题:
如果想装入多个配置文件,可以用逗号作分隔符,如:
参考技术A 在SSH2、SSM等web应用开发框架的配置过程中,因为都要用到Spring,所以,往往我们首先都要配置Spring。Spring配置过程中要考虑两个监听器:ContextLoaderListener与RequestContextListener。这两个监听器是什么意思?是不是两个监听器都需要配置?它们之间到底存在什么关系?下面,根据实验和网上的资料解释,我将汇总如下:
ContextLoaderListener与RequestContextListener

ContextLoaderListener

ContextLoaderListener extends ContextLoader implements ServletContextListener。

ServletContextListener extends EventListener。
ServletContextListener只负责监听Web容器的启动和关闭的事件。

ContextLoaderListener(或ContextLoaderServlet)将Web容器与spring容器进行整合。

RequestContextListener有什么用

问题:

java.lang.IllegalStateException: No thread-bound request found:
Are you referring to request attributes outside of an actual web request,
or processing a request outside of the originally receiving thread?
If you are actually operating within a web request and still receive this message,
your code is probably running outside of DispatcherServlet/DispatcherPortlet:
In this case, use RequestContextListener or RequestContextFilter to expose the current request.

 

查询:

public class RequestContextListener
extends Object
implements ServletRequestListener
Servlet listener that exposes the request to the current thread, through both LocaleContextHolder and
 RequestContextHolder. To be registered as listener in web.xml.

Alternatively, Spring‘s RequestContextFilter and Spring‘s DispatcherServlet also expose the same request

context to the current thread. In contrast to this listener, advanced options are available there (e.g.

"threadContextInheritable"). This listener is mainly for use with third-party servlets, e.g. the JSF FacesServlet.

Within Spring‘s own web support, DispatcherServlet‘s processing is perfectly sufficient.

 

解释

疑问:在介绍webApplicationContext初始化时,我们已经通过ContextLoaderListener将web容器与

spring容器整合,为什么这里又要引入一个额外的RequestContextListener以支持Bean的另外3个作用域呢?

在整合spring容器时使用ContextLoaderListener,它实现了ServletContextListener监听器接口,

ServletContextListener只负责监听web容器启动和关闭的事件。

而RequestContextListener实现ServletRequestListener监听器接口,该监听器监听HTTP请求事件,web服务器

接收的每一次请求都会通知该监听器。

spring容器启动和关闭操作由web容器的启动和关闭事件触发,但如果spring容器中的Bean需要request,session,globalsession

作用域的支持,spring容器本身就必须获得web容器的HTTP请求事件,以HTTP请求的事件驱动Bean作用域的控制逻辑。

以上是关于requestcontextlistener 和contextloaderlistener 可以在web.xml中同时配置么的主要内容,如果未能解决你的问题,请参考以下文章

如何使用无 xml 配置添加 RequestContextListener?

在 Spring Boot 中配置 RequestContextListener

spring在service层获取session和request

SpringRequestContext源码阅读

Spring在service层获取session和request

Spring在service层获取session和request