Jetty6的架構
Connector(連接器)集合負責接收HTTP連接。handler(處理器)集合負責處理連接請求並給予響應。而Jetty Server(服務器)則是前兩者的管道連接器。負責創建並初始化connector、handler、ThreadPool組件,然後調用start方法啓動他們。ThreadPool(線程池)爲他們完成工作提供線程。
Jetty Server演示代碼
- //1:定義server
- Server server = new Server();
- //2:把連接器集合放到server裏
- Connector connector=new SelectChannelConnector();
- connector.setPort(8080);
- server.setConnectors(new Connector[]{connector});
- //3:並把處理器集合放到server裏
- Handler param=new ParamHandler();
- Handler hello=new HelloHandler();
- HandlerCollection handlers = new HandlerCollection();
- handlers.setHandlers(new Handler[]{param,hello});
- server.setHandler(handlers);
- //4:啓動server
- server.start();
- 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的使用代碼
- Connector connector=new SelectChannelConnector();
- connector.setPort(8080);
Handlers
Handler組件負責處理接收到的請求. handler核心的API是handle方法:
- public void handle(String target, HttpServletRequest request, HttpServletResponse response, int dispatch)
- throws IOException, ServletException;
這個方法的實現可以處理請求,傳遞請求到另外一個處理器(或者servlet),或修改幷包裝請求並傳遞出去。有三種類型的處理器:
- Coordinating Handlers - 負責路由請求到其他處理器的處理器(eg HandlerCollection, ContextHandlerCollection)
- Filtering Handlers - 負責增加請求並傳遞到其他處理器的處理器(eg. HandlerWrapper, ContextHandler, SessionHandler)
- Generating Handlers - 負責產生內容的處理器(eg ResourceHandler and ServletHandler)
Handler代碼如下
- Handler handler=new HelloHandler();
- server.setHandler(handler);
- public static class HelloHandler extends AbstractHandler
- {
- public void handle(String target, HttpServletRequest request, HttpServletResponse response, int dispatch) throws IOException, ServletException
- {
- Request base_request = (request instanceof Request) ? (Request)request:HttpConnection.getCurrentConnection().getRequest();
- base_request.setHandled(true);
- response.setContentType("text/html");
- response.setStatus(HttpServletResponse.SC_OK);
- response.getWriter().println("<h1>Hello OneHandler</h1>");
- }
- }
Servlets
Context
Contexts是一種處理器,負責組織其他特定URI上下文路徑或者一個虛擬機的處理器。通常情況下一個上下文必須有:
- 一個上下文路徑,負責通過上下文定義哪一個請求被處理。 (eg /myapp )
- 一個基於靜態內容的資源(a docroot)
- 一個類加載器去獲得指定上下文中的類(通常在docroot/WEB-INF/classes下)
- 虛擬機名稱
上下文實現包括:
- ContextHandler
- Servlet Context
- a Web Application Context
Context示意代碼:
- ContextHandler context = new ContextHandler();
- context.setContextPath("/");
- context.setResourceBase(".");
- context.setClassLoader(Thread.currentThread().getContextClassLoader());
- server.setHandler(context);
Web Applications
一個WebAppContext是servlet Context的子類,它提供web應用程序標準的層次結構,以及session, security, listeners, filter, servlets 和JSP的配置。
- WebAppContext webapp = new WebAppContext();
- webapp.setContextPath("/");
- webapp.setWar(jetty_home+"/webapps/test");
- webapp.setDefaultsDescriptor(jetty_home+"/etc/webdefault.xml");
- server.setHandler(webapp);
參考資料
- 官方網站:http://jetty.codehaus.org/jetty/
- http://docs.codehaus.org/display/JETTY/Architecture<!-- comments should always display underneath the content. we should have a 'clear:both' here just in case there are floats or aligned images in the content -->