`
xudongcsharp
  • 浏览: 467500 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Servlet Listener

 
阅读更多
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


  
 /** 
     *  
     */  
    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);  
        }  
    }  



Web.xml

    <listener>  
        <listener-class>com.ee.listener.OnlineUserListener</listener-class>  
    </listener> 



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>  

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics