最新消息:www.yxkong.com也可以访问

java Servlet中的(监听器)listener

javaWeb yxkong 1040浏览 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持久化到存储设备中");
    }
}

转载请注明:我要编程 » java Servlet中的(监听器)listener

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址