首先说说监听器:

监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执 行。

java的事件监听机制可概括为3点:

1,java的事件监听机制涉及到事件源,事件监听器,事件对象三个组件,监听器一般是接口,用来约定调用方式

2,当事件源对象上发生操作时,它将会调用事件监听器的一个方法,并在调用该方法时传递事件对象过去

3,事件监听器 实现类 通常是由开发人员编写,开发人员通过事件对象拿到事件源,从而对事件源上的操作进行处理

事件监听机制在java图形用户界面那一块用的最多,我们举个awt例子:

package cn.lmj.demo;

import java.awt.Frame;

import java.awt.event.WindowEvent;

import java.awt.event.WindowListener;

public class Demo

{

public static void main(String[] args)

{

//事件源

Frame frame = new Frame();

frame.setSize(300,300);

frame.setVisible(true);

//绑定事件对象

frame.addWindowListener(new MyListener());

}

}

//监听器

class MyListener extends WindowAdapter

{

//当点击了关闭按钮是触发的函数,e是事件对象,通过事件对象可以获得事件源

@Override

public void windowClosing(WindowEvent e)

{

Frame f = (Frame) e.getSource();

f.dispose();

}

}

到这里,大家应该对事件监听机制有所理解。接下来我们就进入观察者模式,大家只要明白了事件监听机制,那么观察者模式就明白了,我们可以这样去理解观察者模式:

观察者模式:观察者(Observer)相当于事件监器,被观察者(Observable)相当于事件源和事件,执行事件源逻辑时通知observer触发oberver的方法调用,同时可传被观察者

举个简单示例

package cn.lmj.observer;

public class Demo

{

public static void main(String[] args)

{

Person p = new Person();

p.registerListener(new PersonListener()

{

@Override

public void doRun(Even e)

{

System.out.println(e.getP() + " is running");

}

@Override

public void doEat(Even e)

{

System.out.println(e.getP() + " is eatting");

}

});

p.run();

p.eat();

}

}

// 事件源

class Person

{

private PersonListener listener;

public void run()

{

if (listener != null)

{

listener.doRun(new Even(this));

}

System.out.println("run........");

}

public void eat()

{

if (listener != null)

{

listener.doEat(new Even(this));

}

System.out.println("eat........");

}

// 注册监听器

public void registerListener(PersonListener listener)

{

this.listener = listener;

}

}

// 监听器

interface PersonListener

{

public void doRun(Even e);

public void doEat(Even e);

}

// 事件对象

class Even

{

private Person p;

public Even()

{

super();

}

public Even(Person p)

{

super();

this.p = p;

}

public Person getP()

{

return p;

}

public void setP(Person p)

{

this.p = p;

}

}

到这里相信大家对Java的事件监听机制和观察者模式都很明白了,最后说一下事件监听机制或者观察者模式在javaee开发中的应用。这种设计模式体现在servlet的事件监听器,

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

1,监听三个域对象创建和销毁的事件监听器

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

3,监听绑定到 HttpSession 域中的某个对象的状态的事件监听器。(查看API文档)

最后写一个servlet的监听器监听当前网站的在线用户量,这个值不是很准确

package cn.lmj.web.listener.exapmle;

import javax.servlet.ServletContext;

import javax.servlet.http.HttpSessionEvent;

import javax.servlet.http.HttpSessionListener;

public class CountNumListener implements HttpSessionListener

{

//当session创建时调用该方法

public void sessionCreated(HttpSessionEvent se)

//将在线用户数量的值保持到ServletContext中,已便所有用户看到

ServletContext context = se.getSession().getServletContext();

//第一次获取没有

if(count==null)

{

count = 1;

context.setAttribute("count", count);

}

else

{

count++;

context.setAttribute("count", count);

}

}

//session销毁的时候调用该方法,把存在ServletContext中的数量值减一

public void sessionDestroyed(HttpSessionEvent se)

{

ServletContext context = se.getSession().getServletContext();

Integer count = (Integer) context.getAttribute("count");

count--;

context.setAttribute("count", count);

}

}

