標籤:java 監聽器
一、監聽器概念
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();}