问题:
在 Servlet 技 术 中 我 们 学 习 了 request 、 session 、 application 作用域对象,其主要作用是实现数据的在不同 场景中的灵活流转。但是数据的具体流转过程我们是看不 到的,比如作用域对象是什么时候创建和销毁的,数据是 什么时候存取,改变和删除的。因为具体的流转过程看不 到,所以也就无法再指定的时机对数据和对象进行操作, 比如 session 销毁的时候,在线人数-1。
解决:
使用监听器
概念:
Servlet 监听器是 Servlet 规范中定义的一种特殊类,用 于监听 ServletContext、HttpSession 和 ServletRequest 等域 对象的创建与销毁事件,以及监听这些域对象中属性发生 修改的事件。
监听对象:
Request Session Application
监听内容:
创建、销毁、属性改变事件
监听作用:
在事件发生之前,之后进行一些处理,比如统计在线 人数
使用:
监听 request 监听 session 监听 application
案例:
统计网站在线人数。
/**
* 监听器的使用:
* 作用:
* 监听作用域对象request、session、application的创建、销毁和内容的改变
* 使用:
* 创建一个实现了指定接口的java类
* 监听request--->ServletRequestListener 监听request对象的创建和销毁
* requestInitialized(ServletRequestEvent sre)//创建
* requestDestroyed(ServletRequestEvent sre)//销毁
* 注意:
* 形参可以获取监听的request对象
* sre.getServletRequest();
* 监听request--->ServletRequestAttributeListener 监听request作用域数据的变更。
attributeAdded(ServletRequestAttributeEvent srae)
* attributeRemoved(ServletRequestAttributeEvent srae)
* attributeReplaced(ServletRequestAttributeEvent srae)
* 注意:形参可以获取被监听的数据
* srae.getName() 获取监听数据的键
* srae.getValue() 获取监听数据的值
* 监听session--->HttpSessionListener 监听session的创建和销毁
* sessionCreated(HttpSessionEvent se) 创建
* sessionDestroyed(HttpSessionEvent se) 销毁
* 注意:形参可以获取被监听的session对象
* se.getSession();
* 监听session--->HttpSessionAttributeListener 监听session数据的变更
* attributeAdded(HttpSessionBindingEvent event)
* attributeRemoved(HttpSessionBindingEvent event)
* attributeReplaced(HttpSessionBindingEvent event)
* 注意:形参可以获取被监听的数据
* event.getName() 获取数据的键名
* event.getValue() 获取数据的值
* 监听application--->ServletContextListener 监听application对象的初始化和销毁
* contextInitialized(ServletContextEvent sce) 初始化 服务器启动
* contextDestroyed(ServletContextEvent sce) 销毁 服务器关闭
* 注意:
* 形参可以获取当前application对象。
* sce.getServletContext();
监听application--->ServletContextAttributeListener 监听数据的变更
attributeAdded(ServletContextAttributeEvent event)
* attributeRemoved(ServletContextAttributeEvent event)
* attributeReplaced(ServletContextAttributeEvent event)
* 注意:
* 形参可以获取当前监听的数据
* event.getName() 获取数据的键名
* event.getValue() 获取数据的值
* 在web.xml中配置监听器类
* <listener>
<listener-class>com.bjsxt.listener.MyListener</listener-class>
</listener>
案例:
统计当前在线人数。
统计网页浏览器次数。
*
*/
参考代码:
ManagerSystem里的:
MyListener.java
TestServlet.java
web.xml