抽象类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
参考: 关于观察者模式的问题