`

监听器Listener

阅读更多

一.监听器介绍

1.监听器的概念

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

 

2.监听器案例——监听window窗口的事件监听器

package com.bijian.study;

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) {
                
            }
        });
    }
}

        运行程序弹出弹出框,关闭后在控制台输出如下信息:

java.awt.Frame[frame0,0,0,400x400,layout=java.awt.BorderLayout,title=,resizable,normal]窗体正在关闭

 

3.设计一个可以被别的对象监听的对象

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

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

package com.bijian.study;

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

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

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

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

/**
* @ClassName: PersonListener(事件监听器)
* @Description: 设计Person类(事件源)的监听器接口
*
*/ 
interface PersonListener {

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

    /**
    * @Method: dorun
    * @Description: 这个方法是用来监听Person对象run(跑)这个行为动作,
    *  当实现类实现dorun方法时就可以监听到Person类对象run(跑)这个动作
    * @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 com.bijian.study;

public class PersonTest {

    /**
     * @Method: main
     * @Description: 测试Person类
     * @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();
    }
}

        运行结果:

com.bijian.study.Person@27e6ac83在吃东西
com.bijian.study.Person@27e6ac83在跑步

 

二.JavaWeb中的监听器

1.基本概念

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

 

2.Servlet监听器的分类

        在Servlet规范中定义了多种类型的监听器,它们用于监听的事件源分别为ServletContext,HttpSession和ServletRequest这三个域对象。

        Servlet规范针对这三个对象上的操作,又把多种类型的监听器划分为三种类型:

        a.监听域对象自身的创建和销毁的事件监听器。

        b.监听域对象中的属性的增加和删除的事件监听器。

        c.监听绑定到HttpSession域中的某个对象的状态的事件监听器。

 

3.监听ServletContext域对象的创建和销毁

        ServletContextListener接口用于监听ServletContext对象的创建和销毁事件。实现了ServletContextListener接口的类都可以对ServletContext对象的创建和销毁进行监听。

        当ServletContext对象被创建时,激发contextInitialized (ServletContextEvent sce)方法。

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

        ServletContext域对象创建和销毁时机:

        a.创建:服务器启动针对每一个Web应用创建ServletContext

        b.销毁:服务器关闭前先关闭代表每一个web应用的ServletContext

实例:

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

        a.编写监听器,代码如下:

package com.bijian.study.listener;

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

/**
* @ClassName: MyServletContextListener
* @Description: MyServletContextListener类实现了ServletContextListener接口,
* 因此可以对ServletContext对象的创建和销毁这两个动作进行监听。
*/ 
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对象销毁");
    }
}

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

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

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee    
   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

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

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

 

4.监听HttpSession域对象的创建和销毁

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

实例:

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

        a.编写监听器,代码如下:

package com.bijian.study.listener;

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

/**
* @ClassName: MyHttpSessionListener
* @Description: MyHttpSessionListener类实现了HttpSessionListener接口,
* 因此可以对HttpSession对象的创建和销毁这两个动作进行监听。
*/ 
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销毁了!!");
    }
}

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

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

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

        如hello.jsp

<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core"%>
<!DOCTYPE html>   
<html>   
<head>   
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">   
	<title>Hello</title>   
</head>   
<body>   
	Hi,${userName}
	<h3>HttpSessionListener监听器监听HttpSession对象的创建</h3>
	一访问JSP页面,HttpSession就创建了,创建好的Session的Id是:${pageContext.session.id}
</body>   
</html>

        运行结果如下:

 

5.监听ServletRequest域对象的创建和销毁

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

        ServletRequest域对象创建和销毁时机:

        a.创建:用户每一次访问都会创建request对象

        b.销毁:当前访问结束,request对象就会销毁

实例:

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

        a.编写监听器,代码如下:

package com.bijian.study.listener;

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

/**
* @ClassName: MyServletRequestListener
* @Description: MyServletRequestListener类实现了ServletRequestListener接口,
*  因此可以对ServletRequest对象的创建和销毁这两个动作进行监听。
*/ 
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() + "创建了!!");
    }
}

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

<!--注册针对ServletRequest对象进行监听的监听器-->
<listener>
   <description>ServletRequestListener监听器</description>
   <listener-class>com.bijian.study.listener.MyServletRequestListener</listener-class>
</listener>

        测试结果如下:

org.apache.catalina.connector.Request@cffc999创建了!!
23:24:02.399 TRACE com.bijian.study.controller.HelloController 36 greeting - tempName:zhangshan
23:24:02.400 INFO  com.bijian.study.controller.HelloController 37 greeting - zhangshan
23:24:02.400 INFO  com.bijian.study.service.impl.HelloServiceImpl 17 processService - HelloService processService name:zhangshan
23:24:02.400 TRACE com.bijian.study.controller.HelloController 43 greeting - 运行结果:{userName=Hello zhangshan}
org.apache.catalina.connector.Request@cffc999销毁了!!

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

 

文章来源:http://www.cnblogs.com/xdp-gacl/p/3961929.html

  • 大小: 183.9 KB
  • 大小: 13.9 KB
分享到:
评论

相关推荐

    Oracle 监听器 Listener资料.docx

    Oracle 监听器 Listener 资料 Oracle 监听器 Listener 是一个重要的数据库服务器组件,在整个 Oracle 体系结构中,扮演着重要的作用。它负责管理 Oracle 数据库和客户端之间的通讯,它在一个特定的网卡端口(默认是...

    过滤器filter和监听器listener的应用总结

    在Java Web开发中,过滤器(Filter)和监听器(Listener)是两个非常重要的概念,它们主要用于增强应用程序的功能和管理应用程序的状态。这篇文章将对这两者的应用进行深入的总结。 **过滤器Filter** 过滤器是在...

    关于监听器Listener和过滤器的小demo

    在这个"关于监听器Listener和过滤器的小demo"中,作者可能创建了一个简单的Web应用程序,用以演示如何使用监听器监听应用程序的事件,以及如何使用过滤器处理请求和响应。文件`day10.html`和`day10.md`可能是记录了...

    myListenerWeb.zip 监听器Listener解析与实例

    监听器Listener解析与实例监听器-就是一个实现待定接口的普通Java程序,此程序专门用于监听另外一个类的方法调用。 这是使用观察者模式的。什么是观察者模式: 定义对象间一对多的依赖关系,当一个对象的状态发生...

    过滤器Filter和监听器Listener

    过滤器Filter和监听器Listener

    JAVA Servlet监听器listener学习资料

    Java Servlet监听器(Listener)是Java Web开发中的一个重要组件,它们允许开发者在特定事件发生时执行自定义逻辑,而无需直接修改原有的业务代码。监听器是Servlet规范的一部分,通过实现特定的接口,开发者可以...

    Java Web监听器Listener接口原理及用法实例

    Java Web监听器Listener接口原理及用法实例 Java Web监听器Listener接口是一种特殊的Java接口,用于监听和响应Web应用程序中的事件。该接口定义在javax.servlet包中,提供了一种机制,使开发者能够监听和响应Web...

    第7章 过滤器Filter和监听器Listener.ppt

    Java Web基础与实例教程的PPT,自己制作的PPT,将近400页,免费分享,童鞋们努力学习吧。

    Oracle数据库监听器(LISTENER)和本地服务名(Tnsname)配置.docx

    Oracle 数据库监听器(LISTENER)和本地服务名(Tnsname)配置 本文主要介绍 Oracle 数据库监听器(LISTENER)和本地服务名(Tnsname)的配置,旨在帮助读者了解 Oracle 网络连接配置的主要组件和配置方法。 一、监听器...

    PLSQL配置监听器

    第一步:配置Oracle服务器的监听器listener 在listener.ora文件中,需要定义监听器的名称、协议、主机名和端口号。例如: SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = PLSExtProc) (ORACLE_HOME...

    listener监听器demo

    标题"listener监听器demo"和描述"listener监听器小例子"暗示我们将探讨的是一个关于`Listener`的示例代码。 首先,让我们从Java GUI编程的角度来看`Listener`。在Swing或AWT中,我们经常使用各种类型的`Listener`,...

    Oracle监听器维护管理v1.1

    二、监听器Listener功能 1. 监听客户端请求:监听器持续监控网络,等待客户端发送的连接请求。 2. 分配Server Process:当请求到达时,监听器为每个连接请求分配一个Server Process,以执行客户端的SQL语句。 3. ...

    Listener监听器1

    Listener监听器1 Listener监听器是一种特殊的类,用于监听 web 应用程序中的 ServletContext、HttpSession、ServletRequest 等域对象的创建和销毁事件,以及监听这些域对象中的属性发生修改的事件。Listener监听器...

    23-Listener-源代码.rar

    案例-使用监听器完成定时生日祝福、,一、监听器Listener 二、邮箱服务器。 1.什么是监听器? 2.监听器有哪些? 3.监听三大域对象的创建与销毁的监听器 4.监听三大域对象的属性变化的 5.与session中的绑定的...

    STRUTS:listener监听器

    ### STRUTS:Listener监听器详解 #### 一、引言 在Java Web开发中,监听器(Listener)是十分重要的组成部分,它们主要用于监听特定事件的发生,并执行相应的处理逻辑。Struts框架作为早期流行的MVC架构之一,充分...

    JavaWeb开发技术-Listener监听器.pptx

    JavaWeb开发技术中的Listener监听器是Java企业级应用开发中的重要组成部分,主要用于监听应用程序中发生的特定事件,并在事件发生时执行相应的处理逻辑。监听器在JavaWeb开发中扮演着关键角色,它们允许开发者对Web...

    监听器访问计数过滤非法字符

    在IT行业中,监听器(Listener)和过滤器(Filter)是两种非常重要的组件,它们在Web应用程序中扮演着不可或缺的角色。本文将详细讲解如何利用监听器进行访问计数以及通过过滤器来过滤非法字符,以确保系统的安全性...

Global site tag (gtag.js) - Google Analytics