`

jetty初体验

    博客分类:
  • web
阅读更多
一直以来,web container我主要就用tomcat。 websphere在做ibm portal的时候也接触过, 复杂的东西不太喜欢。听说resin的性能很好,下载了3.16pro试用一番,移植tomcat的应用到resin也没有碰到问题,不过eclipse的插件似乎还没有支持3.16的,所以开发用起来还有点麻烦。如果没有合法的license,启动pro版还总是会有提示说license is not valid,这就不爽了,本来还以为是完全开源免费的。看说明是pro版采用了native api 提供更好性能,我倒是更倾向于license更加开放的,于是就放弃了resin。
还有什么可以尝试呢?突然想到了jetty,jetty是原来的一位同事提到过,说他们用jetty来做开发环境的web container, 测试、正式平台才用tomcat。在javaeye论坛里面搜索jetty,看到dlee几度推荐,引起了兴趣。
这是其中一篇关于jetty的优点:
http://www.iteye.com/topic/408?page=3
dlee 写道

两点,性能极佳,配置简单方便。
主要是设计思想的不同。Tomcat 主要是作为 JSP/Servlet 最新规范的参考实现而设计,属于学院派,但是显得庞大而杂乱。Tomcat 的性能很差,一般是作为 Http Server(如 Apache)的插件来用。Jetty 主要是作为企业级产品的嵌入式组件来设计的,可以非常方便地嵌入到其它产品中。而且 Jetty 是作为单独的 Http Server 来设计的,据 Jetty 开发人员的测试,Jetty 的性能几乎与 Apache 相当。Jetty 的体系结构结构精巧紧密,JBoss、JOnAS 缺省都是把 Jetty 作为他们的 Web Container 的。Tomcat 作为 Web Container 只是可选的。
Jetty 在国内用的人不多。我们目前全部开发都是在 Jetty 上做的,感觉 Jetty 还是非常稳定可靠的。Tomcat 开发的代码只要不使用 JSP/Servlet 最新规范中的内容,移植到 Jetty 上不费吹灰之力。Jetty 也支持到 JSP 1.2/Servlet 2.3 了(还不够用吗?呵呵)。生产环境,尤其是高负载的环境中还是使用 Jetty 更好。


另外一篇关于jetty的license和性能http://www.iteye.com/topic/775?page=1
dlee 写道

说起 Jetty,没有几个人知道,而实际上由于 Jetty 的 License 非常开放,采用 Jetty 的商业产品是非常多的。Resin 据说也非常棒,但是由于 License 的原因我们不可能使用 Resin。
对 Jetty 感兴趣的朋友可以到这里看看:
http://www.mortbay.com/mortbay/powered.html
Jetty Powered
As a small, fast, embeddable web server and servlet container Jetty is used by a plethora of both commercial and open source projects.
We've listed just a few here to illustrate Jetty's versatility and the diversity of it's community. Feel free to contact us if you would like your product or project added here.
在这些使用 Jetty 的产品中不仅包括 JBoss、JOnAS 这样开源的 AppServer,还包括 WebLogic Business Connect 和 IBM Tivoli NetView 这样的商业产品。


dlee 写道

现在大家对于 Jetty 的批判全部都集中在 Jetty 的性能方面。但是对于一个产品的判断性能仅仅是一个方面,当然是一个非常重要的方面,但是也不要以偏概全。
......
我举这个例子是为了说明什么?
我仍然要说 Jetty 是一个非常好的 Web Container。因为它的设计简练而清晰(Jetty 的代码要比 Tomcat 的代码简单和清晰的多),它非常容易被嵌入到其它产品之中。它用最少的代码提供了我们常用的几乎所有 Web Container 的功能。


看完以上帖子,能对jetty有个初步认识:
1、使用简单、配置简单
2、设计模块化、代码编写简炼易懂
3、tomcat的应用移植到jetty基本不用修改
3、非常合适嵌入到其他产品,可扩展性好
5、license是完全开放的,apache2.0 license

ok,接下来看看jetty怎么用, 我也来实验一把,看到底是不是那么好。
到jetty官方的文档看看入门教程:http://docs.codehaus.org/display/JETTY/Jetty+Documentation
咋一看,内容很多,我基本上走了一圈,下意识的找嵌入式webapp的demo和怎样移植一个以前的tomcat的webapp到jetty上来,还有eclipse的jetty插件。
还好,文档里面都有的,因此我觉得也主要关注Getting Started、Tutorials、Eclipse Workbench、Configuration这四个部分就可以了。
Getting Started告诉我们启动jetty只需要:java -jar start.jar etc/jetty.xml
因此就是一句java命令,指定一个配置文件作为参数即可;
Tutorials里主要就是看Embedding Jetty
Server server = new Server(8080);
Context root = new Context(server,"/",Context.SESSIONS);
root.addServlet(new ServletHolder(new HelloServlet("Ciao")), "/*");
server.start();

这样就等于配置了一个servlet mapping, 感觉是很神奇, 不过不用web.xml倒不是我想要的,我毕竟要兼顾不同web容器的兼容性。把Embedding Jetty里面的各种示例看了个遍,发现都没直接用web.xml的。
Eclipse Workbench中介绍了几个jetty for eclipse插件,试用了一下,感觉这个就不错了,简单可用:http://docs.codehaus.org/display/JETTY/Web+Tooling+Support
很多人推荐的jettylaucher反倒是没用起来, 似乎是还不支持最新的jetty6.1。
Configuration介绍了jetty.xml的配置,就是启动jetty指定的那个配置参数。
jetty自身的那些配置我倒一开始没看,一心在想怎样移植webapp到jetty这来,于是还真找到了,就在Contexts and Web Applications子章节里面有说明,分别打开Web Application Deployer  (static deploy)和 Context Deployer (hot deploy!),发现分别说的是静态部署和动态部署。静态部署就是 jetty.home/webapps/下面的应用可以启动jetty时一次都给部署,跟tomcat.home/webapps也是一样的;如果能够直接指定contextpath和webapppath就好了,动态部署估计就是我想要的了,如果仔细看一下
引用

Typically a ContextDeployer is defined in a jetty.xml file:
<Call name="addLifeCycle">
  <Arg>
    <New class="org.mortbay.jetty.deployer.ContextDeployer">
      <Set name="contexts"><Ref id="Contexts"/></Set>
      <Set name="configurationDir"><SystemProperty name="jetty.home" default="."/>/contexts</Set>
      <Set name="scanInterval">1</Set>
    </New>
  </Arg>
</Call>


The ContextDeployer will scan the configurationDir directory at intervals of scanInterval seconds for xml descriptors that define contexts. Any contexts found are deployed to the passed contexts reference to a HandlerContainer (this is normally an instance of ContextHandlerCollection).

The deployment descriptors are in jetty xml format and are define and configure individual contexts. A minimal example is
<?xml version="1.0"  encoding="ISO-8859-1"?>
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd">
<Configure class="org.mortbay.jetty.webapp.WebAppContext">
  <Set name="contextPath">/test</Set>
  <Set name="war"><SystemProperty name="jetty.home" default="."/>/webapps/test</Set>
</Configure>

This example creates an instance of org.mortbay.jetty.webapp.WebAppContext and sets the contextPath to be "/test" and the resourceBase to be "$jetty.home/webapps/test". Because the context used is a standard web application context, when started it will inspect the resourceBase for a WEB-INF/web.xml for further configuration.

The ContextDeployer is added to the server as a LifeCycle. This simply means that the deployer will be started and stopped with the server. Ie when server.start() is called, then start will also be called on the deployer.

可以看出jetty.home/contexts目录下保存着动态部署的jetty.xml,在这类xml中可以设定我要的contextpath和war目录, 从上例中就可以看出部署了一个/webapps/test应用, 启动jetty之后http://localhost:8080/test就可以看到。好了,这就简单了,copy一份出来,同样放到contexts目录下,改好contextpath和war,重启jetty,移植的也能正常跑了。

当然也许觉得这样有些烦, 如果光是移植个把webapp到jetty这么干也罢了,要把jetty当作主流web开发用容器就显然不够简单。还好前面装的那个eclipse插件倒是省了不少事情,new 一个jetty server,把webapp添加到server,run即可。

好了,到这里常规方式部署一个webapp已经没问题了, 但jetty的优点和特点不是嵌入式web容器吗?我怎样在程序里面启动jetty,并把webapp给部署掉呢?
这个倒是在官方文档中我也没找到怎么做, 还是在javaeye论坛里面给找到了办法:
public static void main(String[] args) throws Exception {
	Server server = new Server();
	BoundedThreadPool threadPool = new BoundedThreadPool();
	threadPool.setMaxThreads(100);
	server.setThreadPool(threadPool);
	Connector connector = new SelectChannelConnector();
	connector.setPort(8080); //端口
	server.setConnectors(new Connector[] { connector });
	WebAppContext context = new WebAppContext("你的web应用路径", "你的context");
	server.addHandler(context);
	server.setStopAtShutdown(true);
	server.setSendServerVersion(true);
	server.start();
	server.join();
}

看到了吧, 程序里面启动jetty,并发布你的应用,比较简单的吧。虽然代码是能做到,但我还是更喜欢用配置文件,怎么办?
先创建一个jetty-web.xml,就放在你的webapp目录下吧
<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd">
<Configure id="Server" class="org.mortbay.jetty.Server">

    <Set name="ThreadPool">
      <New class="org.mortbay.thread.QueuedThreadPool">
        <Set name="minThreads">10</Set>
        <Set name="maxThreads">200</Set>
        <Set name="lowThreads">20</Set>
        <Set name="SpawnOrShrinkAt">2</Set>
      </New>
    </Set>

    <Call name="addConnector">
      <Arg>
          <New class="org.mortbay.jetty.nio.SelectChannelConnector">
            <Set name="host"><SystemProperty name="jetty.host" default="127.0.0.1"/></Set>
            <Set name="port"><SystemProperty name="jetty.port" default="8080"/></Set>
            <Set name="maxIdleTime">30000</Set>
            <Set name="Acceptors">2</Set>
            <Set name="statsOn">false</Set>
            <Set name="confidentialPort">8443</Set>
	    <Set name="lowResourcesConnections">5000</Set>
	    <Set name="lowResourcesMaxIdleTime">5000</Set>
          </New>
      </Arg>
    </Call>

    <Set name="handler">
      <New id="Handlers" class="org.mortbay.jetty.handler.HandlerCollection">
        <Set name="handlers">
         <Array type="org.mortbay.jetty.Handler">
           <Item>
             <New id="RequestLog" class="org.mortbay.jetty.handler.RequestLogHandler"/>
           </Item>
	   <Item>
		   <New class="org.mortbay.jetty.webapp.WebAppContext">  
			  <Set name="contextPath">/demo</Set>  
                          <Set name="war">xx</Set>  <!--你的web应用根目录-->
                 </New>  
          </Item>
         </Array>
        </Set>
      </New>
    </Set>
    
    <Ref id="RequestLog">
      <Set name="requestLog">
        <New id="RequestLogImpl" class="org.mortbay.jetty.NCSARequestLog">
          <Set name="filename"><SystemProperty name="jetty.logs" 
		 />/yyyy_mm_dd.request.log</Set>
          <Set name="filenameDateFormat">yyyy_MM_dd</Set>
          <Set name="retainDays">90</Set>
          <Set name="append">true</Set>
          <Set name="extended">true</Set>
          <Set name="logCookies">false</Set>
          <Set name="LogTimeZone">GMT</Set>
        </New>
      </Set>
    </Ref>

    <Set name="stopAtShutdown">true</Set>
    <Set name="sendServerVersion">true</Set>
    <Set name="sendDateHeader">true</Set>
    <Set name="gracefulShutdown">1000</Set>

</Configure>

以上是一个相对完整的jetty.xml,应该可以根据需要简化,重要的是加入了
 
<Item>
<New class="org.mortbay.jetty.webapp.WebAppContext">  
	<Set name="contextPath">/demo</Set>  
        <Set name="war">xx</Set>  <!--你的web应用根目录-->
 </New>  
 </Item>

一个新的handler,实现了web应用发布目录和context的指定。
这个时候,如果在程序中启动jetty,只需要:
public static void main(String[] args) throws Exception {
	Server server = new Server();
	XmlConfiguration configuration = new XmlConfiguration(
	new FileInputStream(
		"xx/demo/jetty-web.xml")); //指定自定义的jetty.xml路径
	configuration.configure(server);
	server.start();
}


其实连这个main函数都可不必要了,只要用org.mortbay.xml.XmlConfiguration作为启动类,Program arguments中填上自定义的jetty.xml即可。这样连eclipse插件都可以丢掉不用了。

总结:
本文作为jetty的初体验体会,着重于怎样移植webapp到jetty,以及如何快速在jetty上部署webapp,也尝试了嵌入方式启动webapp,这些工作在找到方法后很轻松(实际上我可找了很久)。主要是完成你的webapp对jetty的配置,然后start!
本文并没有重点讨论jetty.xml的配置,这部分内容可以根据官方文档和看jetty自带的examples来学习,以后有时间看了再说。

注意:
jetty6是基于servlet2.5和jsp2.1设计的,
几个核心包是jetty-6.1.11.jar、jetty-util-6.1.11.jar、servlet-api-2.5-6.1.11.jar;
如果以嵌入式启动,需要引用jsp2.1包,我一开始引用的是jsp2.0包,结果造成了一些方法调用对不上参数的问题,明显是class版本有差别,换用jsp2.1就可以了。
另外对于嵌入式,/lib/naming和/lib/plus下的包最好也全部引入。
有时候jetty配置文件中会有如下引用jetty.home等变量
<Set name="config"><SystemProperty name="jetty.home" default="."/>/etc/realm.properties</Set>
需要在启动程序配置中加上vm参数,如果是jetty.home,则加上
-Djetty.home=D:/devworkspace/jetty-6.1.11






分享到:
评论
3 楼 xgj1988 2010-05-31  
怎么读取web.xml?知道吗
2 楼 asm 2009-03-13  
朋友,用嵌入式启动的方法会碰到NO JSP Support的异常,你是怎么解决的
(我已经把jetty复制到我的工程目录下,这个XmlConfiguration 好像不会扫描在我jetty.home下的lib/jsp2.1目录啊
1 楼 CALM 2008-08-07  
我希望在修改文件后,改动直接就体现在webapp中。
作为嵌入的server,jetty能做到热部署吗?

相关推荐

    头歌Spring Boot初体验.rar

    "头歌Spring Boot初体验"可能是一个文档,旨在引导初学者入门Spring Boot的世界。下面我们将深入探讨Spring Boot的核心特性和如何开始使用它。 1. **简介** Spring Boot是基于Spring框架构建的应用程序的快速启动...

    头歌springboot初体验

    在"头歌springboot初体验"中,我们可以探讨以下几个关键知识点: 1. **起步依赖(Starter Dependencies)**:Spring Boot通过起步依赖管理项目中的依赖。例如,如果你想使用Spring MVC进行Web开发,只需添加`spring...

    使用cxf 开发webService 初体验

    【标题】:“使用CXF开发Web Service初体验” 在Java世界中,开发Web Service是一项常见的任务,Apache CXF是一个强大的开源框架,它使得这个过程变得简单而高效。本篇文章将探讨如何利用CXF来创建和消费Web ...

    webwork初体验

    这篇博文的作者分享了他们初次接触WebWork的体验,通过阅读源码来理解其工作原理。在本文中,我们将深入探讨WebWork的核心概念、功能特性以及如何开始使用它。 WebWork 的主要特点: 1. **Action Mapping**:...

    11.02.11 JavaWeb笔记.pdf

    最后,笔记中讲述了 Servlet 概念和初体验。Servlet 是服务器端的程序, 可交互式的处理客户端发送到服务端的请求,并完成操作响应。是 Java Web 程序开发的基础。通过创建 Web 项目,可以体验 Servlet 的开发和使用...

    Dorado7实战必修之企业通讯录离线教程.pdf

    - **布局技巧**: 学习如何合理布局页面元素,提高用户体验。 #### 三、开发系统信息 **3.1 概述** - **目的**: 展示系统的相关信息,如版本号、运行状态等。 **3.2 准备工作** - **检查环境**: 确认开发环境...

    Intellij-IDEA-Tutorial-Smart:Intellij IDEA 中文教程

    前言一.Intellij IDEA 初体验二.Intellij IDEA 基本常识Debug 讲解自动生成代码选择重写,实现接口的方法自动创建 Test 测试类插件介绍打jar包和打war包三.版本控制篇版本控制总介绍svn 集成svn 简单使用git和github...

    java_Eclipse最新版资源.7z

    2020-3版本的Eclipse包含了自2020年初以来的所有更新和优化,旨在提升开发者的效率和体验。 首先,Eclipse的核心功能包括代码编辑、调试、构建和部署等。它的代码编辑器支持语法高亮、自动完成、错误检测等功能,极...

    spring开发指南

    《Spring开发指南》是一本专为Java开发者设计的详尽教程,无论你是初涉Spring框架的新手,还是希望深入理解并提升Spring应用的老手,它都能提供宝贵的指导。Spring是Java领域中最流行的轻量级开源框架之一,以其模块...

    计算机毕业设计-个人日记本系统

    该项目以Java为主要编程语言,对于软件开发人员,无论是初入职场还是在校学生,都是一个很好的实践和学习机会。通过这个项目,开发者可以深入理解Java编程语言,掌握软件开发的基本流程,以及如何将理论知识应用于...

    基于JSP的网上购书系统,附源码,视频, 使用教程和报告.zip

    7. **部署与运行**:学习如何在本地或远程服务器上配置和部署Java Web应用,可能涉及到Tomcat、Jetty等应用服务器。 8. **前端技术**:除了后端的JSP和Servlet,项目的用户界面可能还使用了HTML、CSS和JavaScript,...

    系统稳定性

    - **少出问题**:设计之初就考虑到可能出现的问题,并采取相应的预防措施。 - **快速解决**:对于已发生的问题,能够迅速定位并解决。 - **明确系统健康状况趋势**:能够实时监控系统的各项指标,预测可能出现的问题...

    Spring Boot公开课.pdf

    **环境安装与初体验** Spring Boot 2.2.4是当前的正式版本。安装Spring Boot之前,需要满足以下系统要求: - JDK 1.8或更高版本 - Maven 3.2或更高版本 可以通过Spring Initializr来快速生成Spring Boot项目的...

    Springboot入门到精通.pdf

    Spring Boot 是一个旨在简化Spring应用程序初始设置和常规配置的框架,它由Pivotal团队于2013年初开始研发,目前稳定版本为2.0.3 RELEASE。Spring Boot并不是要取代Spring框架,而是作为其增强工具,为Spring开发者...

    JavaWeb程序设计作业答案.rar

    9. **Ajax异步通信**:利用JavaScript的XMLHttpRequest对象实现页面局部更新,提升用户体验。 10. **Web容器**:Tomcat、Jetty等Web服务器的理解和配置,以及部署WAR文件的过程。 通过这些作业答案,学生不仅可以...

    运用springboot框架搭建的bbs论坛系统.zip

    其核心特性包括自动配置、内嵌Web服务器(如Tomcat或Jetty)以及对各种常用库的集成。 二、BBS论坛系统需求分析 BBS论坛系统通常需要包含用户注册、登录、发帖、回帖、搜索、用户管理等功能。系统设计时,应考虑...

    基于springboot的课程作业管理系统源码数据库.doc

    - **嵌入式容器**:SpringBoot可以使用内嵌Tomcat、Jetty或Undertow作为Web服务器运行应用,无需额外部署。 - **独立运行**:SpringBoot应用可以直接打包成可执行的JAR或WAR文件,不依赖外部容器。 ##### 2. Mysql...

    JSP 学生成绩管理系统

    8. **部署与运行环境**:JSP应用需要在支持Java的Web服务器上运行,如Tomcat或Jetty。开发者需要将项目打包成WAR文件,部署到服务器的webapps目录下,配置好相应的环境变量和数据库连接参数。 通过以上描述,我们...

    基于springboot的校园管理系统源码数据库.doc

    1. **需求分析**:在开发之初,通过对学校日常管理的实际需求进行调研分析,确定系统所需的功能模块,如学生信息管理、教师信息管理、课程管理等。 2. **总体设计**: - **系统功能设计**:根据需求分析结果,...

    基于JavaWeb在线书城系统

    在部署和运行阶段,可能需要Apache Tomcat或Jetty等应用服务器来承载Servlet和JSP。同时,开发者还需要了解如何配置服务器环境、设置虚拟主机、以及进行负载均衡和集群部署,以确保系统的高可用性和可伸缩性。 总结...

Global site tag (gtag.js) - Google Analytics