`
rdman
  • 浏览: 82178 次
  • 性别: Icon_minigender_1
  • 来自: 陕西
社区版块
存档分类
最新评论

web监听器

阅读更多
今天学习了新的知识,也是java web里面的高级特性,监听器顾名思义就是监听某个对象的变化的,相当于现实世界中的侦探一样,时时刻刻监视着目标,一刻也不放松。这样就可以很形象的理解什么是监听器了,关于监听器的应用也是很复杂的,所以他的用途也是很广泛的,昨天学的过滤器有那么多用途,监听器也是如此。我觉得这两个就像是现实世界中的两个兄弟,如果两个兄弟一起工作,那将发挥更大的威力,暂时我还没有到达那个境界,没有资格谈论这两个一起用,只能单个的使用。下面总结下今天的知识点:

        监听器的主要作用就是监听,当目标发生变化的时候就会触发一定的方法,这也就是所谓的事件触发机制。在这种机制中要有三个要素,也就是事件,事件源,处理事件的方法。这三要素之间是相互制约的。一旦事件处理方法被触发必定有事件发生,也就可以得到触发 的事件,通过事件也就可以得到事件源,也就谁触发了事件,这样据可以将这三个要素联系在一起了。一个事件源可以有多个触发事件,而一个触发事件的发生将有多个方法来调用,这也就是所谓的一对多关系,通过一对多关系我们很容易从多端得到一端,相反从一端无法得到多端,这个道理大家都是很清楚的,所以也就可以很好的理解事件处理方法可以得到事件对象,事件对象又可以得到事件源。那么如何使用监听器来进行监听呢?大概的编程过程有两个步骤:首先建一个类实现事件监听器接口,然后在web部署描述文件中进行注册。注册时使用<listener>的子元素就可以了<listener-class>,因为监听的对象很明确了,所以不用再编写映射了。实现事件监听接口,监听器接口有很多,包括域对象的创建和销毁监听接口,和域对象属性的变化监听接口。域对象创建和销毁接口有三个,包括:ServletRequestListener,ServletContextListener,HttpSessionListener:。域对象的属性变化监视器接口也有四个:ServletRequestAttributeListener,ServletContextAttributeListener,HttpSessionAttributeListener,HttpSessionBindingListener。这些接口中一般有两到三个方法需要实现,一般包括域对象创建时触发的方法,如requestInitialized,contextInitialized,sessionCreated,还有包括域对象销毁时触发的方法,包括: requestDestroyed,contextDestroyed, sessionDestroyed方法,还有就是关于域对象的属性发生变化时触发的事件,主要包括属性的增加,属性的修改和属性的删除三个方法,我们以application为例列举一下关于监视域对象属性的方法:
void attributeAdded(ServletRequestAttributeEvent srae),
void attributeRemoved(ServletRequestAttributeEvent srae),
void attributeReplaced(ServletRequestAttributeEvent srae)。三个方法分别对应application对象的属性的增加,删除和修改时所触发的方法。关于request和session对象的属性监视器的方法和这个大概一致,基本上可以类推,在此我就不在列举了,在以后的实际使用的过程中学会举一反三就可以了,没必要把所有的东西都要搞的很清楚,我们学习的时候是要掌握学习的技巧,学习的方法,以及自己独立处理问题的能力,不能总是依靠老师。我觉得只要在以后的开发中我会使用我没有学过但是是我仔细琢磨出来的,这样就达到学习的目的了。因为关于软件开发这个领域更新的速度太快,我们要学会学习新的事物。
        下面谈论一下关于监听器的实际应用。这里在上课的时候老师讲的实例是统计现在有多少个用户在线,这里指明每一个用户对应一个session,有了这样的需求,我们其实就很有思路了。只要使用今天刚刚学习的监听器不就可以吗?session域对象在创建的时候和销毁的时候都会调用session监听器的相应方法,因此我们只要首先定义一个全局变量,然后在session创建的时候加一,在session销毁的时候就让这个变量减一就可以实现统计网站在线人数了。这个很简单,基本上不用怎么思考,一点难度也没有。下面的实例其实就是这个的一个升级,要统计现在网站上的在线IP的数量,这个稍微有点复杂了。我们首先这样考虑一个Ip 可以引发多个session,我们可以采用设置HashMap 变量onLineIPMap(不会有键重复) 来存储IP和session的数目,ip对应键,session 个数对应值,关键字的个数即为在线人数 。上线查看ip,如果onLineIPMap 中有,则加一;否则把ip 添加到onLineIPMap 并且记为1,我们可以使用ServletRequestListener监听器的这个方法来实现requestInitialized()  。还要考虑到一点就是必须是新创建的session 才有必要增加个数。 有人开始怀疑为什么不放在 HttpSessionListener.sessionCreated ?因为HttpSession         无法得到 ip ,而ServletRequest 可以得到ip,所以我们选用ServletRequest的监听器。下线查看ip,如果session 个数为1,则从onLineIPMap 删除该键;如果大于1 则session个数减一,这个就是使用HttpSessionListener.sessionDestroyed()这个方法来实现了。关于今天的实际应用收获还是挺大的。以后就会慢慢的接触项目了。  
分享到:
评论
1 楼 HF_SKY000 2012-10-28  
代码呢?能否发出来,谢谢!

554148338@qq.com

相关推荐

Global site tag (gtag.js) - Google Analytics