什么是监听器?
监听器是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对象中。页面展示在线人数即可。