全栈 | 如何在微服务或Tomcat中配置使用Listener

853 阅读3分钟

作为前端开发人员,精通前端的同时,也需要熟悉后台。下面介绍Web应用中常用的监听器。

1. ServletContextListener监听

ServletContextListener:用于对Servlet整个上下文进行监听(创建、销毁)。在微服务中监听app的启动和停止,可以在应用启动时设置全局参数,创建数据库连接池等。


                

public class MyServletContextListener implements ServletContextListener{

    @Override

    public void contextDestroyed(ServletContextEvent arg0) {

        System.out. println("destroyed");

    }

    @Override

    public void contextInitialized(ServletContextEvent event) {

        System.out. println("initialized");

        event.getServletContext(). setAttribute("user", "admin");

    }

}


2. HttpSessionListener监听

用户监听客户端会话的创建和销毁。

可以统计在线用户数,设置会话参数等


import javax.servlet.http.HttpSessionListener; 

public class SessionCounter implements HttpSessionListener { 

private static int activeSessions =0; 

/* Session创建事件 */

public void sessionCreated (HttpSessionEvent se) { 

      ServletContext ctx = event.getSession( ).getServletContext ( ); 

        Integer numSessions = (Integer) ctx .getAttribute("numSessions"); 

        if (numSessions == null) { 

            numSessions = new Integer(1); 

        } 

        else { 

            int count = numSessions.intValue( ); 

            numSessions = new Integer(count + 1); 

        } 

        ctx.setAttribute( "numSessions", numSessions); 

/* Session失效事件 */

public void sessionDestroyed (HttpSessionEvent se) { 

  ServletContext ctx= se.getSession().getServletContext(); 

  Integer numSessions = (Integer)ctx. getAttribute("numSessions"); 

   if(numSessions == null ) 

            numSessions = new Integer(0); 

        } 

        else { 

            int count = numSessions.intValue( ); 

            numSessions = new Integer(count - 1); 

        } 

        ctx.setAttribute("numSessions", numSessions);

  } 

}


3. ServletRequestListener监听

  用于监听客户端请求,可以跟踪用户访问轨迹,设置请求参数等。


public class MyServletRequestListener implements ServletRequestListener {

    @Override

    public void requestDestroyed(ServletRequestEvent arg0) {

        System.out. println("requestDestroyed" + "," + new Date ());

        System.out. println("当前访问次数:" + arg0 .getServletContext().getAttribute("count" ));

    }

    @Override

    public void requestInitialized(ServletRequestEvent arg0) {

        System.out. println("requestInitialized" + "," + new Date ());

        Object count = arg0.getServletContext(). getAttribute("count");

        Integer cInteger = 0;

        if (count != null) {

            cInteger = Integer .valueOf(count.toString());

        }

        System.out. println("历史访问次数::" + count);

        cInteger++;

        arg0.getServletContext(). setAttribute("count", cInteger);

    }

}


以上三类Listener在web.xml中配置。

<listener>      <listener-class>demo.listener.MyServletContextListener</listener- class

</listener> 

<listener>      <listener-class>demo.listener.SessionCounter</listener-class

</listener> 

<listener>      <listener-class>demo.listener.MyServletRequestListener</listener- class

</listener> 

4. Web容器的Listener

  由特定的web容器提供,用于监听容器的启动和停止。可以在容器启动时初始化数据库连接池(跨app)。也可以获取容器实力,动态加载APP。以下以Tomcat为例,需要实现LifecycleListerner接口。再讲打开编译成jar包,放在tomcat安装目录下的lib中,并在conf/server.xml文件中配置。


public class MyLifecycleListener implements LifecycleListener{

     public void lifecycleEvent(LifecycleEvent event) { 

         System.out. println("组件类型:"+event. getLifecycle()); 

         System.out. println("生命周期阶段 : "+event. getType());

        }

     }

}


配置Tomcat/conf/server.xml, 加上一句 <Listener className="com.test.listener.MyListener" />