快速学习JavaWeb中监听器(Listener)的使用方法

一、监听器介绍

1.1、监听器的概念

 

  监听器是一个专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动。监听器其实就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法立即被执行。

1.2、监听器案例——监听window窗口的事件监听器

package me.gacl.listener.demo;

import java.awt.Frame;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

public class Demo1 {

  /**
   *java的事件监听机制
   *1、事件监听涉及到三个组件:事件源、事件对象、事件监听器
   *2、当事件源上发生某一个动作时,它会调用事件监听器的一个方法,并在调用该方法时把事件对象传递进去,
   *  开发人员在监听器中通过事件对象,就可以拿到事件源,从而对事件源进行操作。
   */
  public static void main(String[] args) {

    Frame f = new Frame();
    f.setSize(400, 400);
    f.setVisible(true);

    //注册事件监听器
    f.addWindowListener(new WindowListener(){

      public void windowActivated(WindowEvent e) {

      }

      public void windowClosed(WindowEvent e) {

      }

      /**
       * 当window窗体关闭时就会WindowListener这个监听器监听到,
       * 监听器就会调用windowClosing方法处理window窗体关闭时的动作
       */
      public void windowClosing(WindowEvent e) {
        //通过事件对象e来获取事件源对象
        Frame f = (Frame) e.getSource();
        System.out.println(f+"窗体正在关闭");
        f.dispose();
      }

      public void windowDeactivated(WindowEvent e) {

      }

      public void windowDeiconified(WindowEvent e) {

      }

      public void windowIconified(WindowEvent e) {

      }

      public void windowOpened(WindowEvent e) {

      }
    });
  }
}

1.3、设计一个可以被别的对象监听的对象

  我们平时做开发的时候,我们是写监听器去监听其他对象,那么我们如果想设计一个对象,让这个对象可以被别的对象监听又该怎么做呢,可以按照严格的事件处理模型来设计一个对象,这个对象就可以被别的对象监听,事件处理模型涉及到三个组件:事件源、事件对象、事件监听器。

  下面我们来按照事件处理模型来设计一个Person对象,具体代码如下:

package me.gacl.observer;

/**
* @ClassName: Person(事件源)
* @Description: 设计一个Person类作为事件源,这个类的对象的行为(比如吃饭、跑步)可以被其他的对象监听
* @author: 孤傲苍狼
* @date: 2014-9-9 下午9:26:06
*
*/
public class Person {
  /**
  * @Field: listener
  *     在Person类中定义一个PersonListener变量来记住传递进来的监听器
  */
  private PersonListener listener;

  /**
  * @Method: eat
  * @Description: 设计Person的行为:吃
  * @Anthor:孤傲苍狼
  *
  */
  public void eat() {
    if (listener != null) {
      /**
       * 调用监听器的doeat方法监听Person类对象eat(吃)这个动作,将事件对象Event传递给doeat方法,
       * 事件对象封装了事件源,new Event(this)中的this代表的就是事件源
       */
      listener.doeat(new Event(this));
    }
  }

  /**
  * @Method: run
  * @Description: 设计Person的行为:跑
  * @Anthor:孤傲苍狼
  *
  */
  public void run() {
    if (listener != null) {
      /**
       * 调用监听器的dorun方法监听Person类对象run(跑)这个动作,将事件对象Event传递给doeat方法,
       * 事件对象封装了事件源,new Event(this)中的this代表的就是事件源
       */
      listener.dorun(new Event(this));
    }
  }

  /**
  * @Method: registerListener
  * @Description: 这个方法是用来注册对Person类对象的行为进行监听的监听器
  * @Anthor:孤傲苍狼
  *
  * @param listener
  */
  public void registerListener(PersonListener listener) {
    this.listener = listener;
  }
}

/**
* @ClassName: PersonListener(事件监听器)
* @Description: 设计Person类(事件源)的监听器接口
* @author: 孤傲苍狼
* @date: 2014-9-9 下午9:28:06
*
*/
interface PersonListener {

  /**
  * @Method: doeat
  * @Description: 这个方法是用来监听Person对象eat(吃)这个行为动作,
  *         当实现类实现doeat方法时就可以监听到Person类对象eat(吃)这个动作
  * @Anthor:孤傲苍狼
  *
  * @param e
  */
  void doeat(Event e);

  /**
  * @Method: dorun
  * @Description: 这个方法是用来监听Person对象run(跑)这个行为动作,
  *         当实现类实现dorun方法时就可以监听到Person类对象run(跑)这个动作
  * @Anthor:孤傲苍狼
  *
  * @param e
  */
  void dorun(Event e);

}

