1. 程式人生 > >Jetty9原始碼剖析

Jetty9原始碼剖析

一、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方法