Servlet-api.jar定义了如下对象
抽象类HttpServlet中使用了模版方法service(定义了HttpServlet处理的总流程和框架),并提供7个doXXX子方法的默认实现,具体的Servlet只需要继承HttpServlet并替换相应的do方法来完成自己的业务逻辑即可。
HttpSession:所有Http协议的Session都需要实现的方法
package javax.servlet.http;
public abstract interface HttpSession
EventObject:所有事件状态对象都将从其派生的根类。 所有 Event 在构造时都引用了对象
"source",在逻辑上认为该对象是最初发生有关 Event 的对象。
public class EventObjectextends Objectimplements Serializable
HttpSessionEvent:HttpSession定义的事件,其souce是HttpSession
package javax.servlet.http;
import java.util.EventObject;
public class HttpSessionEvent extends EventObject
{
public HttpSessionEvent(HttpSession source)
{
super(source);
}
public HttpSession getSession() {
return ((HttpSession)super.getSource());
}
}
EventListener:所有事件监听器接口必须扩展的标记接口。
public interface EventListener
HttpSessionListener:HttpSession对应的事件监听接口,明确定义了需要监听的事件sessionCreated和sessionDestroyed
package javax.servlet.http;
import java.util.EventListener;
public abstract interface HttpSessionListener extends EventListener
{
public abstract void sessionCreated(HttpSessionEvent paramHttpSessionEvent);
public abstract void sessionDestroyed(HttpSessionEvent paramHttpSessionEvent);
}
在tomcat的catalina.jar中,tomcat容器实现的HttpSession类为StandardSession。
StandardSession实现类中,实现了定义了下述属性和方法:
protected transient ArrayList listeners = new ArrayList();:事件监听程序的集合
addSessionListener(SessionListener):添加Session事件监听程序
public void addSessionListener(SessionListener listener)
{
this.listeners.add(listener);
}
fireSessionEvent(String, Object):触发所有事件监听程序的集合中的事件
public void fireSessionEvent(String type, Object data)
{
if (this.listeners.size() < 1)
return;
SessionEvent event = new SessionEvent(this, type, data);
SessionListener[] list = new SessionListener[0];
synchronized (this.listeners) {
list = (SessionListener[])(SessionListener[])this.listeners.toArray(list);
}
for (int i = 0; i < list.length; ++i)
list[i].sessionEvent(event);
}
removeSessionListener(SessionListener):移除Session事件监听程序
public void removeSessionListener(SessionListener listener)
{
this.listeners.remove(listener);
}
tellNew:调用fireSessionEvent的地方
public void tellNew()
{
fireSessionEvent("createSession", null);
....
}
public class org.apache.catalina.session.StandardSession implements javax.servlet.http.HttpSession, org.apache.catalina.Session, java.io.Serializable
StandardSessionFacade:和StandardSession 实现了相同的接口HttpSession,在构造函数中把StandardSession的实例传递进来,它只曝露servlet规范中定义的HttpSession中需要实现的方法,其他的方法比如addSessionListener等不需要曝露出去(Facade)
public class org.apache.catalina.session.StandardSessionFacade implements javax.servlet.http.HttpSession
参考:
关于观察者模式的问题