问题:
在 Servlet 技 术 中 我 们 学 习 了 request 、 session 、
application 作用域对象,其主要作用是实现数据的在不同
场景中的灵活流转。但是数据的具体流转过程我们是看不
到的,比如作用域对象是什么时候创建和销毁的,数据是
什么时候存取,改变和删除的。因为具体的流转过程看不
到,所以也就无法再指定的时机对数据和对象进行操作,
比如 session 销毁的时候,在线人数-1。
概念:
Servlet 监听器是 Servlet 规范中定义的一种特殊类,用
于监听 ServletContext、HttpSession 和 ServletRequest 等域
对象的创建与销毁事件,以及监听这些域对象中属性发生
修改的事件。
1 /** 2 * 监听器的使用: 3 * 作用: 4 * 监听作用域对象request、session、application的创建、销毁和内容的改变 5 * 使用: 6 * 创建一个实现了指定接口的java类 7 * 监听request--->ServletRequestListener 监听request对象的创建和销毁 8 * requestInitialized(ServletRequestEvent sre)//创建 9 * requestDestroyed(ServletRequestEvent sre)//销毁 10 * 注意: 11 * 形参可以获取监听的request对象 12 * sre.getServletRequest(); 13 * 监听request--->ServletRequestAttributeListener 监听request作用域数据的变更。 14 attributeAdded(ServletRequestAttributeEvent srae) 15 * attributeRemoved(ServletRequestAttributeEvent srae) 16 * attributeReplaced(ServletRequestAttributeEvent srae) 17 * 注意:形参可以获取被监听的数据 18 * srae.getName() 获取监听数据的键 19 * srae.getValue() 获取监听数据的值 20 * 监听session--->HttpSessionListener 监听session的创建和销毁 21 * sessionCreated(HttpSessionEvent se) 创建 22 * sessionDestroyed(HttpSessionEvent se) 销毁 23 * 注意:形参可以获取被监听的session对象 24 * se.getSession(); 25 * 监听session--->HttpSessionAttributeListener 监听session数据的变更 26 * attributeAdded(HttpSessionBindingEvent event) 27 * attributeRemoved(HttpSessionBindingEvent event) 28 * attributeReplaced(HttpSessionBindingEvent event) 29 * 注意:形参可以获取被监听的数据 30 * event.getName() 获取数据的键名 31 * event.getValue() 获取数据的值 32 * 监听application--->ServletContextListener 监听application对象的初始化和销毁 33 * contextInitialized(ServletContextEvent sce) 初始化 服务器启动 34 * contextDestroyed(ServletContextEvent sce) 销毁 服务器关闭 35 * 注意: 36 * 形参可以获取当前application对象。 37 * sce.getServletContext(); 38 监听application--->ServletContextAttributeListener 监听数据的变更 39 attributeAdded(ServletContextAttributeEvent event) 40 * attributeRemoved(ServletContextAttributeEvent event) 41 * attributeReplaced(ServletContextAttributeEvent event) 42 * 注意: 43 * 形参可以获取当前监听的数据 44 * event.getName() 获取数据的键名 45 * event.getValue() 获取数据的值 46 * 在web.xml中配置监听器类 47 * <listener> 48 <listener-class>com.bjsxt.listener.MyListener</listener-class> 49 </listener> 50 案例: 51 统计当前在线人数。 52 统计网页浏览器次数。 53 * 54 * 55 */
public class MyListener implements ServletRequestListener,ServletRequestAttributeListener,HttpSessionListener,HttpSessionAttributeListener,ServletContextListener,ServletContextAttributeListener{ //request对象销毁 @Override public void requestDestroyed(ServletRequestEvent sre) { System.out.println("我被销毁了"); } //request对象创建 @Override public void requestInitialized(ServletRequestEvent sre) { System.out.println("我被创建了"); } //监听request作用域数据的添加 @Override public void attributeAdded(ServletRequestAttributeEvent srae) { System.out.println("request中增加了一条数据-"+srae.getName()+":"+srae.getValue()); } @Override public void attributeRemoved(ServletRequestAttributeEvent srae) { // TODO Auto-generated method stub } @Override public void attributeReplaced(ServletRequestAttributeEvent srae) { // TODO Auto-generated method stub } /*------------------------------------------------------------------------------*/ //监听session的创建 @Override public void sessionCreated(HttpSessionEvent se) { System.out.println("session被创建了"); } //监听session的销毁 @Override public void sessionDestroyed(HttpSessionEvent se) { System.out.println("session被销毁了"); } //监听session数据的表更 @Override public void attributeAdded(HttpSessionBindingEvent event) { System.out.println("session中增加了一条数据"+event.getName()+":"+event.getValue()); } @Override public void attributeRemoved(HttpSessionBindingEvent event) { // TODO Auto-generated method stub } @Override public void attributeReplaced(HttpSessionBindingEvent event) { // TODO Auto-generated method stub } /*------------------------------------------------------------------------------*/ @Override public void contextInitialized(ServletContextEvent sce) { System.out.println("application对象被初始化了"); } @Override public void contextDestroyed(ServletContextEvent sce) { System.out.println("application对象被销毁了"); } //监听application的数据变更 @Override public void attributeAdded(ServletContextAttributeEvent event) { System.out.println("application中存储了数据:"+event.getName()+":"+event.getValue()); } @Override public void attributeRemoved(ServletContextAttributeEvent event) { // TODO Auto-generated method stub } @Override public void attributeReplaced(ServletContextAttributeEvent event) { // TODO Auto-generated method stub } }