转载自ph0ly:http://www.ph0ly.com
一、Handler的概念
Handler组件是Jetty实际处理Http请求业务逻辑的执行器,一个实际的Jetty服务应该最少存在一个Handler。Handler有很多种形态,例如单纯处理Servlet请求的或者是一个包含多个Handler的容器
二、Handler组件在Jetty生态中的位置
当请求到来时,Server组件会调用自身的handle方法,这时会调用关联的Handler的handle方法处理
三、继承体系
四、源码剖析
1. Handler接口:
Handler组件和常规的其他很多组件一样具有生命周期LifeCycle,同时可以被销毁Detroyable
从图中我们看到Handler组件有4个方法,很显然handle是咱们核心的方法,处理器的处理方法
2. HandlerContainer接口
HandlerContainer也具有生命周期LifeCycle,该接口用于表示一个Handler的容器
从图中可以看到核心的几个方法,其中getChildHandlersByClass方法(查找当前Handler容器下的目标Handler类)在较多的实现类中引用,getChildHandlerByClass是查找单个Handler,其他就不用解释了,看名字就知道是干什么用的
3. AbstractHandler抽象类
正如之前文章所说,Jetty几乎对每个组件都实现一套骨架,Handler组件也不例外,AbstractHandler即为Handler的骨架,AbstractHandler继承ContainerLifeCycle并实现Handler接口
AbstractHandler实现了父类的一些方法,提供了一个通用的抽象,这里主要分析里面核心方法:
handle:在这个类并没有实现
doStart:没有特别处理,直接调用父类doStart
doStop:调用父类doStop
其他:该抽象类唯一多了一个_server字段,主要实现对Server的关联操作
4. AbstractHandlerContainer抽象类
注意AbstractHandlerContainer继承AbstractHandler同时具有HandlerContainer特性
该类完成一些通用的操作,例如getChildHandlers获取孩子处理器,getChildHandlersByClass、getChildHandlerByClass这些操作都实现了一个骨架,但是对于每个容器可能他们对应的孩子寻找方法不一样(比如容器的集合HandlerCollection需要挨个Handler遍历查找孩子,HandlerWrapper仅对被装饰的Handler查找),因此在该类抽象一个expandChildren方法,让子类自行实现。同时提供了一个expandHandler方法,展开单个Handler的孩子,让子类方便调用
5. HandlerCollection
HandlerCollection继承AbstractHandlerContainer,将一组Handler包装起来,并具有单个Handler的特性
方法列表如图:
这里重点讲解两个方法:handle和expandChildren,其他方法都比较普通,大家可以自行分析源码
handle:作为一个容器,很自然应该让容器里面的每个孩子处理了,因此它会遍历孩子挨个处理
expandChildren:作为Handler集合容器,很自然是让每个孩子也都执行expandHandler(AbstractHandlerContainer提供)
6. HandlerWrapper
HandlerWrapper继承自AbstractHandlerContainer,说明他也是个Handler容器
从成员变量中可以看出,HandlerWrapper是针对一个Handler进行包装,这里仅讲解handle、expandChildren方法,其他大家可以自行参考源码
handle:作为一个包装器,当然是调用实际的被包装Handler的handle方法
expandChildren:调用父类抽象的expandHandler将当前包装的Handler作为展开对象进行操作