1、事件源:發生事件的對象。
2、監聽器:是一個接口,監聽事件源上要發生的動作
3、事件:事件對象一般是作爲監聽器方法的參數存在的,它封裝了發生事件的對象
二、Servlet中提供的監聽器(8個)
八個監聽器分類:
2.1監聽ServletContext、HttpSession、ServletRequest對象的創建和銷燬的監聽器。
ServletContextListener:監聽ServletContext對象的創建和銷燬。
HttpSessionListener:監聽HttpSession對象的創建和銷燬。
創建:第一次調用request.getSession()時。
銷燬:1、主動調用invalidate()方法
2、超時
ServletRequestListener:監聽ServletRequest對象的創建和銷燬。
2.2監聽ServletContext、HttpSession、ServletRequest對象中域變化(新來的,替換的,刪除的)的監聽器。
ServletContextAttributeListener:
HttpSessionAttributeListener:
ServletRequestAttributeListener:
2.3感知型監聽器:誰實現了這些接口,誰就能感知自己被怎麼着了。這種監聽器不需要註冊。
HttpSessionActivationListener:感知自己何時隨着HttpSession對象鈍化和活化
HttpSessionBindingListener:感知自己何時被HttpSession對象綁了(綁在域中)和解綁了。
編寫步驟:
1、編寫一個類實現某個監聽器接口
2、在web.xml中註冊監聽器
<listener>
<listener-class>cn.usst.listener.ServletContextDemoListener</listener-class>
</listener>
三、觀察者設計模式設計一個程序
//事件源
public class Student implements Serializable{
private String name;
private StudentListener listener;
public Student(String name){//注入:通過構造方法
this.name = name;
}
public String getName() {
return name;
}
public void eat(){
if(listener!=null){
listener.preEat(new StudentEvent(this));
}
System.out.println("開始喫");
}
public void study(){
if(listener!=null){
listener.preStudy(new StudentEvent(this));
}
System.out.println("開始學");
}
}
public class StudentEvent {
private Object source;
public StudentEvent(Object source){
this.source = source;
}
public Object getSource() {//獲取事件源
return source;
}
}
public interface StudentListener {
void preEat(StudentEvent e);//監聽喫
void preStudy(StudentEvent e);//監聽學
}
測試用例:
public static void main(String[] args) {
Student s = new Student("葛付以");
//註冊監聽器
s.addStudentListener(new StudentListener() {
public void preStudy(StudentEvent e) {
Student ss = (Student) e.getSource();
System.out.println(ss.getName()+"喝杯奶吧");
}
public void preEat(StudentEvent e) {
Student ss = (Student) e.getSource();
System.out.println(ss.getName()+"慢慢喫");
}
});
s.eat();
s.study();
}