SpringMVC--RequestContextListener

来源:互联网 发布:dracut命令安装linux 编辑:程序博客网 时间:2024/06/12 12:06

简介

使用SpringMVC作为web应用的框架是一般都会涉及Request,Session等,RequestContextListener就是为此定义的。

详解

首先分清web容器和Spring容器的区别,这是两个东西,Web容器表示装载,执行和处理web应用的容器,比如Tomcat,Jetty等,而Spring容器则是BeanFactory,applicationContext,WebApplicationContext等。

在此之前讨论了ContextLoaderListener监听器的作用,它是针对web容器(Tomcat或Jetty等)的启动和关闭行为,在web容器启动时会通过事件获取ServletContext,同时初始化WebApplicationContext并把ServletContext实例注入到WebApplicationContext当中。

这里讨论的RequestContextListener则是监听客户端对web应用的每一个请求,当每一个请求到达的时候都会触发这个监听器执行,从源码可知它主要是获取当前请求实例并且将实例注入到一些公用的实例当中,我当前的猜想是,这些实例应该会被框架其他部分调用。

web应用在定义bean的时候有一个作用域的概念,主要有:singleton(默认),Propertype,还有WebApplicationContext独有的Request,Session,GlobalSession,具体有什么区别去查。如果Spring的Bean需要用到Request,Session,GlobalSession作用域就必须进行配置,目前知道的有两种方法

第一:低版本web容器

<filter>      <filter-name>RequestContextFilter</filter-name>      <filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>  </filter>  <filter-mapping>      <filter-name>RequestContextFilter</filter-name>      <servlet-name>/*</servlet-name>  </filter-mapping>  
第二:高版本web容器

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

RequestContextListener监听器源码:

public class RequestContextListener implements ServletRequestListener {private static final String REQUEST_ATTRIBUTES_ATTRIBUTE =RequestContextListener.class.getName() + ".REQUEST_ATTRIBUTES";@Overridepublic void requestInitialized(ServletRequestEvent requestEvent) {if (!(requestEvent.getServletRequest() instanceof HttpServletRequest)) {throw new IllegalArgumentException("Request is not an HttpServletRequest: " + requestEvent.getServletRequest());}HttpServletRequest request = (HttpServletRequest) requestEvent.getServletRequest();ServletRequestAttributes attributes = new ServletRequestAttributes(request);request.setAttribute(REQUEST_ATTRIBUTES_ATTRIBUTE, attributes);LocaleContextHolder.setLocale(request.getLocale());RequestContextHolder.setRequestAttributes(attributes);}@Overridepublic void requestDestroyed(ServletRequestEvent requestEvent) {ServletRequestAttributes attributes = null;Object reqAttr = requestEvent.getServletRequest().getAttribute(REQUEST_ATTRIBUTES_ATTRIBUTE);if (reqAttr instanceof ServletRequestAttributes) {attributes = (ServletRequestAttributes) reqAttr;}RequestAttributes threadAttributes = RequestContextHolder.getRequestAttributes();if (threadAttributes != null) {// We're assumably within the original request thread...LocaleContextHolder.resetLocaleContext();RequestContextHolder.resetRequestAttributes();if (attributes == null && threadAttributes instanceof ServletRequestAttributes) {attributes = (ServletRequestAttributes) threadAttributes;}}if (attributes != null) {attributes.requestCompleted();}}}


阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 党员不配合纪检调查工作怎么办 新同事老问问题怎么办 白色衣服染红色了怎么办 左腿膝盖内侧疼怎么办 差二本线几分怎么办 吃错东西了想吐怎么办 玩游戏扣的话费怎么办 转笔实在是不会怎么办 滑板l轴承沾水了怎么办 暗影格斗3闪退怎么办 暗影格斗3文档被删怎么办 dnf手残党偷学技能学不了怎么办 打篮球没热身膝盖酸痛是怎么办 无线路由器lan口少怎么办? 电脑ip设置乱了怎么办 监控拍我我偷钱怎么办 网吧上网密码忘记了怎么办 比熊犬晚上叫怎么办 刚买的狗一直叫怎么办 酒驾罚款2年没交怎么办 法院判罚款没有钱怎么办 有人朝你吐口水怎么办 孕妇用了六神花露水怎么办 出车祸人不赔钱怎么办 交通事故对方保险不签字怎么办 肇事车主联系不上怎么办 商标被别人申请无效宣告怎么办 淘宝上传宝贝没有品牌怎么办 萌虎白卡借款2000逾期了怎么办 最里面的牙齿烂了怎么办 金龙沉底不游怎么办 龙鱼尾巴烂了怎么办 微博忘了登录名和密码怎么办 新浪微博密码忘了怎么办 vivo手机用户密码忘了怎么办 微博登录名忘记了怎么办 微信忘记密码钱怎么办 微信密码申诉失败怎么办 微博密码被盗了怎么办 对公密码器丢了怎么办 手机qq忘记旧密码怎么办