1.监听器:
监听器-就是一个实现待定接口的普通Java程序,此程序专门用于监听别一个类的方法调用。都是使用观察者设计模式。
什么是观察者模式:
定义对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知自动更新。
示例: GUI编程中的addXxxxListener都是观察者模式。
2.观察者模式的三个重要类:
- 被监听者事件源
- 注册一个监听器XXXListener
- 事件对像Event
3.观察者设计模式示例:
开发步骤:
* 第一步:实现一个需要被监听的类Cat.
* 第二步:实现一个监听接口ICatListener。
* 第三步:在Cat类中,提供一个方法用于注册ICatListener类,即addListener
* 第四步:必须要在Cat类中维护ICatListener类的实例。
* 第五步:在调用cat.climb方法是,判断ICatListener是否为null,如果不为null则调用它的climb方法。
* 第六步:在Main类中,实例化Cat,并注册一个监听。
4.给观察者模式-添加事件源:
开发步骤:
第一步:在前页的基础上继续添加一个CatEvent类(注意我说是類不是接口),代表事件对像。
第二步:给CatEvent对像,添加一个Object属性,用以标识事件源对像。
第三步:修改ICatListener接口的climb方法,让它接收一个CatEvent参数。
第四步:在Cat类climb方法中,如果判断ICatListener属性不为空,则在调用climb方法,实例化CatEvent并传给climb方法。
第五步:在main方法中,通过CatEvent的getSource方法测试是否是同一个对像。
第六步:在Cat对象中写入actionCommand的set和get函数,在CatEvent写入actionCommand的get函数
第六步:写个默认的实现ICatListener的实现类
示例代码
Cat.java
public class Cat {
private String name;
private ICatListener listener;
private String actionCommand;
public Cat(String name) {
this.name = name;
}
public void climb(){
System.out.println(name+"好调皮,在爬");
if(listener!=null){
listener.help(new CatEvent(this));//传自己
}
}
public void addCatlistener(ICatListener listener ){
this.listener=listener;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void setActionCommand(String actionCommand) {//获得命令
this.actionCommand = actionCommand;
}
public String getActionCommand() {
return actionCommand;
}
@Override
public String toString() {
return name;
}
}
ICatListener.java
interface ICatListener{
public void help(CatEvent e);
}
CatEvent.jaa
class CatEvent{
private Cat cat;
private String actionCommand;
public CatEvent(Cat cat) {
this.cat = cat;
actionCommand=cat.getActionCommand();//actionCommand在这进行判断
}
public Object getSource(){
return cat;
}
public String getActionCommand() {
return actionCommand;
}
}
DeFaultCatListener.java
class DeFaultCatListener implements ICatListener{
@Override
public void help(CatEvent e) {
System.out.println("这是默认猫做的事");
}
}
有了以上的的基础,下面引入Servlet技术的监听器
监听ServletContext的创建和销毁:
开发步骤:
第一步:实现ServletContextListener接口。
第二步:实现两个方法。
contextInitialized
contextDestroyed
第三步:在web.xml中添加节点。
这一点与swing中的添加监听有所区别。
第四步:测试
1、发布项目启动。
2、通过Tomcat管理控制台停止此项目。
ContextListener应用场景:
记录一个网站的刷新量。
当服务器关闭时,必须要保存到文件中或是数据库中去。
当服务器启动时,先从文件中读取并放到ServletContext。
在Filter中记录访问量,每次访问都加1。
好处:信息不是太重要,没有必要每次用户访问都访问数据库或是操作文件。
在为不影响用户的速度感受,应该开始一个新的线程同去操作数据。 这样即使在后台使用同步技术,用户也不会感觉到速度很慢。
HttpSession的监听器:
HttpSessionListener,监听HttpSession的创建和销毁。
sessionCreated
sessionDestroyed
Session的默认有效时间为30分。可以通过配置的方式修改它的值。
可以调用session.invalidate方法销毁当前Session.
主要作用是记录当前所有在线人数,无论是用户还是游客。
Servlet、过滤器、监听器实例化对象的优先级和销毁的优先级
创建(初始化): (ServletContext) 监听器–>过滤器–>Servlet. 调用时候:过滤器–>监听器–>Servlet. 销亡:Servlet–>过滤器–>监听器.