初步了解Tomcat服务器(二)

来源:互联网 发布:阿里云华南 编辑:程序博客网 时间:2024/06/06 08:54

说明

      本文基于《深入分析Java Web技术内幕》对知识进行记录和总结,前篇博文《初步了解Tomcat服务器(一)》对Tomcat的大体架构,容器进行简单介绍,今天对Tomcat中的设计模式进行总结。

正文

门面设计模式(外观设计模式)

      这种设计模式主要用在在一个大的系统中有多个子系统时,子系统之间互相通信,但是又不能将数据过多的暴露给彼此,所以每个子系统都会设计一个门面,把别的系统需要数据进行封装,通信时只通过这个门面进行访问

这里写图片描述

      Tomcat中,门面设计有很多,每个组件都要交互数据,使用门面设计模式隔离数据。

      在Servlet初始化时,需要获取容器信息,通过上篇博文已经知道Wrapper的实现类StandardWrapper拥有一个Servlet初始化信息的ServletConfig,但是Servlet不会直接访问StandardWrpper类,而是在调用Servlet的init方法时,同时会传一个StandardWrapperFacade对象给Servlet,这个对象包装了StandardWrapper,需要的信息都在StandarWrapperFacade里封装,而这些信息又是在StandardWrapper对象中拿到的,所以Servlet可以通过ServletConfig拿到有限的容器信息

观察者设计模式(发布-订阅模式)

这里写图片描述

Subject抽象主题:它负责管理所有观察者的引用,同时定义主要的事件操作

ConcreteSubject具体主题:它实现了抽象主题所定义的所有接口,当自己发生变化时,会通知所有观察者

Observer观察者:监听主题发生变化的操作接口

ConcreteObserver具体观察者:实现Observer的更新接口以使自身状态与目标状态保持一致

Tomcat中观察者模式也有多处使用,控制组件生命周期的Lifecycle,Servlet实例的创建、Session的管理、Container等

Lifecycle的具体实现

这里写图片描述

LifecycleListener代表的是抽象观察者,定义了一个lifecycleEvent方法,这个方法就是当主题变化时要执行的方法

ServerLifecycleListener代表的是具体的观察者,实现了LifecycleListener接口中的方法

Lifecycle接口代表的是抽象主题,定义了管理观察者的方法和其他方法

StandardServer代表具体主题,实现了抽象主题的所有方法
      Tomcat对观察者做了扩展,增加了另外两个类:LifecycleSupport和LifecycleEvent,它们作为辅助类扩展了观察者的功能。LifecycleEvent可以定义事件的类别,对不同的事件可区别处理,更加灵活。LifecycleSupport类代理了主题对多观察者的管理,将这个管理抽出来统一实现,以后如果需要修改只需修改LifecycleSupport类就可以了,不需要修改所有的主题,这是对观察者模式的一种改进。

命令设计模式

这里写图片描述

      命令模式的主要作用就是封装命令,把发出命令的责任和执行命令的责任分开,也是一种功能的分工。不同的模块可以对同一个命令做出不同的解释

Client:创建一个命令,并决定接受者

Command:命令接口,定义一个抽象方法

ConcreteCommand:具体命令,负责调用接受者的相应操作

Invoker:请求者,负责调用命令对象执行请求

Receiver:接受者,负责具体实施和执行一次请求

      Tomcat中命令模式在Connector和Container组件之间有体现,上篇博文提到Connector会产生处理请求的线程,这个线程是被Container处理,多线程为Container的设计核心。Tomcat作为服务器,会接受到很多请求,如何分配和执行这些请求是必须的功能

这里写图片描述

Connector作为抽象请求者,HttpConnector作为具体请求者,HttpProcessor作为命令,Container作为命令的抽象接受者,ContainerBase作为具体的接受者,客户端就是应用服务器Server组件。
Server首先创建命令请求者HttpConnector对象,然后创建命令HttpProcessor对象,再把命令对象交给命令接受者ContainerBase容器来处理。命令最终是被Tomcat的Container执行的

责任链设计模式

这里写图片描述

      责任链设计模式就是很多对象由每个对象对其下家的引用而连接起来形成一条链,请求在这条链上传递,直到链上的某个对象处理此请求,或者每个对象都可以处理请求,并传给“下家”,直到最终链上每个对象都处理完。这样可以不影响客户端而能够在链上增加任意处理节点

Handler:定义一个处理请求的接口

ConcreteHandler:处理请求的具体类,或者传给“下家”

      Tomcat的容器设置就是责任链设计模式,从Engine到Host再到Context一直到Wrapper都通过一个链传递请求。Container为抽象处理者,具体处理者为StandardEngine等子容器,与标准责任链不同,Tomcat中引入了Pipeline和Value接口,它们扩展了链的功能,使得链在向下传递的过程中能接受外界的干预。

原创粉丝点击