java监听机制_详解java的事件监听机制和观察者设计模式相关推荐

  1. java 配置文件的路径_详解java配置文件的路径问题

    详解java配置文件的路径问题 详解java配置文件的路径问题 各种语言都有自己所支持的配置文件,配置文件中有很多变量是经常改变的.不将程序中的各种变量写死,这样能更方便地脱离程序本身去修改相关变量设 ...

  2. java同步异步调用_详解java 三种调用机制(同步、回调、异步)

    1:同步调用:一种阻塞式调用,调用方要等待对方执行完毕才返回,jsPwwCe它是一种单向调用 2:回调:一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口: 3:异步调用:一种类似消 ...

  3. java使用集合存储过程_详解java调用存储过程并封装成map

    详解java调用存储过程并封装成map 发布于 2020-5-1| 复制链接 摘记: 详解java调用存储过程并封装成map           本文代码中注释写的比较清楚不在单独说明,希望能帮助到大 ...

  4. java 死锁 内存消耗_详解Java中synchronized关键字的死锁和内存占用问题

    先看一段synchronized 的详解: synchronized 是 java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并 ...

  5. java 线程一直运行状态_详解JAVA 线程-线程的状态有哪些?它是如何工作的?

    线程(Thread)是并发编程的基础,也是程序执行的最小单元,它依托进程而存在. 一个进程中可以包含多个线程,多线程可以共享一块内存空间和一组系统资源,因此线程之间的切换更加节省资源.更加轻量化,也因 ...

  6. java注解 源码_详解Java注解教程及自定义注解

    详解Java注解教程及自定义注解 更新时间:2016-02-26 11:47:06   作者:佚名   我要评论(0) Java注解提供了关于代码的一些信息,但并不直接作用于它所注解的代码内容.在这个 ...

  7. java的注解方式_详解Java注解的实现与使用方法

    详解Java注解的实现与使用方法 Java注解是java5版本发布的,其作用就是节省配置文件,增强代码可读性.在如今各种框架及开发中非常常见,特此说明一下. 如何创建一个注解 每一个自定义的注解都由四 ...

  8. java集合for循环_详解Java中list,set,map的遍历与增强for循环

    详解Java中list,set,map的遍历与增强for循环 Java集合类可分为三大块,分别是从Collection接口延伸出的List.Set和以键值对形式作存储的Map类型集合. 关于增强for ...

  9. java访问本地文件_详解Java读取本地文件并显示在JSP文件中

    详解Java读取本地文件并显示在JSP文件中 当我们初学IMG标签时,我们知道通过设置img标签的src属性,能够在页面中显示想要展示的图片.其中src的值,可以是磁盘目录上的绝对,也可以是项目下的相 ...

  10. java的自动装箱_详解Java 自动装箱与拆箱的实现原理

    详解Java 自动装箱与拆箱的实现原理 发布于 2020-7-4| 复制链接 本篇文章主要介绍了详解Java 自动装箱与拆箱的实现原理,小妖觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小妖 ...

最新文章

  1. 这个宝藏工具,给你一种黑客般的感觉
  2. Martix工作室考核题 —— 输出1000以内能被3整除,且个位数为6的所有整数。
  3. HDU 4588 Count The Carries 数学
  4. OpenCV图像的轮廓的匹配
  5. 论文浅尝 | 面向时序知识图谱推理的循环事件网络
  6. 高性能业务架构解决方案(LVS+Keepalived)
  7. Android UI 小结
  8. Python之线程同步与线程锁
  9. Angr安装与使用之使用篇(七)
  10. linux系统下安装GCC编译器
  11. 关于微博api返回内容不全内容
  12. android gps测速算法,GPS定位与测速算法研究
  13. ppt背景图片php,ppt背景图片怎么设置 ppt幻灯片制作视频
  14. 将ipa文件安装到手机的最简单方法和将ipa发布到appstore的方法
  15. NLTK的安装/对象/词库/分词/词性标注/分块
  16. 山石网科张凌龄:安全市场日新月异 初创公司不容小觑
  17. 如何批量给视频加文字水印?
  18. 行业上的品牌策划公司是怎么做品牌策划方案的?
  19. mysql下出现Unknown column ‘id‘ in ‘on clause‘的解决方法
  20. 2023年AI十大展望:GPT-4领衔大模型变革,谷歌拉响警报,训练数据告急

热门文章

  1. html框架有什么作用,使用HTML5+CSS+JS框架有那些好处
  2. Wincc V7.3SE安装截图
  3. sql server 自定义函数
  4. Linux用户与“最小权限”原则
  5. iOS 开发疑难杂症(01)
  6. ElasticSearch 2 (27) - 信息聚合系列之故事开始
  7. Objective-C 学习笔记
  8. 利用curl验证ssl网站(webservice)
  9. 673. Number of Longest Increasing Subsequence
  10. [Leedcode][JAVA][第999题][直接考虑题意]