Listener监听器

什么是监听器?

        监听器是Servlet规范中的一员。就像Filter一样。Filter也是Servlet规范中的一员。

        在Servlet中,所有的监听器接口都是以“Listener”结尾。

 

监听器有什么用?

        监听器实际上是Servlet规范留给我们javaweb程序员的特殊时机。

        特殊的时刻如果想执行某段代码,你需要想到使用相对应的监听器。

Servlet规范中提供了哪些监听器?

        jakarta.servlet包下:

                1.ServletContextListener                              (ServletContext对象监听器)

                2.ServletContextAttributeListener

                3.ServletRequestListener                              (ServletRequest对象监听器)

                4.ServletRequestAttributeListener

 

        jakarta.servlet.http包下:

                5.HttpSessionListener                                     (Session对象监听器)

                6.HttpSessionAttributeListener

                        该监听器需要使用@WebListener注解进行标注。

                        该监听器监听的是:是session域中数据的变化。只要数据变化,则执行相应的方法。主要监测点在session域中数据的变化上。

 

                7.HttpSessionBindingListener

                        该监听器不需要使用@WebListener进行标注。

 

                        假设User类实现了该监听器,那么User对象在被放入session域的时候会触发bind事件,User对象从session中删除的时候,会触发unbind事件。

 

                        假设Customer类没有实现该监听器,那么Customer对象放入session域或者从session域中删除的时候,不会触发bind和unbind事件。

                8.HttpSessionIdListener

                        session的id发生改变的时候,监听器中的唯一一个方法就会被调用。

                9.HttpSessionActivationListener

                        监听session对象的钝化和活化的。

                                钝化:session对象从内存存储到硬盘文件。

                                活化:从硬盘文件把session恢复到内存。

 

实现一个监听器的步骤:以ServletContextListener为例。

        第一步:编写一个类实现ServletContextListener接口。并且实现里面的方法。

                //这个方法是在ServletContext对象(也就是全局作用域对象)被创建的时候,web服务器去自动调用。

                void contextInitialized(ServletContextEvent event)

                //这个方法是在ServletContext对象(也就是全局作用域对象)被销毁的时候,web服务器去自动调用。

                void contextDestroyed(ServletContextEvent event)

 

        第二步:在web.xml文件中对ServletContextListener进行配置,如下:

                <listener>
                   <listener-class>
                       com.bjpowernode.javaweb.listener.MyServletContextListener
                   </listener-class>
                </listener>

                当然,第二步也可以不使用配置文件,也可以用注解,例如:@WebListener

 

注意:  所有监听器中的方法都是不需要javaweb程序员调用的,它们是由服务器来负责调用的,其调用时机是当某个特殊的事件发生(特殊的事件发生其实就是某个时机到了。)之后,被web服务器自动调用。

 

思考一个业务场景:(监听器的应用)

1.请编写一个功能,记录该网站实时的在线用户的个数。

        我们可以通过统计服务器端session对象的个数来实现,因为一个session代表了一个用户。有一个session就代表有一个用户。如果你采用这种逻辑去实现的,session的个数就是在线用户的数量。使用HttpSessionListener够用了。session对象只要新建,则count++,然后将count存储到ServletContext域当中,在页面展示在线人数即可。

 

2.当业务发生改变了,只统计登录的用户的在线数量。

        session.setAttribute("user", userObj);  用户登录的标志是什么?session中曾经存储过User类型的对象。那么这个时候可以让User类型的对象实现HttpSessionBindingListener监听器,只要User类型对象存储到session域中,则count++,然后将count++存储到ServletContext对象中。页面展示在线人数即可。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值