zoukankan      html  css  js  c++  java
  • 初学Listener

    一. Listener 介绍

    Servlet API提供了大量监听器来监听web应用的的内部事件,从而允许当web内部事件发生时回调事件监听器内的方法。

    使用listener分为两步

    1. 定义LIstener实现类
    2. 通过注解或在web.xml文件中配置Listener

    1.1 实现listener类

    常用的web时间监听接口有如下几个。

    • ServletContextListener:用于监听应用的启动和关闭
    • ServletContextAttributeLIstener:用于监听ServletContext(application)范围属性的改变
    • ServletRequestListener:用于监听用户请求
    • ServletRequestAttributeListener:用于监听HttpServletRequest(equest)范围属性的改变
    • HttpSessionListener:用于监听用户Session的开始和结束
    • HttpSessionAttributeListener:用于监听HttpSession(session)范围的属性的改变

    下面先以ServletContextListener为例来介绍Listener的开发和使用。该listener实现了ServletContextListener接口,该接口包含如下两个方法。

    • contextInitialized(ServletContextEvent sce):启动web应用时,系统调用Listener的该方法
    • contextDestroy(ServletContextEvent sce):关闭web应用时,系统调用Listener的该方法

    下面创建一个获取数据库连接的Listener,该Listener会在应用启动时获取数据库连接,并将获取到的连接设置为application的属性。

    @WebListener()
    public class GetConnListener implements ServletContextListener{
    
        // Public constructor is required by servlet spec
        public GetConnListener() {
        }
    
        // -------------------------------------------------------
        // ServletContextListener implementation
        // -------------------------------------------------------
        public void contextInitialized(ServletContextEvent sce) {
          /* This method is called when the servlet context is
             initialized(when the Web application is deployed). 
             You can initialize servlet context related data here.
          */
          try{
              ServletContext application = sce.getServletContext();
              
              String driver = application.getInitParameter("driver");
              String url = application.getInitParameter("url");
              String user = application.getInitParameter("user");
              String pass= application.getInitParameter("pass");
              
              Class.forName(driver);
             Connection conn = DriverManager.getConnection(url,user,pass);
             application.setAttribute("conn",conn);
          }catch(Exception e)
            {
                System.out.println("系统获取数据库连接时出现异常"+e.getMessage());
          }
        }
    
        public void contextDestroyed(ServletContextEvent sce) {
          /* This method is invoked when the Servlet Context 
             (the Web application) is undeployed or 
             Application Server shuts down.
          */
          ServletContext application = sce.getServletContext();
          Connection conn = (Connection)application.getAttribute("conn");
          if(conn != null){
              try{
                  conn.close();
              }catch(SQLException e){
                  e.printStackTrace();
              }
          }
          
        }
    }

    1.2 配置Listener

    配置Listener十分简单,有两种方式

    • 使用@WebListener修饰Listener实现类,无需指定任何属性
    • 在web.xml文件中使用<listener.../>子元素配置
      <!--配置Listener的实现类-->
          <listener>
              <listener-class>java.gdut.Listener.GetConnListener</listener-class>
          </listener>

    二. 一些常用的监听器和它们常用的方法

    2.1 使用ServletContextAttributeListener

    ServletContextAttributeListener用于监听ServletContext(application)范围属性的变化

    它包含如下三个方法

    • attributeAdd(ServletContextAttributeEven e):当程序把一个属性存入application范围时触发该方法
    • attributeRemoved(ServletContextAttributeEven e):当程序把一个属性从application范围删除时触发该方法
    • attributeReplaced(ServletContextAttributeEven e):当程序更换application范围属性时触发该方法

    2.2 使用ServletRequestListener和ServletRequestAttributeListener

    ServletRequestListener用于监听用户请求的到达,实现该接口的实现类需要实现以下两个方法

    • requestInitialized(ServletRequestEven sre):用户请求到达,被初始化时触发该方法。
    • requestDestroy(ServletRequestEven sre):用户请求结束,被销毁时触发该方法

    ServletRequestAttributeListener用于监听ServletRequest(request)范围属性的变化

    • attributeAdd(ServletRequestAttributeEven e):当程序把一个属性存入request范围时触发该方法
    • attributeRemoved(ServletRequestAttributeEven e):当程序把一个属性从request范围删除时触发该方法
    • attributeReplaced(ServletRequestAttributeEven e):当程序更换request范围属性时触发该方法

     

    2.3 使用HttpSessiontListener和HttpSessionAttributeListener

    HttpSessionListener用于监听用户session的创建和销毁,实现接口的监听器需要实现如下两个方法。

    • sessionCreated(HttpSession se):用户与服务器的会话开始,创建时触发该方法
    • sessionDestroy(HttpSession se):用户与服务器断开,销毁时触发该方法

    HttpSessionAttributeListener用于监听HttpSession(session)范围的属性的变化,实现接口的监听器需要实现如下三个方法。

    • attributeAdd(HttpSessionAttributeEven e):当程序把一个属性存入session范围时触发该方法
    • attributeRemoved(HttpSessionAttributeEven e):当程序把一个属性从session范围删除时触发该方法
    • attributeReplaced(HttpSessionAttributeEven e):当程序更换session范围属性时触发该方法

    实现HttpSessionListener接口的监听器可以监听每个用户的会话的开始和断开,因此应用可以通过监听器监听系统的在线用户。 

    @WebListener()
    public class OnlineListener implements HttpSessionListener {
    
        // -------------------------------------------------------
        // HttpSessionListener implementation
        // -------------------------------------------------------
        public void sessionCreated(HttpSessionEvent se) {
            /* Session is created. */
            HttpSession session = se.getSession();
            ServletContext application = session.getServletContext();
            String sessionId = session.getId();
            if(session.isNew()){
              String user = (String)session.getAttribute("user");
              user = (user == null)?"游客":"user";
                Map<String,String> online = (Map<String,String>)application.getAttribute("online");
                if(online == null){
                    online = new Hashtable<String,String>();
                }
                online.put(sessionId,user);
                application.setAttribute("online",online);
            }
            
        }
    
        public void sessionDestroyed(HttpSessionEvent se) {
            /* Session is destroyed. */
            HttpSession session = se.getSession();
            ServletContext application = session.getServletContext();
            String sessionId = session.getId();
            Map<String,String> online = (Map<String,String>)application.getAttribute("online");
            if(online != null){
                online.remove(sessionId);
            }
            application.setAttribute("online",online);
        }
    
        
    }
  • 相关阅读:
    poj1631 LIS 裸题
    UESTC 电子科大专题训练 DP-N
    UESTC 电子科大专题训练 DP-M
    UESTC 电子科大专题训练 DP-D
    Codeforces Round #424 D
    Codeforces Round #424 C
    Codeforces Round #424 B
    Codeforces Round #424 A
    hiho一下159
    hiho一下158(hihocoder 1318)
  • 原文地址:https://www.cnblogs.com/yumiaoxia/p/9037720.html
Copyright © 2011-2022 走看看