Jetty9原始碼剖析
一、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作為展開物件進行操作