Listener

3、Listener功能

它是基于观察者模式设计的,Listener 的设计对开发 Servlet 应用程序提供了一种快捷的手段,能够方便的从另一个纵向维度控制程序和数据。目前 Servlet 中提供了 5 种两类事件的观察者接口,它们分别是:4 个 EventListeners 类型的,ServletContextAttributeListener、ServletRequestAttributeListener、ServletRequestListener、HttpSessionAttributeListener  和 2 个 LifecycleListeners 类型的,ServletContextListener、HttpSessionListener

 

Listener是Servlet的监听器,它可以监听客户端的请求、服务端的操作等。通过监听器,可以自动激发一些操作,比如监听在线的用户的数量。当增加一个HttpSession时,就激发sessionCreated(HttpSessionEvent se)方法,这样就可以给在线人数加1。常用的监听接口有以下几个:

ServletContextAttributeListener监听对ServletContext属性的操作,比如增加、删除、修改属性。

 

ServletContextListener监听ServletContext。当创建ServletContext时,激发contextInitialized(ServletContextEvent sce)方法;当销毁ServletContext时,激发contextDestroyed(ServletContextEvent sce)方法。

 

HttpSessionListener监听HttpSession的操作。当创建一个Session时,激发session Created(HttpSessionEvent se)方法;当销毁一个Session时,激发sessionDestroyed (HttpSessionEvent se)方法。

 

HttpSessionAttributeListener监听HttpSession中的属性的操作。当在Session增加一个属性时,激发attributeAdded(HttpSessionBindingEvent se) 方法;当在Session删除一个属性时,激发attributeRemoved(HttpSessionBindingEvent se)方法;当在Session属性被重新设置时,激发attributeReplaced(HttpSessionBindingEvent se) 方法。

 

下面我们开发一个具体的例子,这个监听器能够统计在线的人数。在ServletContext初始化和销毁时,在服务器控制台打印对应的信息。当ServletContext里的属性增加、改变、删除时,在服务器控制台打印对应的信息。

 

要获得以上的功能,监听器必须实现以下3个接口:

 

HttpSessionListener

 

ServletContextListener

 

ServletContextAttributeListener

jsp页面

<%@ page language="java" contentType="text/html; charset=UTF-8"  

  •     pageEncoding="UTF-8"%>  
  • <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  • <html>  
  • <head>  
  • <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  • <title>主页</title>  
  • </head>  
  • <body>  
  •     <h4>你好!</h4>  
  •     在线人数:<h1><%=request.getSession().getAttribute("onlineUserCount") %></h1>  
  • </body>  
  • </html>  

 

Web.xml

[html] view plaincopy
 
  1. <listener>  
  2.     <listener-class>com.ee.listener.OnlineUserListener</listener-class>  
  3. </listener>  

/** 

  •  *  
  •  */  
  • package com.ee.listener;  
  •   
  • import javax.servlet.ServletContextAttributeEvent;  
  • import javax.servlet.ServletContextAttributeListener;  
  • import javax.servlet.ServletContextEvent;  
  • import javax.servlet.ServletContextListener;  
  • import javax.servlet.http.HttpSessionEvent;  
  • import javax.servlet.http.HttpSessionListener;  
  •   
  • /** 
  •  * @author Administrator 
  •  * 
  •  */  
  • public class OnlineUserListener implements HttpSessionListener,  
  •         ServletContextListener, ServletContextAttributeListener {  
  •     private long onlineUserCount = 0;  
  •   
  •     public long getOnlineUserCount() {  
  •         return onlineUserCount;  
  •     }  
  •   
  •     /* (non-Javadoc) 
  •      * @see javax.servlet.ServletContextAttributeListener#attributeAdded(javax.servlet.ServletContextAttributeEvent) 
  •      */  
  •     @Override  
  •     public void attributeAdded(ServletContextAttributeEvent arg0) {  
  •   
  •     }  
  •   
  •     /* (non-Javadoc) 
  •      * @see javax.servlet.ServletContextAttributeListener#attributeRemoved(javax.servlet.ServletContextAttributeEvent) 
  •      */  
  •     @Override  
  •     public void attributeRemoved(ServletContextAttributeEvent arg0) {  
  •   
  •     }  
  •   
  •     /* (non-Javadoc) 
  •      * @see javax.servlet.ServletContextAttributeListener#attributeReplaced(javax.servlet.ServletContextAttributeEvent) 
  •      */  
  •     @Override  
  •     public void attributeReplaced(ServletContextAttributeEvent attributeEvent) {  
  •         System.err.println("...attributeReplaced...");  
  •     }  
  •   
  •     /* (non-Javadoc) 
  •      * @see javax.servlet.ServletContextListener#contextDestroyed(javax.servlet.ServletContextEvent) 
  •      */  
  •     @Override  
  •     public void contextDestroyed(ServletContextEvent arg0) {  
  •   
  •     }  
  •   
  •     /* (non-Javadoc) 
  •      * @see javax.servlet.ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent) 
  •      */  
  •     @Override  
  •     public void contextInitialized(ServletContextEvent arg0) {  
  •   
  •     }  
  •   
  •     /* (non-Javadoc) 
  •      * @see javax.servlet.http.HttpSessionListener#sessionCreated(javax.servlet.http.HttpSessionEvent) 
  •      */  
  •     @Override  
  •     public void sessionCreated(HttpSessionEvent httpSessionEvent) {  
  •         onlineUserCount ++;  
  •         toUpdateCount(httpSessionEvent);  
  •     }  
  •   
  •     /* (non-Javadoc) 
  •      * @see javax.servlet.http.HttpSessionListener#sessionDestroyed(javax.servlet.http.HttpSessionEvent) 
  •      */  
  •     @Override  
  •     public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {  
  •         onlineUserCount --;  
  •         toUpdateCount(httpSessionEvent);  
  •     }  
  •   
  •     private void toUpdateCount(HttpSessionEvent httpSessionEvent){  
  •         httpSessionEvent.getSession().setAttribute("onlineUserCount", onlineUserCount);  
  •     }  
  • }  

 

posted @ 2017-07-25 10:30  超重语言  阅读(248)  评论(0编辑  收藏  举报