Jetty 架構

Jetty6的架構


Connector(連接器)集合負責接收HTTP連接。handler(處理器)集合負責處理連接請求並給予響應。而Jetty Server(服務器)則是前兩者的管道連接器。負責創建並初始化connector、handler、ThreadPool組件,然後調用start方法啓動他們。ThreadPool(線程池)爲他們完成工作提供線程。
Jetty Server演示代碼

Java代碼  收藏代碼
  1. //1:定義server  
  2. Server server = new Server();  
  3.   
  4. //2:把連接器集合放到server裏  
  5. Connector connector=new SelectChannelConnector();  
  6. connector.setPort(8080);  
  7. server.setConnectors(new Connector[]{connector});  
  8.   
  9. //3:並把處理器集合放到server裏  
  10. Handler param=new ParamHandler();  
  11. Handler hello=new HelloHandler();  
  12. HandlerCollection handlers = new HandlerCollection();  
  13. handlers.setHandlers(new Handler[]{param,hello});  
  14. server.setHandler(handlers);  
  15.   
  16. //4:啓動server  
  17. server.start();  
  18. server.join();  
 

模式



jetty遵循一些比較規範的模式,最抽象的概念通過接口定義,如連接器,處理器和緩衝區。在抽象類中實現這些接口的通用操作,如AbstractConnector, AbstractHandler and AbstractBuffer。

Connectors

 

連接器表示協議的處理者,負責解析請求並生成響應。不同類型的連接器在其基於的協議下有效,如調度模型和IO API的使用:

•SocketConnector - for few busy connections or when NIO is not available.
•BlockingChannelConnector - for few busy connections when NIO is available
•SelectChannelConnector - for many mostly idle connections or asynchronous handling of Ajax requests.
•SslSocketConnector - 沒有使用NIO的SSL連接器。
•SslSelectChannelConnector - 使用非阻塞NIO支持的SSL連接器。
•AJPConnector AJP protocol support for connections from apache mod_jk or mod_proxy_ajp

connectors的使用代碼

Java代碼  收藏代碼
  1. Connector connector=new SelectChannelConnector();  
  2. connector.setPort(8080);  

Handlers

Handler組件負責處理接收到的請求. handler核心的API是handle方法:

 

Java代碼  收藏代碼
  1. public void handle(String target, HttpServletRequest request, HttpServletResponse response, int dispatch)  
  2.     throws IOException, ServletException;  
 

這個方法的實現可以處理請求,傳遞請求到另外一個處理器(或者servlet),或修改幷包裝請求並傳遞出去。有三種類型的處理器:

  1. Coordinating Handlers - 負責路由請求到其他處理器的處理器(eg HandlerCollection, ContextHandlerCollection)
  2. Filtering Handlers - 負責增加請求並傳遞到其他處理器的處理器(eg. HandlerWrapper, ContextHandler, SessionHandler)
  3. Generating Handlers - 負責產生內容的處理器(eg ResourceHandler and ServletHandler)

Handler代碼如下

Java代碼  收藏代碼
  1. Handler handler=new HelloHandler();  
  2. server.setHandler(handler);  
  3.   
  4.  public static class HelloHandler extends AbstractHandler  
  5.     {  
  6.         public void handle(String target, HttpServletRequest request, HttpServletResponse response, int dispatch) throws IOException, ServletException  
  7.         {  
  8.             Request base_request = (request instanceof Request) ? (Request)request:HttpConnection.getCurrentConnection().getRequest();  
  9.             base_request.setHandled(true);  
  10.   
  11.             response.setContentType("text/html");  
  12.             response.setStatus(HttpServletResponse.SC_OK);  
  13.             response.getWriter().println("<h1>Hello OneHandler</h1>");  
  14.         }  
  15.     }  
 

Servlets

Context

Contexts是一種處理器,負責組織其他特定URI上下文路徑或者一個虛擬機的處理器。通常情況下一個上下文必須有:

  • 一個上下文路徑,負責通過上下文定義哪一個請求被處理。 (eg /myapp )
  • 一個基於靜態內容的資源(a docroot)
  • 一個類加載器去獲得指定上下文中的類(通常在docroot/WEB-INF/classes下)
  • 虛擬機名稱

上下文實現包括:

  •  ContextHandler
  • Servlet Context
  •  a Web Application Context

Context示意代碼:

Java代碼  收藏代碼
  1. ContextHandler context = new ContextHandler();  
  2. context.setContextPath("/");  
  3. context.setResourceBase(".");  
  4. context.setClassLoader(Thread.currentThread().getContextClassLoader());  
  5. server.setHandler(context);  
 

Web Applications


一個WebAppContext是servlet Context的子類,它提供web應用程序標準的層次結構,以及session, security, listeners, filter, servlets 和JSP的配置。

Java代碼  收藏代碼
  1. WebAppContext webapp = new WebAppContext();  
  2. webapp.setContextPath("/");  
  3. webapp.setWar(jetty_home+"/webapps/test");  
  4. webapp.setDefaultsDescriptor(jetty_home+"/etc/webdefault.xml");  
  5.   
  6. server.setHandler(webapp);  
 

參考資料


發佈了261 篇原創文章 · 獲贊 15 · 訪問量 51萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章