jetty 架構

                                                                             Jetty 6 架構

原文:Jetty 6 Architecture

概括:

jetty架構

Jetty server是由一組接受http連接的Connectors和一組處理來自連接的請求並作出響應的Handlers構成的,其工作是通過取自線程池中的線程來完成的。

 

注意:雖然jettyrequest/responses是從Servlet api傳遞來的,但是要獲得全功能的servlet api必須配置適當的handler。比如:在request中的session api只有在request傳遞給了SessionHandler之後纔可用。Servlet概念本身是由ServletHandler實現的。如果servlets不是必須的,servlet api很少使用。因此,jetty可以通過簡單的connectiorshandlers構建,而不需要servlets

 

Jetty的配置工作就是構建一個connectors和handlers的網絡,並提供他們單獨的配置。因爲jetty組件就是簡單的POJO,這種組件的配置可以通過多種技術實現:

Ø         在代碼中實現, 可以查看org.mortbay.jetty.example包中的例子。

Ø         使用jetty.xml-xml格式的依賴注入風格

Ø         使用依賴注入框架:Spring或Xbean

Ø         使用Deployers:WebAppDeployer, ContextDeployer

 

 

模式

Jetty的實現遵循一些標準的模式,大部分的抽象概念通過接口捕獲(captured)的,比如Connector,Handler,Buffer。這些接口的通用處理通過抽象類來實現,比如:AbstractConnector, AbstractHandler and AbstractBuffer

從JSR77的生命週期得到靈感,大部分的jetty組件是通過LifeCycle接口呈現的,其抽象實現(AbstractLifeCycle)是大部分jetty組件的基礎。

Jetty提供了自己的建立在String,byte數組和nio緩衝之上的IO buffer的抽象。這樣得到更好的可移植性,並且也隱藏了一些nio層和它的高級特性的複雜性。

 

Connectors

Connectors進行協議的處理:接受連接,分析請求,生成響應。基於使用的協議,調度模型,io api的不同,有多中可用的connector:
SocketConnector – 用於繁忙的連接或是nio不可用的場合
BlockingChannelConnector -用於繁忙的連接,並且nio可用
SelectChannelConnector – 用於大部分時間空閒的連接或者ajax請求的異步處理
SslSocketConnector – SSL,並且NIO不可用
SslSelectChannelConnector - SSL ,並且支持非阻塞的NIO
AJPConnector - AJP 協議支持,用於來自apache mod_jk or mod_proxy_ajp的連接

Handlers

Handler是用來處理接收到的請求的組件。Handler的核心api是handle方法:
public void handle(String target, HttpServletRequest request, HttpServletResponse response, int dispatch)
throws IOException, ServletException;

該方法的實現中,必須處理請求,將請求傳遞到另一個handler(或servlet),或者是改變和(或)包裝請求之後再傳遞出去。這裏給出三種風格的Handler:
協調處理器 – 將請求傳遞給其他的handlers (eg HandlerCollection, ContextHandlerCollection)
過濾處理器 – 對請求進行包裝後再傳遞給其他的handler (eg. HandlerWrapper, ContextHandler, SessionHandler)
生成處理器 – 生成內容(eg ResourceHandler and ServletHandler)

另見: Writing a Jetty Handler。
Servlets

      

ServletHandler是一個生成內容(content)的Handler,通過將請求傳遞給任何配置的過濾器(Filters),然後再傳遞給通過url patten映射到的Servlet

ServletHandler通常部署在Servlet上下文(Context)中。Servlet上下文是一個ContextHandler,包含有方便的從url映射到servlet的方法。

Filters和servlets也可以在當前的上下文中使用RequestDispatcher將請求發送到其他的context或是servlet。

Context

Context 是用於將其他handler分組在特定的URL 上下文路徑或者虛擬主機之下的handler。通常一個context包含:
一個上下文路徑( context path)用來定義什麼請求會被context處理 (eg /myapp )
一個資源根路徑(resource base)用來提供靜態內容 (eg: docroot)
一個類載入器,用於載入特定於conext的類 (通常: docroot/WEB-INF/classes)
虛擬主機名

Context的實現包括:
ContextHandler
Servlet Context
Web Application Context.

web application context 將security, session and servlets handler組合進一個單獨的單元中,可以通過web.xml的描述符進行的配置。
Web Applications


WebAppContext是servlet 上下文的延伸,支持標準的web程序佈局和通過web.xml的描述符進行的session,security,listeners,filter,servlet和jsp的配置

本質上,WebAppContext是一個幫助其他handler構建和配置,以完成標準webapp配置的方便的類

配置實際上是通過可插拔的Configuration 類來實現的,其中最首要的是WebXmlConfiguration

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章