监听器(Listener)学习(一)

一 .监听器(Listener)

     监听器(Listener)可以监听客户端的请求、服务器端的操作。通过监听器可以自动触发一些事件,比如监听在线的用户数量。监听器对象可以在事件发生前、发生后做一些必要的处理。

 Listener接口和Event类

在web.xml中配置监听器的格式如下:

<listener>

    <listener-class>监听类</listener-class>

</listener>

在3.0以后 一般直接用注解即可 

@WebListener

 1.监听ServletContextListener的实例代码

/**
 * ServletContextListener接口用于监听Servlet上下文的变化
 * 其两个方法被称为“Web应用程序的生命周期方法”。在这两个方法中,
 * 都需要一个ServletContextEvent类型的参数,该类只有以下一个方法。
 * ■ ServletContext getServletContext():获得ServletContext对象。
 */
@WebListener
public class MyContextListener implements ServletContextListener{
    public MyContextListener() {
    }

    /**
     * 上下文初始化
     * 当ServletContext对象创建的时候,将会调用此方法进行处理。
     *
     * @param sce
     */
    public void contextInitialized(ServletContextEvent sce) {
        logout("contextInitialized()-->ServletContext初始化了");
    }

    /**
     * 上下文销毁
     * 当ServletContext对象销毁的时候(例如关闭Web容器或者重新加载应用),将会调用此方法进行处理。
     *
     * @param arg0
     */
    public void contextDestroyed(ServletContextEvent arg0) {
        logout("contextDestroyed()-->ServletContext被销毁");
    }

}

2.ServletAttributeListener接口

/**
 *ServletAttributeListener接口用于监听ServletContext中属性的变化,
 * 该接口提供3个方法,分别用于处理ServletContext中属性的增加、删除和修改。
 */
@WebListener
public class MyContextListener implements ServletContextAttributeListener {
    public MyContextListener() {
    }

    /**
     * 添加属性
     * 当ServletContext中增加一个属性时,将会调用此方法进行处理。
     * @param scae
     */
    public void attributeAdded(ServletContextAttributeEvent scae) {
        logout("增加了一个ServletContext属性:attributeAdded('" +
                scae.getName()+ "', '" + scae.getValue() + "')");
    }
    /**
     *  修改属性
     * 当ServletContext中修改一个属性值时,将会调用此方法进行处理。
     * @param scae
     */
    public void attributeReplaced(ServletContextAttributeEvent scae) {
        logout("某个ServletContext的属性被改变:attributeReplaced ('"
                +scae.getName()+ "', '" + scae.getValue() + "')");
    }

    /**
     * 移除属性
     *当ServletContext中删除一个属性时,将会调用此方法进行处理。
     * @param scae
     */
    public void attributeRemoved(ServletContextAttributeEvent scae) {
        logout("删除了一个ServletContext属性:attributeRemoved ('"
                +scae.getName()+ "', '" + scae.getValue() + "')");
    }

    // 写日志信息
    private void logout(String message) {
        PrintWriter out = null;
        try {
            out = new PrintWriter(new FileOutputStream("C:\\log.txt",
                    true));
            SimpleDateFormat datef = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
            String curtime = datef.format(new Date());
            out.println(curtime + "::Form ContextListener: " + message);
            out.close();
        } catch (Exception e) {
            out.close();
            e.printStackTrace();
        }
    }
}

 

在应用中,如果监听类同时实现ServletContextListener和ServletContextAttributeListener两个接口,其工作流程如下:

01 Web应用启动的时候,contextInitialized(ServletContextEvent event)方法进行初始化。

02 如果在Application范围内添加一个属性,将会触发ServletContextAttributeEvent事件,通过AttributeAdded(ServletContextAttributeEvent event)方法进行处理。

03 如果在Application的范围内修改属性值,将会触发ServletContextAttributeEvent事件,通过AttributeReplaced(ServletContextAttributeEvent event)方法进行处理。

04 如果在Application的范围内删除一个属性,将会触发ServletContextAttributeEvent事件,通过AttributeRemoved(ServletContextAttributeEvent event)方法进行处理。

05 Web应用关闭时,contextDestroyed(ServletContextEvent event)方法进行卸载。

上下文监听器的工作流程如图所示。

注意在实际应用中,自定义的类可以实现ServletContextListener和ServletContextAttributeListener其中之一,从而完成特定的应用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章