监听器是一个专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动。监听器其实就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法立即被执行。
JavaWeb中的监听器是Servlet规范中定义的一种特殊类,它用于监听web应用程序中的ServletContext, HttpSession和 ServletRequest等域对象的创建与销毁事件,以及监听这些域对象中的属性发生修改的事件。
在Servlet规范中定义了多种类型的监听器,它们用于监听的事件源分别为ServletContext,HttpSession和ServletRequest这三个域对象
Servlet规范针对这三个对象上的操作,又把多种类型的监听器划分为三种类型:
-
监听域对象自身的创建和销毁的事件监听器。
-
监听域对象中的属性的增加和删除的事件监听器。
-
监听绑定到HttpSession域中的某个对象的状态的事件监听器。
package campu; import java.awt.Frame; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; //监听器案例——监听window窗口的事件监听器 /** *java的事件监听机制 *1、事件监听涉及到三个组件:事件源、事件对象、事件监听器 *2、当事件源上发生某一个动作时,它会调用事件监听器的一个方法,并在调用该方法时把事件对象传递进去, * 开发人员在监听器中通过事件对象,就可以拿到事件源,从而对事件源进行操作。 */ public class Demo1 { public static void main(String[] args) { Frame f=new Frame(); f.setSize(600, 600); f.setVisible(true); //注册事件监听器 f.addWindowListener(new WindowListener() { @Override public void windowOpened(WindowEvent e) { // TODO Auto-generated method stub } @Override public void windowIconified(WindowEvent e) { // TODO Auto-generated method stub } @Override public void windowDeiconified(WindowEvent e) { // TODO Auto-generated method stub } @Override public void windowDeactivated(WindowEvent e) { // TODO Auto-generated method stub } /** * 当window窗体关闭时就会WindowListener这个监听器监听到, * 监听器就会调用windowClosing方法处理window窗体关闭时的动作 */ @Override public void windowClosing(WindowEvent e) { // TODO Auto-generated method stub //通过事件对象e来获取事件源对象 Frame f= (Frame) e.getSource(); System.out.println("窗口正在关闭"); } @Override public void windowClosed(WindowEvent e) { // TODO Auto-generated method stub } @Override public void windowActivated(WindowEvent e) { // TODO Auto-generated method stub } }); } }
事件处理模型涉及到三个组件:事件源、事件对象、事件监听器。
demo:按照事件处理模型来设计一个Person对象。
package campu; /* * 设计一个Person类作为事件源,这个类的对象的行为(比如吃饭、跑步)可以被其他的对象监听 */ interface PersonListener{ void doeat(Event e);//这个方法是用来监听Person对象eat(吃)这个行为动作,当实现类实现doeat方法时就可以监听到Person类对象eat(吃)这个动作 void dorun(Event e); //同上 } class Event{ private Person source; public Event() { // TODO Auto-generated constructor stub } public Person getSource() { return source; } public void setSource(Person source) { this.source = source; } public Event(Person source) { this.source = source; } } public class Person { private PersonListener listener;// 在Person类中定义一个PersonListener变量来记住传递进来的监听器 public void eat(){ /* * 调用监听器的doeat方法监听Person类对象eat(吃)这个动作,将事件对象Event传递给doeat方法, * 事件对象封装了事件源,new Event(this)中的this代表的就是事件源 */ if(listener!=null){ listener.doeat(new Event(this)); } } public void run(){ if(listener!=null){ listener.dorun(new Event(this)); } } // 这个方法是用来注册对Person类对象的行为进行监听的监听器 public void registerListener(PersonListener listener){ this.listener=listener; } }
测试: package campu; public class PersonTest { public static void main(String[] args) { Person p=new Person(); //注册监听p对象行为的监听器 p.registerListener(new PersonListener() { @Override public void dorun(Event e) { // TODO Auto-generated method stub Person p= e.getSource(); System.out.println(p+"在跑步"); } //监听p吃东西这个行为 @Override public void doeat(Event e) { // TODO Auto-generated method stub Person p= e.getSource(); System.out.println(p+"在吃东西"); } }); p.eat(); p.run(); } }