Jetty9源码剖析 - Handler组件 - 概述

转载自ph0ly:http://www.ph0ly.com

一、Handler的概念

Handler组件是Jetty实际处理Http请求业务逻辑的执行器,一个实际的Jetty服务应该最少存在一个Handler。Handler有很多种形态,例如单纯处理Servlet请求的或者是一个包含多个Handler的容器

二、Handler组件在Jetty生态中的位置

当请求到来时,Server组件会调用自身的handle方法,这时会调用关联的Handler的handle方法处理

三、继承体系

Handler组件继承体系

四、源码剖析

1. Handler接口:

Handler继承图

Handler组件和常规的其他很多组件一样具有生命周期LifeCycle,同时可以被销毁Detroyable

Handler方法

从图中我们看到Handler组件有4个方法,很显然handle是咱们核心的方法,处理器的处理方法

2. HandlerContainer接口

HandlerContainer继承图

HandlerContainer也具有生命周期LifeCycle,该接口用于表示一个Handler的容器

HandlerContainer方法

从图中可以看到核心的几个方法,其中getChildHandlersByClass方法(查找当前Handler容器下的目标Handler类)在较多的实现类中引用,getChildHandlerByClass是查找单个Handler,其他就不用解释了,看名字就知道是干什么用的

3. AbstractHandler抽象类

AbstractHandler继承图

正如之前文章所说,Jetty几乎对每个组件都实现一套骨架,Handler组件也不例外,AbstractHandler即为Handler的骨架,AbstractHandler继承ContainerLifeCycle并实现Handler接口

AbstractHandler方法

AbstractHandler实现了父类的一些方法,提供了一个通用的抽象,这里主要分析里面核心方法:

handle:在这个类并没有实现

doStart:没有特别处理,直接调用父类doStart

doStop:调用父类doStop

其他:该抽象类唯一多了一个_server字段,主要实现对Server的关联操作

4. AbstractHandlerContainer抽象类

AbstractHandlerContainer继承图

注意AbstractHandlerContainer继承AbstractHandler同时具有HandlerContainer特性

AbstractHandlerContainer方法

该类完成一些通用的操作,例如getChildHandlers获取孩子处理器,getChildHandlersByClass、getChildHandlerByClass这些操作都实现了一个骨架,但是对于每个容器可能他们对应的孩子寻找方法不一样(比如容器的集合HandlerCollection需要挨个Handler遍历查找孩子,HandlerWrapper仅对被装饰的Handler查找),因此在该类抽象一个expandChildren方法,让子类自行实现。同时提供了一个expandHandler方法,展开单个Handler的孩子,让子类方便调用

5. HandlerCollection

HandlerCollection继承AbstractHandlerContainer,将一组Handler包装起来,并具有单个Handler的特性

HandlerCollection继承图

方法列表如图:

HandlerCollection方法

这里重点讲解两个方法:handle和expandChildren,其他方法都比较普通,大家可以自行分析源码

handle:作为一个容器,很自然应该让容器里面的每个孩子处理了,因此它会遍历孩子挨个处理

handle方法

expandChildren:作为Handler集合容器,很自然是让每个孩子也都执行expandHandler(AbstractHandlerContainer提供)

expandChildren方法

6. HandlerWrapper

HandlerWrapper继承图

HandlerWrapper继承自AbstractHandlerContainer,说明他也是个Handler容器

HandlerWrapper方法

从成员变量中可以看出,HandlerWrapper是针对一个Handler进行包装,这里仅讲解handle、expandChildren方法,其他大家可以自行参考源码

handle:作为一个包装器,当然是调用实际的被包装Handler的handle方法

handle方法

expandChildren:调用父类抽象的expandHandler将当前包装的Handler作为展开对象进行操作

expandChildren方法