servlet-api和tomcat中的观察者模式、门面模式、模版方法模式

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


参考: 关于观察者模式的问题

你可能感兴趣的:(servlet)