Jetty使用入门
一、Jetty介绍和特性Jetty是一个开源的Http服务器和Web容器,它是使用Java语言编写的,开发人员可以将Jetty容器实例化成一个对象,为一些独立运行的Java应用提供网络和Web连接。
易用性:
[*]通过xml或api对Jetty进行配置。
[*]默认配置可以满足大部分需求。
[*]将Jetty嵌入到应用程序当中只需要非常少的代码。
可扩展性:
[*]在大量服务请求情况下也能保持一个可以接受的状态,利用 Continuation 机制来处理大量的用户请求以及时间比较长的连接。
[*]Jetty 设计了非常良好的接口,因此在 Jetty 的某种实现无法满足用户的需要时,用户可以非常方便地对 Jetty 的某些实现进行修改,使得 Jetty 适用于特殊的应用程序的需求。
易嵌入性:
[*]非常容易嵌入到应用程序当中,可以把Jetty理解为一个嵌入式Web服务器,可以从testcase控制其运行,从而使用自动化测试不依赖于外部环境。
快速高效:
[*]Jetty是最快的Servlet服务器之一,可以处理上千个并发连接。
Jetty下载地址:http://docs.codehaus.org/display/JETTY/Downloading+and+Installing#download
二、Jetty内嵌服务器
下面的例子Jetty版本是5.1.3
依赖的Jar包
[*] org.mortbay.jetty-5.1.3.jar
[*] commons-logging.jar
[*] servlet-api-2.5.jar
package com.xiaocaiye.jetty;
import org.mortbay.http.HttpContext;
import org.mortbay.http.HttpServer;
import org.mortbay.http.SocketListener;
import org.mortbay.http.handler.ResourceHandler;
public class JettyService {
public static void main(String args[]){
//1、创建HttpServer对象,接收Http请求
HttpServer httpServer = new HttpServer();
//2、创建一个监听器,并注册到Server中
SocketListener listener = new SocketListener();
listener.setPort(80);
httpServer.addListener(listener);
//3、创建HttpContent对象,并注册到Server中
HttpContext httpContext = new HttpContext();
httpContext.setContextPath("/web");
httpContext.setResourceBase("/home/xiaocaiye");
httpContext.addHandler(new ResourceHandler());
httpServer.addContext(httpContext);
//4.启动Server
try {
httpServer.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
启动后,访问 http://localhost/web
下面的例子Jetty版本是7
Maven依赖
<dependency>
<groupId>org.eclipse.jetty.aggregate</groupId>
<artifactId>jetty-all</artifactId>
<version>8.1.8.v20121106</version>
</dependency>
<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jsp-2.1-glassfish</artifactId>
<version>2.1.v20100127</version>
</dependency>
启动内嵌Jetty服务
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.webapp.WebAppContext;
/**
* 启动Jetty服务
*/
public class JettyEmbedServer {
private final static int PROT = 8080;
private final static String webapp ="D:/workspace/test-jetty/src/main/webapp";
private Server server;
private void init(){
server = new Server(PROT);
WebAppContext context = new WebAppContext();
context.setDescriptor(webapp + "/WEB-INF/web.xml");
context.setResourceBase(webapp);
context.setContextPath("/");
context.setClassLoader(Thread.currentThread().getContextClassLoader());
server.setHandler(context);
try {
server.start();
server.join();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
public void close() throws Exception {
server.stop();
server.destroy();
}
public static void main(String[] args) {
JettyEmbedServer jettyEmbedServer = new JettyEmbedServer();
jettyEmbedServer.init();
}
}
三、部署应用程序
将开发好的应用程序打成 WAR 包放到 Jetty 的 Webapps 目录下面。然后用如下的命令来启动 Jetty 服务器:
Java –jar start.jar
为了防止任何人都能去关闭Jetty服务器,可以在启动时设置关闭密码 :
java -DSTOP.PORT=8079 -DSTOP.KEY=mypassword -jar start.jar
四、Jetty 的 Continuation 机制
Ajax是Web2.0一个重要的组成部分,用什么机制来保证服务器一旦有了响应客户端马上能知道?一种是轮询,浏览器每隔几秒钟请求服务器获取变化,这会造成大量传输的浪费;另一种是长连接Comet,服务器与浏览器维持长时间的连接。
Jetty 利用 Java 语言的非堵塞 I/O 技术来处理并发的大量连接。 Jetty 有一个处理长连接的机制,一个被称为
Continuations的特性。利用 Continuation 机制,Jetty 可以使得一个线程能够用来同时处理多个从客户端
发送过来的异步请求.
Jetty Continuations实际是一种异步Http技术,他能让Http连接挂起直到超时或者异步事件发生,Http连接可以恢复。
package com.xiaocaiye.jetty;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.jetty.continuation.Continuation;
import org.eclipse.jetty.continuation.ContinuationSupport;
public class ChatContinuation extends HttpServlet {
private MyAsyncHandler myAsyncHandler;
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
Object results = req.getAttribute("results");//异步方式得到results
if (results == null){//异步处理尚未返回结果
final Continuation continuation = ContinuationSupport.getContinuation(req);
if (continuation.isExpired()){//判断是否超时
sendMyTimeoutResponse(resp);
return;
}
//挂起Http连接
continuation.suspend();
myAsyncHandler.register(new MyHandler(){
//异步事件
public void onMyEvent(Object result){
continuation.setAttribute("results", result);
continuation.resume();
}
});
return;
}
//连接恢复后返回结果
sendMyResultResponse(resp,results);
}
private interface MyAsyncHandler {
public void register(MyHandler myHandler);
}
private interface MyHandler {
public void onMyEvent(Object result);
}
private void sendMyResultResponse(HttpServletResponse resp, Object results) throws IOException {
resp.getWriter().write("results:" + results);
resp.getWriter().flush();
}
private void sendMyTimeoutResponse(HttpServletResponse resp) throws IOException {
resp.getWriter().write("timeout");
}
}
资料来源于IBM中国(http://www.ibm.com/developerworks/cn/web/wa-lo-jetty/)
百度百科(http://baike.baidu.com/view/1425008.htm)
页:
[1]