JavaWeb监听器Listener实例解析

首先来介绍一下什么是监听器:

监听器-就是一个实现待定接口的普通Java程序,此程序专门用于监听另外一个类的方法调用。
这是使用观察者模式的。

什么是观察者模式:
定义对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知自动更新。
示例:
GUI编程中的addXxxxListener都是观察者模式。
比如为按钮点击添加监听事件,为键盘添加监听等等…

观察者模式的三个重要类:

被监听的事件源,也就是我们在使用的对象。
注册的那个监听器,是专门用来监听当前使用的对象的。
事件对象Event也就是被监听的那个对象!

我们先来看一个简单版的,自己写的监听器。

简单版:

有事件源,和监听器,测试类.
Event等下一个完整版实现.
开发步骤:
第一步:实现一个需要被监听的类Person.
第二步:实现一个监听接口IPersonRunListener。
第三步:在Person类中,提供一个方法(或者多个,我在这里提供了2个方法)用于注册IPersonRunListener类,即addBefore和addAfter
第四步:必须要在Person类中维护IPersonRunListener类的实例。
第五步:在调用person.run方法时,判断IPersonRunListener是否为null,如果不为null则调用它的fighting方法。
第六步:在Demo类中,实例化Person,并注册一个监听。

Person:

package cn.hncu.designPattern1;

public class Person {
 private String name;
 private IPersonRunListener listener1;
 private IPersonRunListener listener2;
 public Person(String name) {
  super();
  this.name = name;
 }

 public void run(){
  if(listener1!=null){
   listener1.fighting();
  }
  System.out.println(name+"正在跑...");
  if(listener2!=null){
   listener2.fighting();
  }
 }

 public void addBefore(IPersonRunListener listener){
  this.listener1=listener;
 }

 public void addAfter(IPersonRunListener listener){
  this.listener2=listener;
 }

}

interface IPersonRunListener{
 public void fighting();
}

Demo

package cn.hncu.designPattern1;

public class Demo {

 public static void main(String[] args) {
  Person person = new Person("张三");
  IPersonRunListener listener = new IPersonRunListener() {
   @Override
   public void fighting() {
    //这里可以做很多事,不是只能输出哦
    //不过由于还没写Event对象,所以拿不到是谁调用的
    System.out.println("先做好准备工作...");
   }
  };
  person.addBefore(listener);

  A a = new A();

  person.addAfter(a);

  person.run();
 }
}

class A implements IPersonRunListener{
 @Override
 public void fighting() {
  //这里可以做很多事,不是只能输出哦
  //不过由于还没写Event对象,所以拿不到是谁调用的
  System.out.println("跑完了,休息休息...");
 }
}

输出:

完整版–添加事件源:

在这里相对前面的增加了一个Event-事件对象.算是完整版的了。

开发步骤:
第一步:在前页的基础上继续添加一个PersonEvent类(注意我说是类不是接口),代表事件对像。
第二步:给PersonEvent对像,添加一个Person属性,用以标识事件源对像。
第三步:修改PersonListener接口的fighting方法,让它接收一个PersonEvent参数。
第四步:在Person类run方法中,如果判断PersonListener属性不为空,则在调用fighting方法,实例化PersonEvent并传给fighting方法。
第五步:在main方法中,通过PersonEvent的getSource方法测试是否是同一个对像。

Person.java

package cn.hncu.designPattern2;

public class Person {
 private String name;
 private IPersonRunListener listener;

 public Person(String name) {
  super();
  this.name = name;
 }

 public void run(){
  System.out.println(name+"开始跑了..");
  if(listener!=null){
   listener.fighting(new PersonEvent(this));
  }
 }

 public void addPersonListener(IPersonRunListener listener){
  this.listener=listener;
 }

 public String getName(){
  return name;
 }

 @Override
 public String toString() {
  return "Person [name=" + name + ", listener=" + listener + "]";
 }

}

interface IPersonRunListener {
 public void fighting(PersonEvent pe);
}

class PersonEvent{
 Person p = null;
 public PersonEvent(Person p) {
  this.p = p;
 }

 public String getName(){
  return p.getName();
 }

 public Object getSource(){
  return p;
 }
}

//我们还可以写一个帮我们实现了接口的基本类
//里面写我们通用的模板,如果我们继承这个类,我们就可以不写了。
//有功能不一样的地方,我们就自己写,覆盖这个类的方法
class DefaultCatListener implements IPersonRunListener {

 @Override
 public void fighting(PersonEvent pe) {
  System.out.println("默认的动作...");
 }
}

Demo.java

package cn.hncu.designPattern2;

public class Demo {

 public static void main(String[] args) {
  Person p1 = new Person("张三");
  Person p2 = new Person("Jack");
  IPersonRunListener listener = new IPersonRunListener() {
   @Override
   public void fighting(PersonEvent pe) {
    System.out.println(pe.getSource()+"已经跑完了...");
    if(pe.getName().equals("张三")){
     System.out.println(pe.getName()+"跑到了第一名...");
    }
   }
  };
  p1.addPersonListener(listener);
  p2.addPersonListener(listener);
  p1.run();
  p2.run();

  Person p3 = new Person("李四");
  p3.addPersonListener(new DefaultCatListener());
  p3.run();
 }
}

演示结果:

基本上的原理就是这些了,里面事件的输出你换成你需要的动作就可以实现你想要的功能,添加一个监听,就可以在run方法之前或者之后调用自己想要调用的方法,做自己想做的动作!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

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

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

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

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

  • 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

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

    一.监听器介绍 1.1.监听器的概念 监听器是一个专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动.监听器其实就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法立即被执行. 1.2.监听器案例--监听window窗口的事件监听器 package me.gacl.listener.demo; import java.awt.Frame; imp

  • 深入学习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中过滤器、监听器、拦截器的区别

    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

  • 浅谈java监听器的作用

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

随机推荐