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 在构造时都引用了对象 [color=red]"source"[/color],在逻辑上认为该对象是最初发生有关 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


参考:[url=http://www.iteye.com/topic/182643]关于观察者模式的问题[/url]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值