/**
* @ClassName: Event(事件对象)
* @Description:设计事件类,用来封装事件源
* @author: 孤傲苍狼
* @date: 2014-9-9 下午9:37:56
*
*/
class Event {

  /**
  * @Field: source
  *     事件源(Person就是事件源)
  */
  private Person source;

  public Event() {

  }

  public Event(Person source) {
    this.source = source;
  }

  public Person getSource() {
    return source;
  }

  public void setSource(Person source) {
    this.source = source;
  }
}

  经过这样的设计之后,Peron类的对象就是可以被其他对象监听了。测试代码如下:

package me.gacl.observer;

public class PersonTest {

  /**
   * @Method: main
   * @Description: 测试Person类
   * @Anthor:孤傲苍狼
   *
   * @param args
   */
  public static void main(String[] args) {
    //
    Person p = new Person();
    //注册监听p对象行为的监听器
    p.registerListener(new PersonListener() {
      //监听p吃东西这个行为
      public void doeat(Event e) {
        Person p = e.getSource();
        System.out.println(p + "在吃东西");
      }
      //监听p跑步这个行为
      public void dorun(Event e) {
        Person p = e.getSource();
        System.out.println(p + "在跑步");
      }
    });
    //p在吃东西
    p.eat();
    //p在跑步
    p.run();
  }
}

运行结果:

  me.gacl.observer.Person@4a5ab2在吃东西
  me.gacl.observer.Person@4a5ab2在跑步

二、JavaWeb中的监听器

2.1、基本概念

  JavaWeb中的监听器是Servlet规范中定义的一种特殊类,它用于监听web应用程序中的ServletContext, HttpSession和 ServletRequest等域对象的创建与销毁事件,以及监听这些域对象中的属性发生修改的事件。

2.2、Servlet监听器的分类

  在Servlet规范中定义了多种类型的监听器,它们用于监听的事件源分别为ServletContext,HttpSession和ServletRequest这三个域对象
  Servlet规范针对这三个对象上的操作,又把多种类型的监听器划分为三种类型:
 •监听域对象自身的创建和销毁的事件监听器。
 •监听域对象中的属性的增加和删除的事件监听器。
 •监听绑定到HttpSession域中的某个对象的状态的事件监听器。

2.3、监听ServletContext域对象的创建和销毁

  ServletContextListener接口用于监听ServletContext对象的创建和销毁事件。实现了ServletContextListener接口的类都可以对ServletContext对象的创建和销毁进行监听。
 •当ServletContext对象被创建时,激发contextInitialized (ServletContextEvent sce)方法。

•当ServletContext对象被销毁时,激发contextDestroyed(ServletContextEvent sce)方法。

•ServletContext域对象创建和销毁时机:
    创建:服务器启动针对每一个Web应用创建ServletContext
    销毁:服务器关闭前先关闭代表每一个web应用的ServletContext

范例:编写一个MyServletContextListener类,实现ServletContextListener接口,监听ServletContext对象的创建和销毁

  1、编写监听器,代码如下:

package me.gacl.web.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

/**
* @ClassName: MyServletContextListener
* @Description: MyServletContextListener类实现了ServletContextListener接口,
*         因此可以对ServletContext对象的创建和销毁这两个动作进行监听。
* @author: 孤傲苍狼
* @date: 2014-9-9 下午10:26:16
*
*/
public class MyServletContextListener implements ServletContextListener {

  @Override
  public void contextInitialized(ServletContextEvent sce) {
    System.out.println("ServletContext对象创建");
  }

  @Override
  public void contextDestroyed(ServletContextEvent sce) {
    System.out.println("ServletContext对象销毁");
  }
}

  2、在web.xml文件中注册监听器

  我们在上面的中讲到,要想监听事件源,那么必须将监听器注册到事件源上才能够实现对事件源的行为动作进行监听,在JavaWeb中,监听的注册是在web.xml文件中进行配置的,如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
  xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
 <display-name></display-name>
 <welcome-file-list>
  <welcome-file>index.jsp</welcome-file>
 </welcome-file-list>

 <!-- 注册针对ServletContext对象进行监听的监听器 -->
 <listener>
   <description>ServletContextListener监听器</description>
   <!--实现了ServletContextListener接口的监听器类 -->
   <listener-class>me.gacl.web.listener.MyServletContextListener</listener-class>
 </listener>

