Jetty
簡介: Jetty 是一個開源的servlet容器,它爲基於Java的web內容,例如JSP和servlet提供運行環境。Jetty是使用Java語言編寫的,它的API以一組JAR包的形式發佈。開發人員可以將Jetty容器實例化成一個對象,可以迅速爲一些獨立運行(stand-alone)的Java應用提供網絡和web連接。
一 . 特徵簡介
易用性是 Jetty 設計的基本原則,易用性主要體現在以下幾個方面:
- 通過 XML 或者 API 來對 Jetty 進行配置;
- 默認配置可以滿足大部分的需求;
- 將 Jetty 嵌入到應用程序當中只需要非常少的代碼;
-
使用了 Ajax 的 Web 2.0 的應用程序中,每個連接需要保持更長的時間,這樣線程和內存的消耗量會急劇的增加。這就使得我們擔心整個程序會因爲單個組件陷入瓶頸而影響整個程序的性能。但是有了 Jetty:
- 即使在有大量服務請求的情況下,系統的性能也能保持在一個可以接受的狀態。
- 利用 Continuation 機制來處理大量的用戶請求以及時間比較長的連接。另外 Jetty 設計了非常良好的接口,因此在 Jetty 的某種實現無法滿足用戶的需要時,用戶可以非常方便地對 。
- Jetty 的某些實現進行修改,使得 Jetty 適用於特殊的應用程序的需求。Jetty 設計之初就是作爲一個優秀的組件來設計的,這也就意味着 Jetty 可以非常容易的嵌入到應用程序當中而不需要程序爲了使用 Jetty 做修改。從某種程度上,你也可以把 Jetty 理解爲一個嵌入式的Web服務器。
public static void main(String[] args) throws Exception
{
Server server = new Server(8080);
server.start();
server.join();
}
2. 寫句柄(Handles)
對於一個請求生成一個迴應,Jetty需要一個句柄去發送到server.一個句柄主要包括:
檢查/修改HTTP請求。
生成完整的HTTP迴應。
調用其他的句柄(見HandlerWrapper)
選擇一個或者多個句柄去調用(見HandleCollection)
public class HelloHandler extends AbstractHandler
{
public void handle(String target,Request baseRequest,HttpServletRequest request,HttpServletResponse response)
throws IOException, ServletException
{
response.setContentType("text/html;charset=utf-8");
response.setStatus(HttpServletResponse.SC_OK);
baseRequest.setHandled(true);
response.getWriter().println("<h1>Hello World</h1>");
}
}
3. 配置connector
爲了配置服務器需要調用的HTTP connectors,需要在服務器 上設置一個或者多個connectors.同時可以對每個單獨的connector進行對應的配置,包括
接口,端口,緩衝區大小,超時等
public class ManyConnectors
{
public static void main(String[] args) throws Exception
{
Server server = new Server();
SelectChannelConnector connector0 = new SelectChannelConnector();
connector0.setPort(8080);
connector0.setMaxIdleTime(30000);
connector0.setRequestHeaderSize(8192);
SelectChannelConnector connector1 = new SelectChannelConnector();
connector1.setHost("127.0.0.1");
connector1.setPort(8888);
connector1.setThreadPool(new QueuedThreadPool(20));
connector1.setName("admin");
SslSelectChannelConnector ssl_connector = new SslSelectChannelConnector();
String jetty_home =
System.getProperty("jetty.home","../jetty-distribution/target/distribution");
System.setProperty("jetty.home",jetty_home);
ssl_connector.setPort(8443);
SslContextFactory cf = ssl_connector.getSslContextFactory();
cf.setKeyStore(jetty_home + "/etc/keystore");
cf.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
cf.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g");
server.setConnectors(new Connector[]{ connector0, connector1, ssl_connector });
server.setHandler(new HelloHandler());
server.start();
server.join();
}
}
4. 配置一個文件服務器
public class FileServer
{
public static void main(String[] args) throws Exception
{
Server server = new Server();
SelectChannelConnector connector = new SelectChannelConnector();
connector.setPort(8080);
server.addConnector(connector);
ResourceHandler resource_handler = new ResourceHandler();
resource_handler.setDirectoriesListed(true);
resource_handler.setWelcomeFiles(new String[]{ "index.html" });
resource_handler.setResourceBase(".");
HandlerList handlers = new HandlerList();
handlers.setHandlers(new Handler[] { resource_handler, new DefaultHandler() });
server.setHandler(handlers);
server.start();
server.join();
}
}
5. 利用一個XML配置一個File Server.
?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">
<Configure id="FileServer" class="org.eclipse.jetty.server.Server">
<Call name="addConnector">
<Arg>
<New class="org.eclipse.jetty.server.nio.SelectChannelConnector">
<Set name="port">8080</Set>
</New>
</Arg>
</Call>
<Set name="handler">
<New class="org.eclipse.jetty.server.handler.HandlerList">
<Set name="handlers">
<Array type="org.eclipse.jetty.server.Handler">
<Item>
<New class="org.eclipse.jetty.server.handler.ResourceHandler">
<Set name="directoriesListed">true</Set>
<Set name="welcomeFiles">
<Array type="String"><Item>index.html</Item></Array>
</Set>
<Set name="resourceBase">.</Set>
</New>
</Item>
<Item>
<New class="org.eclipse.jetty.server.handler.DefaultHandler">
</New>
</Item>
</Array>
</Set>
</New>
</Set>
</Configure>
可以利用下面的代碼調用上面的XML文件
public class FileServerXml
{
public static void main(String[] args) throws Exception
{
Resource fileserver_xml = Resource.newSystemResource("fileserver.xml");
XmlConfiguration configuration = new XmlConfiguration(fileserver_xml.getInputStream());
Server server = (Server)configuration.configure();
server.start();
server.join();
}
}
先保存。。後面繼續
參考 :