java Servlet中的(监听器)listener

2012/04/29 2093点热度 0人点赞 0条评论

所谓的监听器是指对整个WEB环境的监听,当被监视的对象发生情况时,立即调用相应的方法进行处理。

Servlet 监听器的分类

 按监听的对象划分

     1.用于监听应用程序环境对象(ServletContext)的事件监听器

     2.用于监听用户会话对象(HttpSession)的事件监听器

      3.用于监听请求消息对象(ServletRequest)的事件监听器

按监听的事件类项划分

      1.用于监听域对象自身的创建和销毁的事件监听器

      2.用于监听域对象中的属性的增加和删除的事件监听器

     3.用于监听绑定到HttpSession域中的某个对象的状态的事件监听器

编写 Servlet 监听器

     1)要实现监听对象对应的接口

     2)监听器创建以后要在web.xml中注册

     3)servlet事件监听器的注册和调用过程都是由web容器自动完成

     4)监听器是线程不安全的

监听域对象的创建和销毁

   对象创建和销毁的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象的创建和销毁事件的监听器。

     1 、ServletContext 域

          * 创建:是在 Web 服务器启动并加载某个 Web 应用程序时创建相应的ServletContext 对象,

          * 销毁:是在 Web 服务器关闭或卸载时为每个 Web 应用程序销毁相应的ServletContext 对象。

        java文件中的实现

/**
 * 用于监听 ServletContextListener 对象的创建和销毁的事件监听器
 */
public class MyServletContextListener implements ServletContextListener {
    /**
     * 当ServletContext对象创建时,调用该方法
     */
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("ServletContext 被创建了");
        //所有对象共享的
        ServletContext sc=sce.getServletContext();
        Map<String,String> map=new HashMap<String,String>();
        map.put("yxkong", "鱼翔空");
        sc.setAttribute("map", map);
    }
    /**
     * 当ServletContext对象销毁时,调用该方法
     */
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("ServletContextEvent 对象销毁了");
    }
}

        web.xml文件中的配置

<!-- 注册监听器 -->
 <listener>
   <listener-class>com.yxkong.listener.MyServletContextListener</listener-class>
 </listener>

   2 、HttpSession域

          * 创建:是在浏览器开始与服务器会话时创建,

          * 销毁:是在调用HttpSession.invalidate();超过了Sessiond的最大有效时间间隔,服务器进程被停止的时候。  

/**
 * HttpSessionListener:用于监听session对象的创建和销毁
 */
public class MyHttpSessionListener implements HttpSessionListener {
    /**
     * 当session对象创建时,调用该方法
     */
    public void sessionCreated(HttpSessionEvent se) {
        System.out.println("session 对象被创建了");
        HttpSession sessison=se.getSession();
        System.out.println("sessison   "+sessison);     
        ServletContext sc=sessison.getServletContext();
        Map<String,String> map=(Map<String,String>)sc.getAttribute("map");
        System.out.println(map.get("yxkong"));  
    }
    /**
     * 当session对象销毁时,调用该方法
     */
    public void sessionDestroyed(HttpSessionEvent se) {
        System.out.println("session 对象被销毁时");
    }   
}
<!-- 注册监听器 -->
<listener>
  <listener-class>com.yxkong.listener.MyHttpSessionListener</listener-class>
</listener>

    3  、ServletRequest 域

          * 创建:每次请求开始时创建,

          * 销毁: 每次访问结束后销毁

/**
 *  用于监听ServletRequestListener对象的创建和销毁的监听器
 */
public class MyServletRequestListener implements ServletRequestListener {
                                    
    /**
     * 当request对象创建时,调用该方法
     */
    public void requestInitialized(ServletRequestEvent sre) {
      System.out.println("HttpServletRequest对象创建");
      //获取ServletContext对象
        ServletContext sc=sre.getServletContext();
      //获取HttpServletRequest对象
        HttpServletRequest request=(HttpServletRequest)sre.getServletRequest();
        HttpSession session=request.getSession();
        ServletContext sc1=session.getServletContext();
                                            
        Map<String,String> map=(Map<String,String>)sc.getAttribute("map");
        System.out.println("MyServletRequestListener  "+map.get("yxkong")); 
    }
    /**
     * 当request对象销往时,调用该方法
     */
    public void requestDestroyed(ServletRequestEvent sre) {
        System.out.println("HttpServletRequest被销毁时");
    }
}
<!-- 注册监听器 -->
<listener>
  <listener-class>com.yxkong.listener.MyServletRequestListener</listener-class>