</web-app>

  经过这两个步骤,我们就完成了监听器的编写和注册,Web服务器在启动时,就会自动把在web.xml中配置的监听器注册到ServletContext对象上,这样开发好的MyServletContextListener监听器就可以对ServletContext对象进行监听了。

2.4、监听HttpSession域对象的创建和销毁

  HttpSessionListener 接口用于监听HttpSession对象的创建和销毁
  创建一个Session时,激发sessionCreated (HttpSessionEvent se) 方法
  销毁一个Session时,激发sessionDestroyed (HttpSessionEvent se) 方法。

范例:编写一个MyHttpSessionListener类,实现HttpSessionListener接口,监听HttpSession对象的创建和销毁

  1、编写监听器,代码如下:

package me.gacl.web.listener;

import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

/**
* @ClassName: MyHttpSessionListener
* @Description: MyHttpSessionListener类实现了HttpSessionListener接口,
*         因此可以对HttpSession对象的创建和销毁这两个动作进行监听。
* @author: 孤傲苍狼
* @date: 2014-9-9 下午11:04:33
*
*/
public class MyHttpSessionListener implements HttpSessionListener {

  @Override
  public void sessionCreated(HttpSessionEvent se) {
    System.out.println( se.getSession() + "创建了!!");
  }

  /* HttpSession的销毁时机需要在web.xml中进行配置,如下:
   * <session-config>
       <session-timeout>1</session-timeout>
     </session-config>
     这样配置就表示session在1分钟之后就被销毁
   */
  @Override
  public void sessionDestroyed(HttpSessionEvent se) {
    System.out.println("session销毁了!!");
  }
}

  2、在web.xml文件中注册监听器

<!--注册针对HttpSession对象进行监听的监听器-->
  <listener>
   <description>HttpSessionListener监听器</description>
   <listener-class>me.gacl.web.listener.MyHttpSessionListener</listener-class>
 </listener>
 <!-- 配置HttpSession对象的销毁时机 -->
 <session-config>
   <!--配置HttpSession对象的1分钟之后销毁 -->
   <session-timeout>1</session-timeout>
 </session-config>

  当我们访问jsp页面时,HttpSession对象就会创建,此时就可以在HttpSessionListener观察到HttpSession对象的创建过程了,我们可以写一个jsp页面观察HttpSession对象创建的过程。

如下:index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %>

<!DOCTYPE HTML>
<html>
 <head>
  <title>HttpSessionListener监听器监听HttpSession对象的创建</title>
 </head>

 <body>
    一访问JSP页面,HttpSession就创建了,创建好的Session的Id是:${pageContext.session.id}
 </body>
</html>

运行结果如下:

2.5、监听ServletRequest域对象的创建和销毁

  ServletRequestListener接口用于监听ServletRequest 对象的创建和销毁
  Request对象被创建时,监听器的requestInitialized(ServletRequestEvent sre)方法将会被调用
  Request对象被销毁时,监听器的requestDestroyed(ServletRequestEvent sre)方法将会被调用

  ServletRequest域对象创建和销毁时机:
    创建:用户每一次访问都会创建request对象
    销毁:当前访问结束,request对象就会销毁

范例:编写一个MyServletRequestListener类,实现ServletRequestListener接口,监听ServletRequest对象的创建和销毁

  1、编写监听器,代码如下:

package me.gacl.web.listener;

import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;

/**
* @ClassName: MyServletRequestListener
* @Description: MyServletRequestListener类实现了ServletRequestListener接口,
*         因此可以对ServletRequest对象的创建和销毁这两个动作进行监听。
* @author: 孤傲苍狼
* @date: 2014-9-9 下午11:50:08
*
*/
public class MyServletRequestListener implements ServletRequestListener {

  @Override
  public void requestDestroyed(ServletRequestEvent sre) {
    System.out.println(sre.getServletRequest() + "销毁了!!");

  }

  @Override
  public void requestInitialized(ServletRequestEvent sre) {
    System.out.println(sre.getServletRequest() + "创建了!!");
  }
}

  2、在web.xml文件中注册监听器

<!--注册针对ServletRequest对象进行监听的监听器-->
  <listener>
    <description>ServletRequestListener监听器</description>
    <listener-class>me.gacl.web.listener.MyServletRequestListener</listener-class>
  </listener>

测试结果如下:

  从运行结果中可以看到,用户每一次访问都会创建request对象,当访问结束后,request对象就会销毁。

  以上就是对监听器的一些简单讲解。

(0)

