首先说说监听器:
监听器就是一个实现特定接口的普通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();
Integer count = (Integer) context.getAttribute("count");
//第一次获取没有
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);
}
}