</listener>

域对象中属性的变更的事件监听器(不需要往xml中注册)

 这三个监听器接口分别是ServletContextAttributeListener, HttpSessionAttributeListener 和ServletRequestAttributeListener

 各个域属性监听器中的完整语法定义为:

   public void attributeAdded(ServletContextAttributeEvent scae)

   public void attributeReplaced(HttpSessionAttributeEvent  hsbe)

   public void attributeRmoved(ServletRequestAttributeEvent srae)

/**
 * 往session中增加属性  替换属性 删除属性时,调用该监听器 
 */
public class MyHttpSessionAttributeListener implements HttpSessionAttributeListener {
    /**
     * 当session中增加属性时,调用该方法
     */
    public void attributeAdded(HttpSessionBindingEvent se) {
        System.out.println("MyHttpSessionAttributeListener attributeAdded");
        String name=se.getName();
        Object value=se.getValue();
        System.out.println(name  +  "----------"  +  value);
    }
    /**
     *  当session中替换属性时,调用该方法,获取的值是被替换的值
     */
    public void attributeReplaced(HttpSessionBindingEvent se) {
        System.out.println("MyHttpSessionAttributeListener attributeReplaced");
        String name=se.getName();
        Object value=se.getValue();
        System.out.println(name  +  "----------"  +  value);
    }
    /**
     *  当session中删除属性时,调用该方法,获取的值是删除的值
     */
    public void attributeRemoved(HttpSessionBindingEvent se) {
        System.out.println("MyHttpSessionAttributeListener attributeRemoved");
        String name=se.getName();
        Object value=se.getValue();
        System.out.println(name  +  "----------"  +  value);
    }
}

监听javaBean在session中的状态

    保存在 Session 域中的对象可以有多种状态:绑定到  Session 中;从 Session 域中解除绑定;随 Session 对象持久化到一个存储设备中;随 Session 对象从一个存储设备中恢复

    Servlet 规范中定义了两个特殊的监听器接口来帮助 JavaBean 对象了解自己在 Session 域中的这些状态:

         HttpSessionBindingListener接口

         HttpSessionActivationListener接口 ,

         注:实现这两个接口的类不需要 web.xml 文件中进行注册

public class User implements HttpSessionBindingListener,HttpSessionActivationListener,java.io.Serializable {
    private String name;
    private String value;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getValue() {
        return value;
    }
    public void setValue(String value) {
        this.value = value;
    }
    //对象被绑定到 HttpSession 对象中时
    public void valueBound(HttpSessionBindingEvent event) {
        System.out.println("valueBound     "+this);
        String name=event.getName();
        User user=(User)event.getValue();
        if(user!=null){
            System.out.println("valueBound  "+name +"------"+user.getName());
        }
    }
    //对象从 HttpSession 对象中解除绑定时
    public void valueUnbound(HttpSessionBindingEvent event) {
        System.out.println("valueUnbound  ");
        String name=event.getName();
        User user=(User)event.getValue();
        if(user!=null){
            System.out.println("valueUnbound  "+name +"------"+user.getName());
        }
    }
    //当绑定到 HttpSession 对象中的对象将要随 HttpSession 对象被活化之后
    public void sessionDidActivate(HttpSessionEvent se) {
        System.out.println("活化 对象随session从存储设备上恢复");    
    }
    //当绑定到 HttpSession 对象中的对象将要随 HttpSession 对象被钝化之前
    public void sessionWillPassivate(HttpSessionEvent se) {
        System.out.println("钝化 对象随session持久化到存储设备中");
    }
}

yxkong

这个人很懒,什么都没留下

文章评论