相关推荐

  • JavaWeb监听器Listener实例解析

    首先来介绍一下什么是监听器: 监听器-就是一个实现待定接口的普通Java程序,此程序专门用于监听另外一个类的方法调用. 这是使用观察者模式的. 什么是观察者模式: 定义对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知自动更新. 示例: GUI编程中的addXxxxListener都是观察者模式. 比如为按钮点击添加监听事件,为键盘添加监听等等- 观察者模式的三个重要类: 被监听的事件源,也就是我们在使用的对象. 注册的那个监听器,是专门用来监听当前使用的对象的.

  • java web监听器统计在线用户及人数

    在线用户使用HttpSessionListener监听器统计  每当一个session会话建立  在线用户人数+1 每当一个session会话销毁 在线用户人数-1 使用ServletRequestListener监听器统计用户信息 每当一个request建立  将当前用户放入集合 每当session会话销毁  将当前用户移出集合 我使用的是Servlet3.0  监听器直接使用注解@webListener即可 不用在web.xml中布局 在web.xml中配置session-timeout标签

  • 利用java监听器实现在线人数统计

    1.在工程中创建监听类SessionListener 并且实现HttpSessionListener接口,代码如下 import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; public class SessionListener implements HttpSessionListener { private static int count = 0; public vo

  • java使用监听器实现一个统计网站在线人数的示例

    本文主要介绍了java使用监听器实现一个统计网站在线人数的示例,具有一定的参考价值,有需要的朋友可以了解一下. (1)创建一个监听器实现类 要大致统计一个网站的在线人数,首先,可以通过ServletContextListener监听,当Web应用上下文启动时,在ServletContext中添加一个List,用来准备存放在线的用户名:然后,可以通过HttpSessionAttributeListener监听,当用户登录成功把用户名设置到Session中时同时将用户名存放到ServletConte

  • 浅谈java监听器的作用

    监听器是JAVA Web开发中很重要的内容,其中涉及到的知识,可以参考下面导图: Web监听器 1 什么是web监听器? web监听器是一种Servlet中的特殊的类,它们能帮助开发者监听web中的特定事件,比如ServletContext,HttpSession,ServletRequest的创建和销毁:变量的创建.销毁和修改等.可以在某些动作前后增加处理,实现监控. 2 监听器常用的用途 通常使用Web监听器做以下的内容: 统计在线人数,利用HttpSessionLisener 加载初始化信

  • 深入学习JavaWeb中监听器(Listener)的使用方法

    一.监听域对象中属性的变更的监听器 域对象中属性的变更的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信息事件的监听器. 这三个监听器接口分别是ServletContextAttributeListener, HttpSessionAttributeListener 和ServletRequestAttributeListener,这三个接口中都定义了三个方法来处理被监听对象中的属性的增加,删除和替换

  • Java基础 Servlet监听器详解

    Java基础 Servlet监听器详解 1 概念:Servlet监听器,用来监听web容器的一些对象状态的变化,主要是ServletContext.HttpSession.HttpServletRequestl三类对象状态.Servlet的监听器 2  Servlet2.4和JSP2.0规范中一共定义了有八个接口类和六种事件. 3 web.xml中定义Servlet的url-pattern时如果url-pattern的值的"/",则说明该Servlet是该项目的默认Servlet,当请

  • Java中的拦截器、过滤器、监听器用法详解

    本文实例讲述了Java中的拦截器.过滤器.监听器用法.分享给大家供大家参考,具体如下: 一.拦截器 :是在面向切面编程的就是在你的service或者一个方法,前调用一个方法,或者在方法后调用一个方法比如动态代理就是拦截器的简单实现,在你调用方 法前打印出字符串(或者做其它业务逻辑的操作),也可以在你调用方法后打印出字符串,甚至在你抛出异常的时候做业务逻辑的操作. 1.Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,

  • 浅析JAVA中过滤器、监听器、拦截器的区别

    1.过滤器:所谓过滤器顾名思义是用来过滤的,在java web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的action进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者struts的action前统一设置字符集,或者去除掉一些非法字符(聊天室经常用到的,一些骂人的话).filter 流程是线性的, url传来之后,检查之后,可保持原来的流程

  • servlet监听器的学习使用(三)

    本文为大家分享了servlet监听器的具体学习内容,供大家参考,具体内容如下 1.什么是servlet监听器? servlet监听器也叫web监听器.是servlet中一种特殊类.能够帮助开发者监听web应用中的特定事件.比如ServletContext,ServletSession,ServletRequest的创建和销毁,变量的创建和销毁等. 2 监听器常用的用途 通常使用Web监听器做以下的内容: 统计在线人数,利用HttpSessionLisener 加载初始化信息:利用ServletC

随机推荐