使用Jetty作爲嵌入式服務器

項目中用到嵌入式服務器的功能,於是去jetty的官方網站看了jetty嵌入方面的文檔,簡要翻譯了其中可能用到的部分,方便以後參考。

Jetty有一個口號:不要把你的應用部署到Jetty中,把Jetty部署到你的應用中。Jetty可以在Java應用程序中向其他POJO一樣被實例化,換句話說,以嵌入式的模式運行Jetty是指將Http模塊放入你的應用程序中,而非部署你的程序到一個HTTP服務器。

嵌入式Jetty服務器的實現的步驟通常爲:

1. 創建一個Server實例

2. 添加/配置Connectors

3. 添加/配置Handlers或者Contexts或者Servlets

4. 啓動Server


1. 準備工作:

下載整合後的jetty-allservlet apijar文件。

2. 創建Server

下述代碼創建一個Server實例,並啓動服務器。


package
org.eclipse.jetty.embedded;


importorg.eclipse.jetty.server.Server;


/** The simplest possible Jetty server.

*/

publicclassSimplestServer {


   publicstaticvoidmain(String[] args) throwsException {

       Server server = newServer(8080);

       server.start();

       server.join();

   }

}

由於代碼中並沒有指定server的處理器(handler),因此在瀏覽器中輸入http://localhost:8080會返回404錯誤頁面。

3. 使用Handlers

爲了對每個請求作出相應,Jetty要求爲Server設定HandlerHandler可以處理

Ø檢查或修改Http請求

Ø生成完整的Http響應

Ø調用另一個Handler

Ø選擇一個或多個Handlers調用

3.1 HelloWorld Handler

下述代碼顯示了一個簡單helloworld handler的實現

packageorg.eclipse.jetty.embedded;


importjava.io.IOException;

importjavax.servlet.ServletException;

importjavax.servlet.http.HttpServletRequest;

importjavax.servlet.http.HttpServletResponse;

importorg.eclipse.jetty.server.Request;

importorg.eclipse.jetty.server.handler.AbstractHandler;


publicclassHelloHandlerextendsAbstractHandler {


   finalString _greeting;


   finalString _body;


   publicHelloHandler() {

       _greeting= "Hello World";

       _body= null;

   }


   publicHelloHandler(String greeting) {

       _greeting= greeting;

       _body= null;

   }


   publicHelloHandler(String greeting, String body) {

       _greeting= greeting;

       _body= body;

   }


   publicvoidhandle(Stringtarget, Request baseRequest, HttpServletRequest request, HttpServletResponseresponse) throwsIOException, ServletException {

       response.setContentType("text/html;charset=utf-8");

       response.setStatus(HttpServletResponse.SC_OK);

       baseRequest.setHandled(true);

       response.getWriter().println("<h1>"+ _greeting + "</h1>");

       if(_body != null) response.getWriter().println(_body);

   }

}

handleAbstractHandler抽象類中定義的抽象方法,我們對請求的處理操作主要通過此方法來完成,handle中參數包括:

target——請求的目標,可以是一個URI或者一個命名dispatcher中的名字。

baseRequest——Jetty的可變請求對象,總是unwrapped

request——不變的請求對象,可能會被過濾器或servlet包裝

response——響應,可能會被過濾器或servlet包裝

hadler設定響應的狀態,內容類型,並在使用writer生成響應體之前標記請求爲已處理。

3.2 運行HelloWorld Handler

publicstaticvoidmain(String[] args) throwsException {

   Serverserver = newServer(8080);

   server.setHandler(newHelloHandler());

   server.start();

   server.join();

}

3.3 Resource Handler

Resource Handler可以用於處理當前目錄下的靜態內容,例如:

packageorg.eclipse.jetty.embedded;


importorg.eclipse.jetty.server.Handler;

importorg.eclipse.jetty.server.Server;

importorg.eclipse.jetty.server.handler.DefaultHandler;

importorg.eclipse.jetty.server.handler.HandlerList;

importorg.eclipse.jetty.server.handler.ResourceHandler;

importorg.eclipse.jetty.util.log.Log;

importorg.eclipse.jetty.util.log.Logger;


/** Simple JettyFileServer.

* This is asimple example of Jetty configured as a FileServer.

*/

publicclassFileServer {


   publicstaticvoidmain(String[] args) throwsException {

       Serverserver = newServer(8080);

       ResourceHandlerresource_handler = newResourceHandler();

       resource_handler.setDirectoriesListed(true);

       resource_handler.setWelcomeFiles(newString[] { "index.html"});

       resource_handler.setResourceBase(".");

       HandlerListhandlers = newHandlerList();

       handlers.setHandlers(newHandler[] { resource_handler, newDefaultHandler() });

       server.setHandler(handlers);

       server.start();

       server.join();

   }

}

注意HandlerList包括ResourceHandlerDefaultHandler,後者主要用於當請求不匹配靜態資源時返回404錯誤頁面。

4. 嵌入Connectors

在前面的例子,創建Server實例時傳入了一個端口號參數,程序內部會創建一個Connector的默認實例,在指定的端口上監聽請求。然而,通常嵌入式的Jetty需要爲一個Server實例顯式地實例化並配置一個或多個Connector

下述代碼顯示瞭如何實例化、配置並添加一個HTTP connectorServer中:

packageorg.eclipse.jetty.embedded;


importorg.eclipse.jetty.server.Server;

importorg.eclipse.jetty.server.ServerConnector;


/**

* A Jettyserver with one connectors.

*/

publicclassOneConnector {


   publicstaticvoidmain(String[] args) throwsException {

       Serverserver = newServer();

       ServerConnectorhttp = newServerConnector(server);

       http.setHost("localhost");

       http.setPort(8080);

       http.setIdleTimeout(30000);

       server.addConnector(http);

       server.setHandler(newHelloHandler());

       server.start();

       server.join();

   }

}



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