从现实世界来说,我们每一个人都是观察者:
被观察者会发出一些信息,观察者接收到这些信息之后,或做出相应的反应,观察者会被被观察者发出的信息所影响。
观察者设计模式设计了"一对多的"关联关系。观察者和被观察者,在java编程中表示具有某一类功能的对象。用接口表示。
监听器设计模式:
是观察者设计模式的一种实现。并不是23 种设计模式之一。
监听器==》观察者
被监听对象==》被观察者
被监听的状态被定义为一个对象,称为事件。
被监听对象称为事件源
对监听器的通知称为触监听器
Servlet 规范中的监听器(8个)
他们分别监听的对象是:request session servletContext (也就是说事件源是这三个)
触发这8个监听器的是这三个对象的添加 删除 修改 创建销毁 以及session的钝化和活化
监听器必须在 web.xml中对其注册
(1)ServletRequestListener
两个方法:
requestDestroyed(ServletRequestEvent sre)
requestInitialized(ServletRequestEvent sre)
Eg:
首先定义一个类MyRequestListener 实现ServletRequestListener 接口
然后在 web.xml中注册
<listener>
<listener-class>com.csu.servletListener.MyRequestListener</listener-class>
</listener>
(2)servletRequestAttributeListener
有三个方法
//当向 request域中添加属性的时该方法会执行
public void attributeAdded(ServletRequestAttributeEvent srae)
//当 requset中删除属性的时候 该方法会执行
public void attributeRemoved(ServletRequestAttributeEvent srae)
//当 重置request中的属性的时候 会执行
public void attributeReplaced(ServletRequestAttributeEvent srae)
(3)HttpSessionListener
主要是用于session 的创建和销毁,有两个方法:
sessionCreated(HttpSessionEvent se) //session被创建的
sessionDestroyed(HttpSessionEvent se)//session 被销毁的
(4) HttpSessionAttributeListener
完成对session 域属性空间的添加修改删除等操作。的监听
主要有三个方法:
attributeAdded(HttpSessionBindingEvent se)//向session域中添加
attributeRemoved(HttpSessionBindingEvent se)//移除session 域中
attributeReplaced(HttpSessionBindingEvent se)//替换session域中的东西
(5)ServletContextListener
监听servletContext 的创建于销毁。
servletContext 在应用中只有一个,在服务器启动的时候创建的,servletContext 的生命周期和整个应用的生命周期相同。所以当项目重新部署,或者是服务器关闭才可以 销毁servletContext
有两个方法:
ContextInitialized(ServletContextEvent ev)//初始化ServletContext
ContextDestoryed(ServletContextEvent ev)//销毁ServletContext的时候
(6)ServletContextAttributeListener
attributeAdded(ServletContextEvent scae)//向servletContext域中添加
attributeRemoved(ServletContextEvent scae)//移除servletContext 域中
attributeReplaced(ServletContextEvent scae)//替换servletContext域中的东西
(7)HttpSessionBindingListener
两个方法
valueBound() //绑定
valueUnbound()//解绑
他的事件源不是session 而是实体类。
这个比较特别,这个不需要再 web.xml中注册。而且这个是 实体类实现HttpSessionBindingListener。
有两个方法:
Eg:
package com.csu.beans;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
//是实体类 实现这个接口。
//该监听器是不需要注册的。
public class Student implements HttpSessionBindingListener {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Student() {
super();
}
public Student(String name, Integer age) {
super();
this.name = name;
this.age = age;
}
//当当前类的对象绑定到session时(放入到session 域中的时候)
@Override
public void valueBound(HttpSessionBindingEvent event) {
System.out.println("student 对象放入到session域中的时候");
System.out.println(event.getName()+event.getValue());
}
//当当前对象与session解绑(从session域中删除的时候)的时候,会触发该方法的执行
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
System.out.println("student 对象从session域中移除的时候的时候");
System.out.println(event.getName()+event.getValue());
}
}
(8) HttpSessionActivactionListener
事件源不是session 而是实体类
该监听器,监听在session中存放的指定类型对象的钝化和活化。
钝化:就是session中的对象写入到硬盘。
活化:就是将硬盘中的东邪,读入内存
Eg:
//不需要注册,是实体类实现的HttpSessionActivationListener接口。同时还要实现Serializable接口。
public class Person implements HttpSessionActivationListener,Serializable {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Person() {
super();
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
//钝化当前类的对象被钝化时,
@Override
public void sessionWillPassivate(HttpSessionEvent se) {
System.out.println("person 将要被钝化");
}
//session 被活化了,对象被活化。
@Override
public void sessionDidActivate(HttpSessionEvent se) {
System.out.println("student 已经被活化");
}
}