设为首页 收藏本站
查看: 882|回复: 0

[经验分享] Jetty使用入门

[复制链接]

尚未签到

发表于 2017-2-25 12:38:02 | 显示全部楼层 |阅读模式
一、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、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-347075-1-1.html 上篇帖子: note1:jetty分析-启动 下篇帖子: jetty WebappClassLoader 问题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表