监听器概述
监听你的web应用,监听许多信息的初始化,销毁,增加,修改,删除值等
监听器用于监听一些重要事件的发生,监听器对象可以在事情发生前、发生后可以做一些必要的处理。
1.Listener是Servlet的监听器
2.可以监听客户端的请求、服务端的操作等。
3.通过监听器,可以自动激发一些操作,如监听在线用户数量,当增加一个HttpSession时,给在线人数加1。
4.编写监听器需要实现相应的接口
5.编写完成后在web.xml文件中配置一下,就可以起作用了
6.可以在不修改现有系统基础上,增加web应用程序生命周期事件的跟踪
监听器类型
按监听的对象划分:servlet2.4规范定义的事件有三种:
1.用于监听应用程序环境对象(ServletContext)的事件监听器
1.1 ServletContextListener
用于监听application启动和销毁的事件
1.2 ServletContextAttributeListener 用于于监听application属性改变的事件包括:增加属性、删除属性、修改属性
2.用于监听用户会话对象(HttpSession)的事件监听器
2.1 HttpSessionListener
用于监听session启动和销毁的事件
2.2 HttpSessionAttributeListener
用于于监听session属性改变的事件包括:增加属性、删除属性、修改属性
3.用于监听请求消息对象(ServletRequest)的事件监听器
3.1 ServletRequestListener
用于监听request启动和销毁的事件
3.2 ServletRequestAttributeListener
用于于监听request属性改变的事件包括:增加属性、删除属性、修改属性
/** * * 在一个web应用程序的整个运行周期内, * web容器会创建和销毁三个重要的对象, * ServletContext,HttpSession,ServletRequest。 * * * jsp内置的Application = servlet内置的servletContext * jsp内置的request = servlet内置的servletRequest * jsp内置的session = servlet内置的httpsession * * * */
package com.dxy.listener; import java.util.HashMap; import java.util.Map; import javax.servlet.ServletContext; import javax.servlet.ServletContextAttributeEvent; import javax.servlet.ServletContextAttributeListener; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.ServletRequest; import javax.servlet.ServletRequestAttributeEvent; import javax.servlet.ServletRequestAttributeListener; import javax.servlet.ServletRequestEvent; import javax.servlet.ServletRequestListener; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionAttributeListener; import javax.servlet.http.HttpSessionBindingEvent; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; public class ListenerTest implements ServletContextListener,ServletContextAttributeListener, ServletRequestListener,ServletRequestAttributeListener, HttpSessionListener,HttpSessionAttributeListener{ //servlet内置对象 private ServletContext application; private ServletRequest request; private HttpSession session; //存放session对象 private Map<String,String> sessionMap = new HashMap<String, String>(); public ListenerTest(){ System.out.println("监听器Listener 构造函数初始化"); } /** * * Application * */ //ServletContextListener (监听应用程序application) // 用于监听WEB 应用启动和销毁的事件,监听器类需要实现 //ServletContextEvent含有getServletContext()方法取得application对象; @Override public void contextDestroyed(ServletContextEvent servletContextEvent) { //在web容器初始化是就调用 System.out.println("监听器Application 销毁"); } @Override public void contextInitialized(ServletContextEvent servletContextEvent) { //当web容器销毁时调用 System.out.println("监听器Application 初始化"); application = servletContextEvent.getServletContext(); application.setAttribute("sessionMap", sessionMap); } //* ServletContextAttributeListener (监听应用程序application) //* 用于监听WEB应用属性改变的事件,包括:增加属性、删除属性、修改属性 @Override public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) { //当调用application.setAttribute()时调用 System.out.println("属性监听器Application 增加"); } @Override public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) { //当调用applcaition.removeAttribute()时调用 System.out.println("属性监听器Application 删除"); } @Override public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) { //当调用两次application.setAttribute()赋予相同属性时调用 System.out.println("属性监听器Application 修改"); } /** * * Request * */ // ServletRequestListener (监听请求消息request) //(1)getServletContext(); //(2)getServletRequest(); @Override public void requestDestroyed(ServletRequestEvent servletRequestEvent) { //当请求结束时会调用 System.out.println("监听器Request 销毁"); } @Override public void requestInitialized(ServletRequestEvent servletRequestEvent) { //当请求一个网页时会调用 System.out.println("监听器Request 初始化"); request = servletRequestEvent.getServletRequest(); } // ServletRequestAttributeListener (监听请求消息request) @Override public void attributeAdded(ServletRequestAttributeEvent servletRequestAttributeEvent) { //当调用request.setAttribute()时调用 System.out.println("属性监听器Request增加"); } @Override public void attributeRemoved(ServletRequestAttributeEvent servletRequestAttributeEvent) { //当调用request.removeAttribute()时调用 System.out.println("属性监听器Request删除"); } @Override public void attributeReplaced(ServletRequestAttributeEvent servletRequestAttributeEvent) { //当调用两次request.setAttribute()赋予相同属性时调用 System.out.println("属性监听器Request修改"); } /** * * Session * session listener是针对所有session对象实例的,全局session列表中会有很多session */ //* HttpSessionListener (监听用户会话session) //* 用于监听Session对象的创建和销毁,监听器类需要实现 @Override public void sessionDestroyed(HttpSessionEvent httpSessionEvent) { //当调用session.invalidate();或超时 时调用 System.out.println("监听器session 销毁"); sessionMap.remove(session.getId()); } @Override public void sessionCreated(HttpSessionEvent httpSessionEvent) { //当调用关于session对象的方法时,比如session.getId() System.out.println("监听器session 初始化"); session = httpSessionEvent.getSession(); session.setMaxInactiveInterval(5); //设置session存活时间 //每一个新的session进来,放到map里面,然后存到application里面 sessionMap.put(session.getId(),"</br>sessionId:"+session.getId()+ "</br>lastTime:"+session.getLastAccessedTime()+"</br>createTime:"+session.getCreationTime()); } //* HttpSessionAttributeListener (监听用户会话session) //* 用于监听Session对象属性的改变事件,监听器类需要实现 @Override public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) { //当调用session.setAttribute()时调用 System.out.println("属性监听器Session 增加"); } @Override public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) { //当调用session.removeAttribute()时调用 System.out.println("属性监听器Session 删除"); } @Override public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) { //当调用两次session.setAttribute()赋予相同属性时 System.out.println("属性监听器Session 修改"); } }
Listener 深入探究
最新推荐文章于 2022-10-16 12:56:39 发布