﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-xylz,imxylz-随笔分类-Jetty</title><link>http://www.blogjava.net/xylz/category/50688.html</link><description>关注后端架构、中间件、分布式和高性能RESTful服务</description><language>zh-cn</language><lastBuildDate>Thu, 12 Apr 2012 03:44:20 GMT</lastBuildDate><pubDate>Thu, 12 Apr 2012 03:44:20 GMT</pubDate><ttl>60</ttl><item><title>[深入浅出Jetty 05] Jetty 模块化</title><link>http://www.blogjava.net/xylz/archive/2012/04/12/372999.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Thu, 12 Apr 2012 01:39:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2012/04/12/372999.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/372999.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2012/04/12/372999.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/372999.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/372999.html</trackback:ping><description><![CDATA[<!--PageText-->
<div id="wikitext">
<h1><a title="" href="http://www.blogjava.net/xylz/archive/2012/03/28/372923.html" target="_blank">Inside in Jetty</a> 8.x 模块化</h1>
<p><a title="" href="http://www.blogjava.net/xylz/archive/2012/03/28/372923.html" target="_blank">Inside in Jetty</a> 8.x带有一个默认的test环境。我们从这个默认的环境入手。
</p>
<p class="vspace">首先，来分析下start.ini里面的配置，这个配置决定启动了哪些模块。
</p>
<div class="vspace"></div><pre class="escaped">$ grep -v "#" start.ini|grep -v "^$"
OPTIONS=Server,jsp,jmx,resources,websocket,ext,plus,annotations
etc/jetty.xml
etc/jetty-annotations.xml
etc/jetty-deploy.xml
etc/jetty-webapps.xml
etc/jetty-contexts.xml
etc/jetty-testrealm.xml
</pre>
<p class="vspace">利用上节学到的只是，我们先来分析下用到了那些模块。
</p><pre class="escaped">java -jar start.jar --list-options
</pre>
<p class="vspace">查找Server,jsp,jmx,resources,websocket,ext,plus,annotations这些对应的模块有：
</p><pre class="escaped">GLOBAL option (Appended Entries) (*)
-------------------------------------------------------------
 0:      8.1.2.v20120308 | ${jetty.home}/lib/jetty-util-8.1.2.v20120308.jar
 1:      8.1.2.v20120308 | ${jetty.home}/lib/jetty-io-8.1.2.v20120308.jar
</pre>
<pre class="escaped">Option [Server] (Aggregate)
-------------------------------------------------------------
 0:      8.1.2.v20120308 | ${jetty.home}/lib/jetty-xml-8.1.2.v20120308.jar
 1:  3.0.0.v201112011016 | ${jetty.home}/lib/servlet-api-3.0.jar
 2:      8.1.2.v20120308 | ${jetty.home}/lib/jetty-http-8.1.2.v20120308.jar
 3:      8.1.2.v20120308 | ${jetty.home}/lib/jetty-continuation-8.1.2.v20120308.jar
 4:      8.1.2.v20120308 | ${jetty.home}/lib/jetty-server-8.1.2.v20120308.jar
 5:      8.1.2.v20120308 | ${jetty.home}/lib/jetty-security-8.1.2.v20120308.jar
 6:      8.1.2.v20120308 | ${jetty.home}/lib/jetty-servlet-8.1.2.v20120308.jar
 7:      8.1.2.v20120308 | ${jetty.home}/lib/jetty-webapp-8.1.2.v20120308.jar
 8:      8.1.2.v20120308 | ${jetty.home}/lib/jetty-deploy-8.1.2.v20120308.jar
 9:      8.1.2.v20120308 | ${jetty.home}/lib/jetty-servlets-8.1.2.v20120308.jar
</pre>
<pre class="escaped">Option [jsp]
-------------------------------------------------------------
 0:  2.2.0.v201108011116 | ${jetty.home}/lib/jsp/com.sun.el-2.2.0.v201108011116.jar
 1:  2.2.0.v201108011116 | ${jetty.home}/lib/jsp/javax.el-2.2.0.v201108011116.jar
 2:  1.2.0.v201105211821 | ${jetty.home}/lib/jsp/javax.servlet.jsp.jstl-1.2.0.v201105211821.jar
 3:  2.2.0.v201112011158 | ${jetty.home}/lib/jsp/javax.servlet.jsp-2.2.0.v201112011158.jar
 4:  2.2.2.v201112011158 | ${jetty.home}/lib/jsp/org.apache.jasper.glassfish-2.2.2.v201112011158.jar
 5:  1.2.0.v201112081803 | ${jetty.home}/lib/jsp/org.apache.taglibs.standard.glassfish-1.2.0.v201112081803.jar
 6: 3.7.0.M20110909-1335 | ${jetty.home}/lib/jsp/org.eclipse.jdt.core-3.7.1.jar
</pre>
<pre class="escaped">Option [jmx]
-------------------------------------------------------------
 0:      8.1.2.v20120308 | ${jetty.home}/lib/jetty-jmx-8.1.2.v20120308.jar
</pre>
<pre class="escaped">Option [resources]
-------------------------------------------------------------
 0:                (dir) | ${jetty.home}/resources
</pre>
<pre class="escaped">Option [websocket]
-------------------------------------------------------------
 0:      8.1.2.v20120308 | ${jetty.home}/lib/jetty-websocket-8.1.2.v20120308.jar
</pre>
<pre class="escaped">Option [ext]
-------------------------------------------------------------
Empty option, no classpath entries active.
</pre>
<pre class="escaped">Option [plus]
-------------------------------------------------------------
 0:      8.1.2.v20120308 | ${jetty.home}/lib/jetty-jndi-8.1.2.v20120308.jar
 1:      8.1.2.v20120308 | ${jetty.home}/lib/jetty-plus-8.1.2.v20120308.jar
 2:  1.1.0.v201105071233 | ${jetty.home}/lib/jndi/javax.activation-1.1.0.v201105071233.jar
 3:  1.4.1.v201005082020 | ${jetty.home}/lib/jndi/javax.mail.glassfish-1.4.1.v201005082020.jar
</pre>
<pre class="escaped">Option [annotations]
-------------------------------------------------------------
 0:      8.1.2.v20120308 | ${jetty.home}/lib/jetty-annotations-8.1.2.v20120308.jar
 1:  1.1.0.v201108011116 | ${jetty.home}/lib/annotations/javax.annotation-1.1.0.v201108011116.jar
 2:  3.1.0.v200803061910 | ${jetty.home}/lib/annotations/org.objectweb.asm-3.1.0.v200803061910.jar
</pre>
<p class="vspace">从上一节中我们知道，这些模块相当于将那些组件加入classpath中，jetty在启动时也会装载这些模块。
</p><pre class="escaped">$java -jar start.jar --dry-run|awk '{print $4}'|sed 's/:/\n/g'
/opt/apps/jetty8/lib/jetty-xml-8.1.2.v20120308.jar
/opt/apps/jetty8/lib/servlet-api-3.0.jar
/opt/apps/jetty8/lib/jetty-http-8.1.2.v20120308.jar
/opt/apps/jetty8/lib/jetty-continuation-8.1.2.v20120308.jar
/opt/apps/jetty8/lib/jetty-server-8.1.2.v20120308.jar
/opt/apps/jetty8/lib/jetty-security-8.1.2.v20120308.jar
/opt/apps/jetty8/lib/jetty-servlet-8.1.2.v20120308.jar
/opt/apps/jetty8/lib/jetty-webapp-8.1.2.v20120308.jar
/opt/apps/jetty8/lib/jetty-deploy-8.1.2.v20120308.jar
/opt/apps/jetty8/lib/jetty-servlets-8.1.2.v20120308.jar
/opt/apps/jetty8/lib/jetty-annotations-8.1.2.v20120308.jar
/opt/apps/jetty8/lib/annotations/javax.annotation-1.1.0.v201108011116.jar
/opt/apps/jetty8/lib/annotations/org.objectweb.asm-3.1.0.v200803061910.jar
/opt/apps/jetty8/lib/jetty-jmx-8.1.2.v20120308.jar
/opt/apps/jetty8/lib/jsp/com.sun.el-2.2.0.v201108011116.jar
/opt/apps/jetty8/lib/jsp/javax.el-2.2.0.v201108011116.jar
/opt/apps/jetty8/lib/jsp/javax.servlet.jsp.jstl-1.2.0.v201105211821.jar
/opt/apps/jetty8/lib/jsp/javax.servlet.jsp-2.2.0.v201112011158.jar
/opt/apps/jetty8/lib/jsp/org.apache.jasper.glassfish-2.2.2.v201112011158.jar
/opt/apps/jetty8/lib/jsp/org.apache.taglibs.standard.glassfish-1.2.0.v201112081803.jar
/opt/apps/jetty8/lib/jsp/org.eclipse.jdt.core-3.7.1.jar
/opt/apps/jetty8/lib/jetty-jndi-8.1.2.v20120308.jar
/opt/apps/jetty8/lib/jetty-plus-8.1.2.v20120308.jar
/opt/apps/jetty8/lib/jndi/javax.activation-1.1.0.v201105071233.jar
/opt/apps/jetty8/lib/jndi/javax.mail.glassfish-1.4.1.v201005082020.jar
/opt/apps/jetty8/resources
/opt/apps/jetty8/lib/jetty-websocket-8.1.2.v20120308.jar
/opt/apps/jetty8/lib/jetty-util-8.1.2.v20120308.jar
/opt/apps/jetty8/lib/jetty-io-8.1.2.v20120308.jar
</pre>
<p class="vspace">在总结下，不同的OPTION决定了启动不同的模块（也就是不同的组件和classpath）。另外，对于start.config里面的不同的OPTION可能有相同的模块依赖。
</p>
<p class="vspace">默认的test.war启动了如下模块：
</p><ul><li>Server: 一个标准的servlet容器
</li><li>jsp: jsp模块
</li><li>jmx: jmx支持
</li><li>resources: 允许从${jetty.home}/resources中读取类资源（实际上是配置log4j.properties)
</li><li>websocket: 支持websocket的例子
</li><li>ext: 由于${jetty.home}/lib/ext目录为空，实际上什么都做。其实此特性是为了装载自定义的组件依赖。
</li><li>plus: 一些扩展支持，从上面classpath中猜测，应该是jndi、java认证以及java mail的组件。
</li><li>annotations: java注解以及字节码的支持。
</li></ul><div class="vspace"></div><h2>test.war配置</h2>
<p>再来看看加载jetty配置。
test.war模块默认加载了6个配置组件。
</p><pre class="escaped">etc/jetty.xml
etc/jetty-annotations.xml
etc/jetty-deploy.xml
etc/jetty-webapps.xml
etc/jetty-contexts.xml
etc/jetty-testrealm.xml
</pre>
<div class="vspace"></div><h3><a title="" href="http://www.blogjava.net/xylz/archive/2012/03/28/372923.html" target="_blank">Inside in Jetty</a>.xml</h3>
<p>默认的jetty.xml负责配置设置服务器的参数，包括绑定的地址、线程池大小以及一些默认的处理器(Handler）等。
</p><pre class="escaped">&lt;Configure id="Server" class="org.eclipse.jetty.server.Server"&gt;
    &lt;Set name="ThreadPool"&gt;
      &lt;New class="org.eclipse.jetty.util.thread.QueuedThreadPool"&gt;
        &lt;Set name="minThreads"&gt;10&lt;/Set&gt;
        &lt;Set name="maxThreads"&gt;200&lt;/Set&gt;
        &lt;Set name="detailedDump"&gt;false&lt;/Set&gt;
      &lt;/New&gt;
    &lt;/Set&gt;
    &lt;Call name="addConnector"&gt;
      &lt;Arg&gt;
          &lt;New class="org.eclipse.jetty.server.nio.SelectChannelConnector"&gt;
            &lt;Set name="host"&gt;&lt;Property name="<a title="" href="http://www.blogjava.net/xylz/archive/2012/03/28/372923.html" target="_blank">Inside in Jetty</a>.host" /&gt;&lt;/Set&gt;
            &lt;Set name="port"&gt;&lt;Property name="<a title="" href="http://www.blogjava.net/xylz/archive/2012/03/28/372923.html" target="_blank">Inside in Jetty</a>.port" default="8080"/&gt;&lt;/Set&gt;
            &lt;Set name="maxIdleTime"&gt;300000&lt;/Set&gt;
            &lt;Set name="Acceptors"&gt;2&lt;/Set&gt;
            &lt;Set name="statsOn"&gt;false&lt;/Set&gt;
            &lt;Set name="confidentialPort"&gt;8443&lt;/Set&gt;
    &lt;Set name="lowResourcesConnections"&gt;20000&lt;/Set&gt;
    &lt;Set name="lowResourcesMaxIdleTime"&gt;5000&lt;/Set&gt;
          &lt;/New&gt;
      &lt;/Arg&gt;
    &lt;/Call&gt;
    &lt;Set name="handler"&gt;
      &lt;New id="Handlers" class="org.eclipse.jetty.server.handler.HandlerCollection"&gt;
        &lt;Set name="handlers"&gt;
         &lt;Array type="org.eclipse.jetty.server.Handler"&gt;
           &lt;Item&gt;
             &lt;New id="Contexts" class="org.eclipse.jetty.server.handler.ContextHandlerCollection"/&gt;
           &lt;/Item&gt;
           &lt;Item&gt;
             &lt;New id="DefaultHandler" class="org.eclipse.jetty.server.handler.DefaultHandler"/&gt;
           &lt;/Item&gt;
         &lt;/Array&gt;
        &lt;/Set&gt;
      &lt;/New&gt;
    &lt;/Set&gt;
    &lt;Set name="stopAtShutdown"&gt;true&lt;/Set&gt;
    &lt;Set name="sendServerVersion"&gt;true&lt;/Set&gt;
    &lt;Set name="sendDateHeader"&gt;true&lt;/Set&gt;
    &lt;Set name="gracefulShutdown"&gt;1000&lt;/Set&gt;
    &lt;Set name="dumpAfterStart"&gt;false&lt;/Set&gt;
    &lt;Set name="dumpBeforeStop"&gt;false&lt;/Set&gt;
&lt;/Configure&gt;
</pre>
<p class="vspace">可以看出默认的线程池大小是最小线程10个，最大线程200个。绑定在所有网卡的8080端口。其它配置以后再分析。
</p>
<div class="vspace"></div><h3><a title="" href="http://www.blogjava.net/xylz/archive/2012/03/28/372923.html" target="_blank">Inside in Jetty</a>-annotation.xml</h3>
<p><a title="" href="http://www.blogjava.net/xylz/archive/2012/03/28/372923.html" target="_blank">Inside in Jetty</a>-annotation.xml配置应该是描述支持哪些注解配置方式。
</p><pre class="escaped">    &lt;Call name="setAttribute"&gt;
      &lt;Arg&gt;org.eclipse.jetty.webapp.configuration&lt;/Arg&gt;
      &lt;Arg&gt;
          &lt;Array type="java.lang.String"&gt;
               &lt;Item&gt;org.eclipse.jetty.webapp.WebInfConfiguration&lt;/Item&gt;
               &lt;Item&gt;org.eclipse.jetty.webapp.WebXmlConfiguration&lt;/Item&gt;
               &lt;Item&gt;org.eclipse.jetty.webapp.MetaInfConfiguration&lt;/Item&gt;
               &lt;Item&gt;org.eclipse.jetty.webapp.FragmentConfiguration&lt;/Item&gt;
               &lt;Item&gt;org.eclipse.jetty.annotations.AnnotationConfiguration&lt;/Item&gt;
               &lt;Item&gt;org.eclipse.jetty.webapp.JettyWebXmlConfiguration&lt;/Item&gt;
          &lt;/Array&gt;
      &lt;/Arg&gt;
    &lt;/Call&gt;
</pre>
<div class="vspace"></div><h3><a title="" href="http://www.blogjava.net/xylz/archive/2012/03/28/372923.html" target="_blank">Inside in Jetty</a>-deploy.xml</h3>
<p><a title="" href="http://www.blogjava.net/xylz/archive/2012/03/28/372923.html" target="_blank">Inside in Jetty</a>-deploy.xml配置web发布方式。
</p><pre class="escaped">    &lt;Call name="addBean"&gt;
      &lt;Arg&gt;
        &lt;New id="DeploymentManager" class="org.eclipse.jetty.deploy.DeploymentManager"&gt;
          &lt;Set name="contexts"&gt;
            &lt;Ref id="Contexts" /&gt;
          &lt;/Set&gt;
          &lt;Call name="setContextAttribute"&gt;
            &lt;Arg&gt;org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern&lt;/Arg&gt;
            &lt;Arg&gt;.*/servlet-api-[^/]*\.jar$&lt;/Arg&gt;
          &lt;/Call&gt;          
        &lt;/New&gt;
      &lt;/Arg&gt;
    &lt;/Call&gt;
</pre>
<p>事实上这里没有定义要发布的目录或者应用位置，因此jetty-deploy依赖于jetty-contexts.xml或者jetty-webapps.xml。
</p>
<div class="vspace"></div><h3><a title="" href="http://www.blogjava.net/xylz/archive/2012/03/28/372923.html" target="_blank">Inside in Jetty</a>-webapps.xml</h3>
<p><a title="" href="http://www.blogjava.net/xylz/archive/2012/03/28/372923.html" target="_blank">Inside in Jetty</a>-webapps.xml定义要发布的内容，通常是要发布应用或者应用的定义。默认是存放于${jetty.home}/webapps下的应用以及${jetty.home}/contexts下的xml定义。
</p><pre class="escaped">    &lt;Ref id="DeploymentManager"&gt;
          &lt;Call id="webappprovider" name="addAppProvider"&gt;
            &lt;Arg&gt;
              &lt;New class="org.eclipse.jetty.deploy.providers.WebAppProvider"&gt;
                &lt;Set name="monitoredDirName"&gt;&lt;Property name="<a title="" href="http://www.blogjava.net/xylz/archive/2012/03/28/372923.html" target="_blank">Inside in Jetty</a>.home" default="." /&gt;/webapps&lt;/Set&gt;
                &lt;Set name="defaultsDescriptor"&gt;&lt;Property name="<a title="" href="http://www.blogjava.net/xylz/archive/2012/03/28/372923.html" target="_blank">Inside in Jetty</a>.home" default="."/&gt;/etc/webdefault.xml&lt;/Set&gt;
                &lt;Set name="scanInterval"&gt;1&lt;/Set&gt;
                &lt;Set name="contextXmlDir"&gt;&lt;Property name="<a title="" href="http://www.blogjava.net/xylz/archive/2012/03/28/372923.html" target="_blank">Inside in Jetty</a>.home" default="." /&gt;/contexts&lt;/Set&gt;
&lt;Set name="extractWars"&gt;true&lt;/Set&gt;
              &lt;/New&gt;
            &lt;/Arg&gt;
          &lt;/Call&gt;
    &lt;/Ref&gt;
</pre>
<div class="vspace"></div><h3><a title="" href="http://www.blogjava.net/xylz/archive/2012/03/28/372923.html" target="_blank">Inside in Jetty</a>-contexts.xml</h3>
<p><a title="" href="http://www.blogjava.net/xylz/archive/2012/03/28/372923.html" target="_blank">Inside in Jetty</a>-contexts.xml定义一些预置规则。类似于一些拦截器。例如可以讲某些URI rewrite或者静态资源cache配置等。
</p>
<p class="vspace">这会自动扫描${jetty.home}/contexts下面的xml配置。
</p><pre class="escaped">    &lt;Ref id="DeploymentManager"&gt;
      &lt;Call name="addAppProvider"&gt;
        &lt;Arg&gt;
          &lt;New class="org.eclipse.jetty.deploy.providers.ContextProvider"&gt;
            &lt;Set name="monitoredDirName"&gt;&lt;Property name="<a title="" href="http://www.blogjava.net/xylz/archive/2012/03/28/372923.html" target="_blank">Inside in Jetty</a>.home" default="." /&gt;/contexts&lt;/Set&gt;
            &lt;Set name="scanInterval"&gt;1&lt;/Set&gt;
          &lt;/New&gt;
        &lt;/Arg&gt;
      &lt;/Call&gt;
    &lt;/Ref&gt;
</pre>
<div class="vspace"></div><h3><a title="" href="http://www.blogjava.net/xylz/archive/2012/03/28/372923.html" target="_blank">Inside in Jetty</a>-testrealm.xml</h3>
<p><a title="" href="http://www.blogjava.net/xylz/archive/2012/03/28/372923.html" target="_blank">Inside in Jetty</a>-testrealm.xml用于test.war的特定配置，用于配置一些认证信息。
</p><pre class="escaped">    &lt;Call name="addBean"&gt;
      &lt;Arg&gt;
        &lt;New class="org.eclipse.jetty.security.HashLoginService"&gt;
          &lt;Set name="name"&gt;Test Realm&lt;/Set&gt;
          &lt;Set name="config"&gt;&lt;Property name="<a title="" href="http://www.blogjava.net/xylz/archive/2012/03/28/372923.html" target="_blank">Inside in Jetty</a>.home" default="."/&gt;/etc/realm.properties&lt;/Set&gt;
          &lt;Set name="refreshInterval"&gt;0&lt;/Set&gt;
        &lt;/New&gt;
      &lt;/Arg&gt;
    &lt;/Call&gt;
</pre>
<div class="vspace"></div><h2>test.xml</h2>
<p>事实上这么模块的配置都是在&lt;Configure id="Server" class="org.eclipse.jetty.server.Server"&gt;节点配置下。
因此可以合并成一个大的xml。这样做的好处是在一个xml包含所有配置，方便灵活定义。当然，坏处就是复用率低。
</p><pre class="escaped">&lt;?xml version="1.0"?&gt;
&lt;!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd"&gt;
&lt;Configure id="Server" class="org.eclipse.jetty.server.Server"&gt;
    &lt;Set name="ThreadPool"&gt;
      &lt;!-- Default queued blocking threadpool --&gt;
      &lt;New class="org.eclipse.jetty.util.thread.QueuedThreadPool"&gt;
        &lt;Set name="minThreads"&gt;10&lt;/Set&gt;
        &lt;Set name="maxThreads"&gt;200&lt;/Set&gt;
        &lt;Set name="detailedDump"&gt;false&lt;/Set&gt;
      &lt;/New&gt;
    &lt;/Set&gt;
    &lt;Call name="addConnector"&gt;
      &lt;Arg&gt;
          &lt;New class="org.eclipse.jetty.server.nio.SelectChannelConnector"&gt;
            &lt;Set name="host"&gt;&lt;Property name="<a title="" href="http://www.blogjava.net/xylz/archive/2012/03/28/372923.html" target="_blank">Inside in Jetty</a>.host" /&gt;&lt;/Set&gt;
            &lt;Set name="port"&gt;&lt;Property name="<a title="" href="http://www.blogjava.net/xylz/archive/2012/03/28/372923.html" target="_blank">Inside in Jetty</a>.port" default="8080"/&gt;&lt;/Set&gt;
            &lt;Set name="maxIdleTime"&gt;300000&lt;/Set&gt;
            &lt;Set name="Acceptors"&gt;2&lt;/Set&gt;
            &lt;Set name="statsOn"&gt;false&lt;/Set&gt;
            &lt;Set name="confidentialPort"&gt;8443&lt;/Set&gt;
    &lt;Set name="lowResourcesConnections"&gt;20000&lt;/Set&gt;
    &lt;Set name="lowResourcesMaxIdleTime"&gt;5000&lt;/Set&gt;
          &lt;/New&gt;
      &lt;/Arg&gt;
    &lt;/Call&gt;
    &lt;Set name="handler"&gt;
      &lt;New id="Handlers" class="org.eclipse.jetty.server.handler.HandlerCollection"&gt;
        &lt;Set name="handlers"&gt;
         &lt;Array type="org.eclipse.jetty.server.Handler"&gt;
           &lt;Item&gt;
             &lt;New id="Contexts" class="org.eclipse.jetty.server.handler.ContextHandlerCollection"/&gt;
           &lt;/Item&gt;
           &lt;Item&gt;
             &lt;New id="DefaultHandler" class="org.eclipse.jetty.server.handler.DefaultHandler"/&gt;
           &lt;/Item&gt;
         &lt;/Array&gt;
        &lt;/Set&gt;
      &lt;/New&gt;
    &lt;/Set&gt;
    &lt;Set name="stopAtShutdown"&gt;true&lt;/Set&gt;
    &lt;Set name="sendServerVersion"&gt;true&lt;/Set&gt;
    &lt;Set name="sendDateHeader"&gt;true&lt;/Set&gt;
    &lt;Set name="gracefulShutdown"&gt;1000&lt;/Set&gt;
    &lt;Set name="dumpAfterStart"&gt;false&lt;/Set&gt;
    &lt;Set name="dumpBeforeStop"&gt;false&lt;/Set&gt;
    &lt;Call name="setAttribute"&gt;
      &lt;Arg&gt;org.eclipse.jetty.webapp.configuration&lt;/Arg&gt;
      &lt;Arg&gt;
          &lt;Array type="java.lang.String"&gt;
&lt;Item&gt;org.eclipse.jetty.webapp.WebInfConfiguration&lt;/Item&gt;
&lt;Item&gt;org.eclipse.jetty.webapp.WebXmlConfiguration&lt;/Item&gt;
&lt;Item&gt;org.eclipse.jetty.webapp.MetaInfConfiguration&lt;/Item&gt;
&lt;Item&gt;org.eclipse.jetty.webapp.FragmentConfiguration&lt;/Item&gt;
&lt;Item&gt;org.eclipse.jetty.annotations.AnnotationConfiguration&lt;/Item&gt;
&lt;Item&gt;org.eclipse.jetty.webapp.JettyWebXmlConfiguration&lt;/Item&gt;
          &lt;/Array&gt;
      &lt;/Arg&gt;
    &lt;/Call&gt;
    &lt;Call name="addBean"&gt;
      &lt;Arg&gt;
        &lt;New id="DeploymentManager" class="org.eclipse.jetty.deploy.DeploymentManager"&gt;
          &lt;Set name="contexts"&gt;
            &lt;Ref id="Contexts" /&gt;
          &lt;/Set&gt;
          &lt;Call name="setContextAttribute"&gt;
            &lt;Arg&gt;org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern&lt;/Arg&gt;
            &lt;Arg&gt;.*/servlet-api-[^/]*\.jar$&lt;/Arg&gt;
          &lt;/Call&gt;
        &lt;/New&gt;
      &lt;/Arg&gt;
    &lt;/Call&gt;
    &lt;Ref id="DeploymentManager"&gt;
          &lt;Call id="webappprovider" name="addAppProvider"&gt;
            &lt;Arg&gt;
              &lt;New class="org.eclipse.jetty.deploy.providers.WebAppProvider"&gt;
                &lt;Set name="monitoredDirName"&gt;&lt;Property name="<a title="" href="http://www.blogjava.net/xylz/archive/2012/03/28/372923.html" target="_blank">Inside in Jetty</a>.home" default="." /&gt;/webapps&lt;/Set&gt;
                &lt;Set name="defaultsDescriptor"&gt;&lt;Property name="<a title="" href="http://www.blogjava.net/xylz/archive/2012/03/28/372923.html" target="_blank">Inside in Jetty</a>.home" default="."/&gt;/etc/webdefault.xml&lt;/Set&gt;
                &lt;Set name="scanInterval"&gt;1&lt;/Set&gt;
                &lt;Set name="contextXmlDir"&gt;&lt;Property name="<a title="" href="http://www.blogjava.net/xylz/archive/2012/03/28/372923.html" target="_blank">Inside in Jetty</a>.home" default="." /&gt;/contexts&lt;/Set&gt;
&lt;Set name="extractWars"&gt;true&lt;/Set&gt;
              &lt;/New&gt;
            &lt;/Arg&gt;
          &lt;/Call&gt;
    &lt;/Ref&gt;
&lt;Ref id="DeploymentManager"&gt;
  &lt;Call name="addAppProvider"&gt;
&lt;Arg&gt;
  &lt;New class="org.eclipse.jetty.deploy.providers.ContextProvider"&gt;
&lt;Set name="monitoredDirName"&gt;&lt;Property name="<a title="" href="http://www.blogjava.net/xylz/archive/2012/03/28/372923.html" target="_blank">Inside in Jetty</a>.home" default="." /&gt;/contexts&lt;/Set&gt;
&lt;Set name="scanInterval"&gt;1&lt;/Set&gt;
  &lt;/New&gt;
&lt;/Arg&gt;
  &lt;/Call&gt;
&lt;/Ref&gt;
&lt;Call name="addBean"&gt;
  &lt;Arg&gt;
&lt;New class="org.eclipse.jetty.security.HashLoginService"&gt;
  &lt;Set name="name"&gt;Test Realm&lt;/Set&gt;
  &lt;Set name="config"&gt;&lt;Property name="<a title="" href="http://www.blogjava.net/xylz/archive/2012/03/28/372923.html" target="_blank">Inside in Jetty</a>.home" default="."/&gt;/etc/realm.properties&lt;/Set&gt;
  &lt;Set name="refreshInterval"&gt;0&lt;/Set&gt;
&lt;/New&gt;
  &lt;/Arg&gt;
&lt;/Call&gt;
&lt;/Configure&gt;
</pre>
<p class="vspace">我们将test.xml放入etc目录下面。这是保持start.ini文件不存在，也就是不使用start.ini里面的配置。
</p>
<p class="vspace">手动运行它。
</p><pre class="escaped">java -jar start.jar OPTIONS=Server,jsp,jmx,resources,websocket,ext,plus,annotations etc/test.xml
</pre>
<p class="vspace">这时候的启动就和默认启动是一样的了。
</p>
<p class="vspace">这时候就可以访问了。
</p>
<div class="vspace"></div><h2><a title="" href="http://www.blogjava.net/xylz/archive/2012/03/28/372923.html" target="_blank">Inside in Jetty</a> Statistics</h2>
<p>这一部分，我们利用学习到的只是来部署一个Jetty统计模块。
</p>
<div class="vspace"></div><h3>修改设置</h3>
<p>将连接计数参数打开：
</p><pre class="escaped">    &lt;Call name="addConnector"&gt;
      &lt;Arg&gt;
          &lt;New class="org.eclipse.jetty.server.nio.SelectChannelConnector"&gt;
            &lt;Set name="host"&gt;&lt;Property name="<a title="" href="http://www.blogjava.net/xylz/archive/2012/03/28/372923.html" target="_blank">Inside in Jetty</a>.host" /&gt;&lt;/Set&gt;
            &lt;Set name="port"&gt;&lt;Property name="<a title="" href="http://www.blogjava.net/xylz/archive/2012/03/28/372923.html" target="_blank">Inside in Jetty</a>.port" default="8080"/&gt;&lt;/Set&gt;
            &lt;Set name="maxIdleTime"&gt;300000&lt;/Set&gt;
            &lt;Set name="Acceptors"&gt;2&lt;/Set&gt;
            &lt;Set name="statsOn"&gt;true&lt;/Set&gt;&lt;!-- modify this --&gt;
          &lt;/New&gt;
      &lt;/Arg&gt;
    &lt;/Call&gt;
</pre>
<div class="vspace"></div><h3>设置servlet</h3>
<p>为了不影响默认的test.war环境，我们增加一个最简单的WAR环境。
</p>
<p class="vspace">根据前面学到的知识，只需要将war环境放到webapps目录下即可。可以是一个war包，也可以是一个以.war结尾的目录。
</p><pre class="escaped">$tree webapps/demo.war/
webapps/demo.war/
`-- WEB-INF
    |-- <a title="" href="http://www.blogjava.net/xylz/archive/2012/03/28/372923.html" target="_blank">Inside in Jetty</a>-web.xml
    `-- web.xml
1 directory, 2 files
</pre>
<div class="vspace"></div><pre class="escaped">$cat webapps/demo.war/WEB-INF/jetty-web.xml 
</pre>
<pre class="escaped">&lt;?xml version="1.0"  encoding="ISO-8859-1"?&gt;
&lt;!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure.dtd"&gt;
&lt;Configure class="org.eclipse.jetty.webapp.WebAppContext"&gt;
  &lt;Set name="contextPath"&gt;/demo&lt;/Set&gt;
&lt;/Configure&gt;
</pre>
<div class="vspace"></div><pre class="escaped">$cat webapps/demo.war/WEB-INF/web.xml
</pre>
<pre class="escaped">&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;
&lt;web-app 
   xmlns="http://java.sun.com/xml/ns/javaee" 
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
   metadata-complete="false"
   version="3.0"&gt; 
  &lt;display-name&gt;static demo&lt;/display-name&gt;
  &lt;servlet&gt;
    &lt;servlet-name&gt;statistic&lt;/servlet-name&gt;
    &lt;servlet-class&gt;org.eclipse.jetty.servlet.StatisticsServlet&lt;/servlet-class&gt;
    &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;
    &lt;init-param&gt;
        &lt;param-name&gt;restrictToLocalhost&lt;/param-name&gt;&lt;param-value&gt;false&lt;/param-value&gt;
    &lt;/init-param&gt;
  &lt;/servlet&gt;
  &lt;servlet-mapping&gt;
    &lt;servlet-name&gt;statistic&lt;/servlet-name&gt;
    &lt;url-pattern&gt;/statistic/*&lt;/url-pattern&gt;
  &lt;/servlet-mapping&gt;
&lt;/web-app&gt;
</pre>
<p class="vspace">说明几点：
</p><ul><li>为了不和test.war的contextPath混淆，这里强制修改为/demo。
</li><li>增加一个jetty内置的统计servlet(org.eclipse.jetty.servlet.StatisticsServlet)
</li><li>将servlet的参数restrictToLocalhost修改为false，否则默认情况下只能通过本机访问，不能远程访问
</li></ul><div class="vspace"></div><h3>运行demo</h3>
<p>保持test.war不变增加一个统计配置。
</p><pre class="escaped">$java -jar start.jar etc/jetty-stats.xml
</pre>
<div class="vspace"></div><h3>执行效果</h3>
<p>使用浏览器访问
</p><pre class="escaped">http://127.0.0.1:8080/demo/statistic/
</pre>
<p class="vspace">效果如下：
</p><div><img src="http://dev.imxylz.info/wiki/./wiki/upload/Jetty/statistic1.png" alt="" title="" /></div>
<div><img src="http://dev.imxylz.info/wiki/./wiki/upload/Jetty/statistic2.png" alt="" title="" /></div>
<p class="vspace">统计结果包含6个部分：
</p><ol><li>统计结果收集时间
</li><li>请求数详情（当前请求数、最大请求数、总共请求数、请求时间等）
</li><li>请求分发详情（和请求数不同的是，这是jetty内部分发请求的数量，包括forward/include等）
</li><li>响应状态详情（1xx/2xx/3xx/4xx/5xx以及总共发送的字节数）
</li><li>连接数详情 （当前连接数、最大连接数、连接持续时间等）
</li><li>内存状况（堆内存和非堆内存使用状况,非堆内存通常也称永久代内存）
</li></ol><div class="vspace"></div><h2>小结</h2>
<p><a title="" href="http://www.blogjava.net/xylz/archive/2012/03/28/372923.html" target="_blank">Inside in Jetty</a> 8.x已经将各个模块拆分非常详细了。每一个模块的命名都非常有规律。通常从名称上就能够猜测出模块的作用。
</p>
<p class="vspace">部分模块可能还需要对应的配置。${jetty.home}/etc下面有大量的配置，这些零散的配置拆分是为了可复用。
如果一个jetty要想启动多个java进程，那么只需要指定不同的配置即可。甚至为了方便定制化，可能为每一个java进程创建一个完整的jetty.xml配置，而不需要${jetty.home}/etc下面的配置。
</p>
</div><img src ="http://www.blogjava.net/xylz/aggbug/372999.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2012-04-12 09:39 <a href="http://www.blogjava.net/xylz/archive/2012/04/12/372999.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[深入浅出Jetty] 文章索引</title><link>http://www.blogjava.net/xylz/archive/2012/04/12/371612.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Thu, 12 Apr 2012 01:38:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2012/04/12/371612.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/371612.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2012/04/12/371612.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/371612.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/371612.html</trackback:ping><description><![CDATA[整理Jetty的文章索引<br />
<ol>
     <li><a href="http://www.blogjava.net/xylz/archive/2012/01/29/368969.html" target="_blank">[深入浅出Jetty 01] Jetty 8.x 安装</a></li>
     <li><a href="http://www.blogjava.net/xylz/archive/2012/01/29/368970.html" target="_blank">[深入浅出Jetty 02] Jetty 8.x 简单试用</a></li>
     <li><a href="http://www.blogjava.net/xylz/archive/2012/03/09/371598.html" target="_blank">[深入浅出Jetty 03] 简单的RESTful入门</a></li>
     <li><a href="http://www.blogjava.net/xylz/archive/2012/03/28/372923.html" target="_blank">[深入浅出Jetty 04] Jetty的启动方式</a></li>
     <li><a href="http://www.blogjava.net/xylz/archive/2012/04/12/372999.html" target="_blank">[深入浅出Jetty 05] Jetty 模块化</a></li>
</ol><img src ="http://www.blogjava.net/xylz/aggbug/371612.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2012-04-12 09:38 <a href="http://www.blogjava.net/xylz/archive/2012/04/12/371612.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[深入浅出Jetty 04]Jetty的启动方式</title><link>http://www.blogjava.net/xylz/archive/2012/03/28/372923.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Wed, 28 Mar 2012 11:02:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2012/03/28/372923.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/372923.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2012/03/28/372923.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/372923.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/372923.html</trackback:ping><description><![CDATA[Jetty提供了众多的参数和配置来保证满足不同场景下的启动方式。<br />
<br />
除了极大方便嵌入式启动之外，从程序外部也非常好容易启动jetty。<br /><br />[原文：http://www.blogjava.net/xylz/archive/2012/03/28/372923.html]<br />
<h2>运行方式</h2>
<h3>运行方法1</h3>
首先我们以一个标准的jar程序启动来看待这个问题.
<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->[adyliu<span style="color: #800080; ">@adyliu</span>-pc&nbsp;jetty8]<span style="color: #008000; ">$</span><span style="color: #008000; ">&nbsp;cat&nbsp;run.sh&nbsp;<br />
#!/bin/bash</span><span style="color: #008000; "><br />
</span><br />
JETTY_CLASSPATH=<span style="font-weight: bold; ">"</span><span style="font-weight: bold; ">./start.jar</span><span style="font-weight: bold; ">"</span><br />
<span style="color: #0000FF; ">for</span>&nbsp;f&nbsp;in&nbsp;`find&nbsp;./lib&nbsp;-name&nbsp;<span style="font-weight: bold; ">"</span><span style="font-weight: bold; ">*.jar</span><span style="font-weight: bold; ">"</span>`<br />
<span style="color: #0000FF; ">do</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;JETTY_CLASSPATH=<span style="color: #800080; ">$JETTY_CLASSPATH</span>:<span style="color: #800080; ">$f</span><br />
done<br />
<br />
<span style="color: #008000; ">#</span><span style="color: #008000; ">echo&nbsp;$JETTY_CLASSPATH</span><span style="color: #008000; "><br />
</span>java&nbsp;-cp&nbsp;<span style="color: #800080; ">$JETTY_CLASSPATH</span>&nbsp;$*</div>
<br />
<div>然后运行查看下</div>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->[adyliu<span style="color: #800080; ">@adyliu</span>-pc&nbsp;jetty8]<span style="color: #008000; ">$</span><span style="color: #008000; ">&nbsp;sh&nbsp;run.sh&nbsp;org.eclipse.jetty.start.Main</span><span style="color: #008000; "><br />
</span><span style="color: #800000; ">2012</span>-<span style="color: #800000; ">03</span>-<span style="color: #800000; ">28</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">00</span>:<span style="color: #800000; ">57.532</span>:INFO:oejs.Server:jetty-<span style="color: #800000; ">8.1</span>.<span style="color: #800000; ">2</span>.v20120308<br />
<span style="color: #800000; ">2012</span>-<span style="color: #800000; ">03</span>-<span style="color: #800000; ">28</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">00</span>:<span style="color: #800000; ">57.578</span>:INFO:oejs.AbstractConnector:Started&nbsp;SelectChannelConnector@<span style="color: #800000; ">0.0</span>.<span style="color: #800000; ">0.0</span>:<span style="color: #800000; ">8080</span></div>
<div><br />
由于没有任何web环境，因此此时访问任何地址应该都是404。测试一下：</div>
<div style="font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; border-image: initial; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; background-color: #eeeeee; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->[adyliu<span style="color: #800080; ">@adyliu</span>-pc&nbsp;jetty8]<span style="color: #008000; ">$</span><span style="color: #008000; ">&nbsp;curl&nbsp;-v&nbsp;http://127.0.0.1:8080</span><span style="color: #008000; "><br />
</span>*&nbsp;About&nbsp;to&nbsp;<span style="color: #0000FF; ">connect</span>()&nbsp;to&nbsp;<span style="color: #800000; ">127.0</span>.<span style="color: #800000; ">0.1</span>&nbsp;port&nbsp;<span style="color: #800000; ">8080</span><br />
*&nbsp;&nbsp;&nbsp;Trying&nbsp;<span style="color: #800000; ">127.0</span>.<span style="color: #800000; ">0.1</span><img src="http://www.blogjava.net/Images/dot.gif" alt="" />&nbsp;connected<br />
*&nbsp;Connected&nbsp;to&nbsp;<span style="color: #800000; ">127.0</span>.<span style="color: #800000; ">0.1</span>&nbsp;(<span style="color: #800000; ">127.0</span>.<span style="color: #800000; ">0.1</span>)&nbsp;port&nbsp;<span style="color: #800000; ">8080</span><br />
&gt;&nbsp;GET&nbsp;/&nbsp;HTTP/<span style="color: #800000; ">1.1</span><br />
&gt;&nbsp;User-Agent:&nbsp;curl/<span style="color: #800000; ">7.15</span>.<span style="color: #800000; ">5</span>&nbsp;(x86_64-redhat-linux-gnu)&nbsp;libcurl/<span style="color: #800000; ">7.15</span>.<span style="color: #800000; ">5</span>&nbsp;OpenSSL/<span style="color: #800000; ">0.9</span>.8b&nbsp;zlib/<span style="color: #800000; ">1.2</span>.<span style="color: #800000; ">3</span>&nbsp;libidn/<span style="color: #800000; ">0.6</span>.<span style="color: #800000; ">5</span><br />
&gt;&nbsp;Host:&nbsp;<span style="color: #800000; ">127.0</span>.<span style="color: #800000; ">0.1</span>:<span style="color: #800000; ">8080</span><br />
&gt;&nbsp;<span style="color: #0000FF; ">Accept</span>:&nbsp;*/*<br />
&gt;&nbsp;<br />
&lt;&nbsp;HTTP/<span style="color: #800000; ">1.1</span>&nbsp;<span style="color: #800000; ">404</span>&nbsp;Not&nbsp;Found<br />
&lt;&nbsp;Date:&nbsp;Wed,&nbsp;<span style="color: #800000; ">28</span>&nbsp;Mar&nbsp;<span style="color: #800000; ">2012</span>&nbsp;<span style="color: #800000; ">08</span>:<span style="color: #800000; ">15</span>:<span style="color: #800000; ">27</span>&nbsp;GMT<br />
&lt;&nbsp;Content-Type:&nbsp;text/html<br />
&lt;&nbsp;Content-<span style="color: #0000FF; ">Length</span>:&nbsp;<span style="color: #800000; ">618</span><br />
&lt;&nbsp;Server:&nbsp;Jetty(<span style="color: #800000; ">8.1</span>.<span style="color: #800000; ">2</span>.v20120308)<br />
&lt;HTML&gt;<br />
&lt;HEAD&gt;<br />
&lt;TITLE&gt;Error&nbsp;<span style="color: #800000; ">404</span>&nbsp;-&nbsp;Not&nbsp;Found&lt;/TITLE&gt;<br />
&lt;BODY&gt;<br />
&lt;H2&gt;Error&nbsp;<span style="color: #800000; ">404</span>&nbsp;-&nbsp;Not&nbsp;Found.&lt;/H2&gt;</div>
<h3>运行方法2</h3>
<div>另外上述运行等价于：</div>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->[adyliu<span style="color: #800080; ">@adyliu</span>-pc&nbsp;jetty8]<span style="color: #008000; ">$</span><span style="color: #008000; ">&nbsp;sh&nbsp;run.sh&nbsp;org.eclipse.jetty.xml.XmlConfiguration&nbsp;etc/jetty.xml</span><span style="color: #008000; "><br />
</span><span style="color: #800000; ">2012</span>-<span style="color: #800000; ">03</span>-<span style="color: #800000; ">28</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">31</span>:<span style="color: #800000; ">16.481</span>:INFO:oejs.Server:jetty-<span style="color: #800000; ">8.1</span>.<span style="color: #800000; ">2</span>.v20120308<br />
<span style="color: #800000; ">2012</span>-<span style="color: #800000; ">03</span>-<span style="color: #800000; ">28</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">31</span>:<span style="color: #800000; ">16.518</span>:INFO:oejs.AbstractConnector:Started&nbsp;SelectChannelConnector@<span style="color: #800000; ">0.0</span>.<span style="color: #800000; ">0.0</span>:<span style="color: #800000; ">8080</span></div>
<h3>运行方法3</h3>
<div>第三种方法就是使用封装好的start.jar，这个jar包封装了一些常规的配置。</div>
<div><br />
在开始之前，我们先重命名下默认的start.ini，因为默认的配置文件会启动一个test.war环境。</div>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->mv&nbsp;start.ini&nbsp;start.ini.default</div>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->[adyliu<span style="color: #800080; ">@adyliu</span>-pc&nbsp;jetty8]<span style="color: #008000; ">$</span><span style="color: #008000; ">&nbsp;java&nbsp;-jar&nbsp;start.jar</span><span style="color: #008000; "><br />
</span><span style="color: #800000; ">2012</span>-<span style="color: #800000; ">03</span>-<span style="color: #800000; ">28</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">35</span>:<span style="color: #800000; ">21.941</span>:INFO:oejs.Server:jetty-<span style="color: #800000; ">8.1</span>.<span style="color: #800000; ">2</span>.v20120308<br />
<span style="color: #800000; ">2012</span>-<span style="color: #800000; ">03</span>-<span style="color: #800000; ">28</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">35</span>:<span style="color: #800000; ">21.992</span>:INFO:oejs.AbstractConnector:Started&nbsp;SelectChannelConnector@<span style="color: #800000; ">0.0</span>.<span style="color: #800000; ">0.0</span>:<span style="color: #800000; ">8080</span></div>
<div><br />
可以看出这个方式和第一种、第二种完全相同。</div>
<div></div>
<div>另外start.jar提供了一种可以查看当前运行参数的命令：</div>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->java&nbsp;-jar&nbsp;start.jar&nbsp;--dry-run</div>
<div><br />
可能输出:</div>
<div style="font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; border-image: initial; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; background-color: #eeeeee; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->/opt/apps/jdk/bin/java&nbsp;-Djetty.home=/opt/apps/jetty8&nbsp;-cp&nbsp;/opt/apps/jetty8/resources:\<br />
/opt/apps/jetty8/lib/jetty-xml-<span style="color: #800000; ">8.1</span>.<span style="color: #800000; ">2</span>.v20120308.jar:/opt/apps/jetty8/lib/servlet-api-<span style="color: #800000; ">3.0</span>.jar:\<br />
/opt/apps/jetty8/lib/jetty-http-<span style="color: #800000; ">8.1</span>.<span style="color: #800000; ">2</span>.v20120308.jar:/opt/apps/jetty8/lib/jetty-continuation-<span style="color: #800000; ">8.1</span>.<span style="color: #800000; ">2</span>.v20120308.jar:\<br />
/opt/apps/jetty8/lib/jetty-server-<span style="color: #800000; ">8.1</span>.<span style="color: #800000; ">2</span>.v20120308.jar:/opt/apps/jetty8/lib/jetty-security-<span style="color: #800000; ">8.1</span>.<span style="color: #800000; ">2</span>.v20120308.jar:\<br />
/opt/apps/jetty8/lib/jetty-servlet-<span style="color: #800000; ">8.1</span>.<span style="color: #800000; ">2</span>.v20120308.jar:/opt/apps/jetty8/lib/jetty-webapp-<span style="color: #800000; ">8.1</span>.<span style="color: #800000; ">2</span>.v20120308.jar:\<br />
/opt/apps/jetty8/lib/jetty-deploy-<span style="color: #800000; ">8.1</span>.<span style="color: #800000; ">2</span>.v20120308.jar:/opt/apps/jetty8/lib/jetty-servlets-<span style="color: #800000; ">8.1</span>.<span style="color: #800000; ">2</span>.v20120308.jar:\<br />
/opt/apps/jetty8/lib/jetty-util-<span style="color: #800000; ">8.1</span>.<span style="color: #800000; ">2</span>.v20120308.jar:/opt/apps/jetty8/lib/jetty-io-<span style="color: #800000; ">8.1</span>.<span style="color: #800000; ">2</span>.v20120308.jar&nbsp;\<br />
org.eclipse.jetty.xml.XmlConfiguration&nbsp;/tmp/start1059041541723976621.properties&nbsp;/opt/apps/jetty8/etc/jetty.xml</div>
<div><br />
有意思的是这里有一个临时文件：/tmp/start1059041541723976621.properties，里面记录了所有系统属性，也就是类似System.getProperties()。</div>
<div>除非是嵌入式开发，否则我们都是用start.jar来启动jetty。</div>
<h2>命令参数</h2>
<div>start.jar提供了大量的参数来负责启动JVM。</div>
<div>下面命令列出所有的命令行参数：</div>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->java&nbsp;-jar&nbsp;start.jar&nbsp;--help</div>
<div><br />
现在问题来了，这些默认的参数都是哪来的？例如，如果想改变<em>${jetty.home}</em>又怎样？</div>
<div>jetty内部默认提供了一个默认的配置文件<a href="http://dev.eclipse.org/svnroot/rt/org.eclipse.jetty/jetty/trunk/jetty-start/src/main/resources/org/eclipse/jetty/start/start.config" target="_blank">start.config</a>来解决此问题。</div>
<div>默认情况下start.jar里面带有一个默认的start.config文件，这个文件有一些预置的定义。</div>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->[adyliu<span style="color: #800080; ">@adyliu</span>-pc&nbsp;jetty8]$&nbsp;jar&nbsp;tvf&nbsp;start.jar&nbsp;|&nbsp;<span style="color: #0000FF; ">grep</span>&nbsp;start.config<br />
&nbsp;&nbsp;<span style="color: #800000; ">8669</span>&nbsp;Fri&nbsp;Mar&nbsp;<span style="color: #800000; ">09</span>&nbsp;<span style="color: #800000; ">00</span>:<span style="color: #800000; ">13</span>:<span style="color: #800000; ">12</span>&nbsp;CST&nbsp;<span style="color: #800000; ">2012</span>&nbsp;org/eclipse/jetty/start/start.config</div>
<a href="http://dev.eclipse.org/svnroot/rt/org.eclipse.jetty/jetty/trunk/jetty-start/src/main/resources/org/eclipse/jetty/start/start.config" target="_blank"><br />
start.config</a>&nbsp;文件内容非常大，其中大部分是注释。<br />
<p style="margin-top: 1.33em; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; background-color: #ffffff; ">start.config的作用有以下几个：</p>
<ul style="margin-top: 0px; margin-bottom: 0px; border-left-width: 5px; border-left-style: solid; border-left-color: #dddddd; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; background-color: #ffffff; ">
     <li>定义jetty.home属性</li>
     <li>定义jetty启动类</li>
     <li>定义jetty启动的默认配置文件</li>
     <li>定义OPTIONS</li>
     <li>根据OPTIONS来定义classpath</li>
</ul>
<p style="margin-top: 1.33em; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; background-color: #ffffff; ">上面特别提到OPTIONS。什么是OPTIONS？</p>
<div style="margin-top: 1.33em; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; background-color: #ffffff; "></div>
<h3>OPTIONS</h3>
<p style="margin-top: 0px; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; background-color: #ffffff; ">由于jetty是高度可定制的，因此jetty将各个模块拆分成各个非常细小的模块。每一个模块（实际上是一个个的jar包），我们可以简单的看出是一个OPTION。而每一个OPTION都会对应于实际的jar，这就决定了这些jar包是否需要加入classpath，并且在jetty启动的时候是否需要做一些额外的事情。</p>
<p style="margin-top: 1.33em; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; background-color: #ffffff; ">start.config文件的语法也挺有意思的。支持一些简单的逻辑判断，例如文件是否存在、命令行参数是否存在等。</p>
<p style="margin-top: 1.33em; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; background-color: #ffffff; ">默认情况下有如下配置：</p>
<ul style="margin-top: 0px; margin-bottom: 0px; border-left-width: 5px; border-left-style: solid; border-left-color: #dddddd; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; background-color: #ffffff; ">
     <li>path参数的值加入classpath</li>
     <li>lib参数的值作为目录搜索jar包，其中的jar/zip包加入classpath</li>
     <li>默认的启动类是org.eclipse.jetty.xml.XmlConfiguration.class，除非定义了start.class属性</li>
     <li>默认的jetty配置文件是$(jetty.home)/etc/jetty.xml，除非传入的参数不为空</li>
     <li>默认${jetty.home}目录是当前目录（不一定是start.jar所在路径）。${jetty.home}属性搜索顺序有：
     <ul style="margin-top: 0px; margin-bottom: 0px; border-left-width: 5px; border-left-style: solid; border-left-color: #dddddd; ">
         <li>$(jetty.home) 参数或者系统属性（包括环境变量）</li>
         <li>. 当前路径</li>
         <li>.. 当前路径的父路径</li>
         <li>jetty-distribution/src/main/resources 当前路径的发行版子路径</li>
         <li>../jetty-distribution/src/main/resources 当前路径的父路径的发行版子路径</li>
     </ul>
     </li>
     <li>默认的classpath有：
     <ul style="margin-top: 0px; margin-bottom: 0px; border-left-width: 5px; border-left-style: solid; border-left-color: #dddddd; ">
         <li>resources</li>
         <li>lib/jetty-xml-8.1.2.v20120308.jar</li>
         <li>lib/servlet-api-3.0.jar</li>
         <li>lib/jetty-http-8.1.2.v20120308.jar</li>
         <li>lib/jetty-continuation-8.1.2.v20120308.jar</li>
         <li>lib/jetty-server-8.1.2.v20120308.jar</li>
         <li>lib/jetty-security-8.1.2.v20120308.jar</li>
         <li>lib/jetty-servlet-8.1.2.v20120308.jar</li>
         <li>lib/jetty-webapp-8.1.2.v20120308.jar</li>
         <li>lib/jetty-deploy-8.1.2.v20120308.jar</li>
         <li>lib/jetty-servlets-8.1.2.v20120308.jar</li>
         <li>lib/jetty-util-8.1.2.v20120308.jar</li>
         <li>lib/jetty-io-8.1.2.v20120308.jar</li>
     </ul>
     </li>
</ul>
<div style="margin-top: 1.33em; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; background-color: #ffffff; "></div>
<h3>start.jar参数</h3>
<p style="margin-top: 0px; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; background-color: #ffffff; ">我们再来看start.jar支持的参数：</p>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->[adyliu<span style="color: #800080; ">@adyliu</span>-pc&nbsp;jetty8]<span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;java&nbsp;-jar&nbsp;start.jar&nbsp;--help</span><span style="color: #008000; "><br />
</span>Usage:&nbsp;java&nbsp;-jar&nbsp;start.jar&nbsp;[options<img src="http://www.blogjava.net/Images/dot.gif" alt="" />]&nbsp;[properties<img src="http://www.blogjava.net/Images/dot.gif" alt="" />]&nbsp;[configs<img src="http://www.blogjava.net/Images/dot.gif" alt="" />]</div>
<br />
<h4>options</h4>
<p style="margin-top: 0px; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; background-color: #ffffff; ">其中options列表（这指的是命令行参数，不是模块，由此可见jetty将内置的OPTIONS定义为模块多好）有：</p>
<ul style="margin-top: 0px; margin-bottom: 0px; border-left-width: 5px; border-left-style: solid; border-left-color: #dddddd; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; background-color: #ffffff; ">
     <li>--version 列出版本号</li>
     <li>--list-options 列出当前start.config支持的所有OPTIONS</li>
     <li>--list-config 列出当前start.config内容（文本内容）</li>
     <li>--dry-run 列出当前配置要启动的java进程完整参数（不启动jetty服务）</li>
     <li>--exec 启动子进程（只有启动子进程才能修改-X，-D等参数，因为start.jar本身就是依靠java进程启动的，不能在运行时改变）</li>
     <li>--stop 停止运行的jetty实例</li>
     <li>--daemon 后台运行jetty，启动将stdout/stderr记录到${jetty.log}/start.log中（好了，这个变量jetty.log没有默认配置说明，估计是${jetty.home}/logs目录）</li>
     <li>--config=&lt;file&gt; 指定特别的start.config，以便覆盖内置的start.config.(经过测试，如果指定此文件，那么内置的配置将不再读取，这导致必须将所有配置写全，包括mainclass/jetty config/OPTIONS等）</li>
     <li>--ini=&lt;file&gt; 从配置文件中装载命令行参数。上面参数以及下面提到的参数是在太多，可以从配置文件中一次性加载，默认的配置文件是${jetty.home}/start.ini。</li>
     <li>--pre=&lt;file&gt; 指定特别的jetty运行配置文件，这个配置文件在后面提高的配置文件前面运行，相当于改变默认的装载机制。</li>
</ul>
<div style="margin-top: 1.33em; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; background-color: #ffffff; "></div>
<h4>properties</h4>
<p style="margin-top: 0px; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; background-color: #ffffff; ">属性分成两种，一种是会传递给系统属性（java.lang.System#getProperty(String)),一种只是作为jetty的启动参数。</p>
<p style="margin-top: 1.33em; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; background-color: #ffffff; ">如果要传递给系统属性，则格式是： -Dname=value，和java进程系统属性类似。</p>
<p style="margin-top: 1.33em; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; background-color: #ffffff; ">jetty也有一些默认的系统属性：</p>
<table border="1" width="80%" style="font-size: 15px; line-height: 19px; border-color: initial; background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: #ffffff; border-collapse: collapse; color: #000000; font-family: Arial, Helvetica, sans-serif; background-position: 0px 0px; background-repeat: repeat repeat; ">
     <tbody>
         <tr>
             <th>属性</th><th>类型</th><th>描述</th>
         </tr>
         <tr>
             <td>org.eclipse.jetty.util.log.class</td>
             <td>class</td>
             <td>jetty日志记录，默认为：org.eclipse.jetty.util.log.Slf4jLog</td>
         </tr>
         <tr>
             <td>org.eclipse.jetty.util.log.DEBUG</td>
             <td>boolean</td>
             <td>调试日志输出地方，默认为stderr和java内置的Logger，如果是其他日志则需要设置为true，默认为false</td>
         </tr>
         <tr>
             <td>org.eclipse.jetty.util.log.IGNORED</td>
             <td>boolean</td>
             <td>是否记录一些忽略的错误日志，默认为false</td>
         </tr>
         <tr>
             <td>org.eclipse.jetty.util.log.SOURCE</td>
             <td>boolean</td>
             <td>记录错误日志行号？位置？默认为false</td>
         </tr>
         <tr>
             <td>com.sun.management.jmxremote</td>
             <td>&nbsp;</td>
             <td>启动jmx管理</td>
         </tr>
     </tbody>
</table>
<p style="margin-top: 1.33em; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; background-color: #ffffff; ">jetty的启动参数属性，格式是： name=value，注意这里没有-D了。这些参数不会传递给系统属性。</p>
<p style="margin-top: 1.33em; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; background-color: #ffffff; ">所有参数列表：</p>
<ul style="margin-top: 0px; margin-bottom: 0px; border-left-width: 5px; border-left-style: solid; border-left-color: #dddddd; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; background-color: #ffffff; ">
     <li>path=[directory]: 传递额外的classpath，参考上面默认的start.config配置</li>
     <li>lib=[directory]: 传递额外classpath搜索jar/zip的目录</li>
     <li>STOP.PORT=[number]: 停止jetty的端口（远程管理）</li>
     <li>STOP.KEY=[alphanumeric]: 停止jetty的密码（远程管理）</li>
     <li>DEBUG=true: 是否启动调试模式，同时会设置org.eclipse.jetty.util.log.DEBUG属性为true，默认为false</li>
     <li>OPTIONS=[option,option...]: OPTION列表，也就是要启动的模块列表。</li>
</ul>
<p style="margin-top: 1.33em; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; background-color: #ffffff; ">在内置的start.config中默认的OPTIONS列表有：</p>
<ul style="margin-top: 0px; margin-bottom: 0px; border-left-width: 5px; border-left-style: solid; border-left-color: #dddddd; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; background-color: #ffffff; ">
     <li>All</li>
     <li>Client</li>
     <li>Server</li>
     <li>ajp</li>
     <li>annotations</li>
     <li>client</li>
     <li>default</li>
     <li>deploy</li>
     <li>ext</li>
     <li>jmx</li>
     <li>jndi</li>
     <li>jsp</li>
     <li>jta</li>
     <li>monitor</li>
     <li>overlay</li>
     <li>overlays</li>
     <li>plus</li>
     <li>policy</li>
     <li>resources</li>
     <li>rewrite</li>
     <li>security</li>
     <li>server</li>
     <li>servlet</li>
     <li>servlets</li>
     <li>setuid</li>
     <li>webapp</li>
     <li>websocket</li>
     <li>xml</li>
</ul>
<div style="margin-top: 1.33em; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; background-color: #ffffff; "></div>
<h4>configs</h4>
<p style="margin-top: 0px; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; background-color: #ffffff; ">jetty运行需要一些配置文件，这些配置文件对应于不同的OPTION所需要的配置。</p>
<p style="margin-top: 1.33em; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; background-color: #ffffff; ">默认的jetty配置存在都存在于${jetty.home}/etc中，所有配置文件列表有：</p>
<ul style="margin-top: 0px; margin-bottom: 0px; border-left-width: 5px; border-left-style: solid; border-left-color: #dddddd; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; background-color: #ffffff; ">
     <li>etc/jetty-ajp.xml</li>
     <li>etc/jetty-annotations.xml</li>
     <li>etc/jetty-bio-ssl.xml</li>
     <li>etc/jetty-bio.xml</li>
     <li>etc/jetty-contexts.xml</li>
     <li>etc/jetty-debug.xml</li>
     <li>etc/jetty-deploy.xml</li>
     <li>etc/jetty-fileserver.xml</li>
     <li>etc/jetty-ipaccess.xml</li>
     <li>etc/jetty-jmx.xml</li>
     <li>etc/jetty-logging.xml</li>
     <li>etc/jetty-monitor.xml</li>
     <li>etc/jetty-overlay.xml</li>
     <li>etc/jetty-plus.xml</li>
     <li>etc/jetty-policy.xml</li>
     <li>etc/jetty-proxy.xml</li>
     <li>etc/jetty-requestlog.xml</li>
     <li>etc/jetty-rewrite.xml</li>
     <li>etc/jetty-ssl.xml</li>
     <li>etc/jetty-stats.xml</li>
     <li>etc/jetty-testrealm.xml</li>
     <li>etc/jetty-webapps.xml</li>
     <li>etc/jetty-xinetd.xml</li>
     <li>etc/jetty.xml</li>
</ul>
<p style="margin-top: 1.33em; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; background-color: #ffffff; ">这么多配置，如何记得住？该使用哪些配置？</p>
<p style="margin-top: 1.33em; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; background-color: #ffffff; ">下一个章节中介绍配置文件。<br />
</p>
<br />
参考资源：<br />
<ul>
<li><a href="http://www.blogjava.net/xylz/archive/2012/03/09/371598.html" target="_blank">[深入浅出Jetty 03] 简单的RESTful入门</a></li>
<li><a href="http://www.blogjava.net/xylz/archive/2012/01/29/368970.html" target="_blank">[深入浅出Jetty 02] Jetty 8.x 简单试用</a></li>
<li><a href="http://www.blogjava.net/xylz/archive/2012/01/29/368969.html" target="_blank">[深入浅出Jetty 01] Jetty 8.x 安装</a></li>
</ul><img src ="http://www.blogjava.net/xylz/aggbug/372923.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2012-03-28 19:02 <a href="http://www.blogjava.net/xylz/archive/2012/03/28/372923.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[深入浅出Jetty 03]简单的RESTful入门</title><link>http://www.blogjava.net/xylz/archive/2012/03/09/371598.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Fri, 09 Mar 2012 09:52:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2012/03/09/371598.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/371598.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2012/03/09/371598.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/371598.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/371598.html</trackback:ping><description><![CDATA[老实说本来这是一篇简单的RESTful的入门demo，和jetty无关，但是为了方便，用到了jetty的maven插件。勉勉强强算是和jetty有关吧。<br />
<br />
项目地址：<a href="https://github.com/adyliu/jetty-rest-demo">https://github.com/adyliu/jetty-rest-demo</a>&nbsp;<br />
<br />
<h2>文件列表</h2>
<br />
<p style="margin-top: 0px; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; ">包含如下文件：</p>
<ul style="margin-top: 0px; margin-bottom: 0px; border-left-width: 5px; border-left-style: solid; border-left-color: #dddddd; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; ">
     <li>git忽略文件</li>
     <li>README文件</li>
     <li>pom文件</li>
     <li>一个简单的Controller文件</li>
     <li>一个log4j的配置文件</li>
     <li>一个简单的spring mvc配置</li>
     <li>一个简单的web.xml</li>
</ul>
<div style="margin-top: 1.33em; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; "></div>
<h2>Maven配置</h2>为了能够方便从jetty:run来启动web容器，使用jetty的maven插件。<br />需要特别注意的是，从jetty7.5.3开始就必须用maven 3了，以前使用的maven 2不能使用了，就为了这问题，我跟踪了很久，大囧。<br />这里使用jetty最新的maven插件，同样会启动最新的jetty8.1.1 来测试。<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->&lt;build&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;plugins&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;plugin&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;groupId&gt;org.mortbay.jetty&lt;/groupId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;artifactId&gt;jetty-maven-plugin&lt;/artifactId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;version&gt;8.1.1.v20120215&lt;/version&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/plugin&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/plugins&gt;<br />
&lt;/build&gt;</div>
<h2>web.xml</h2>这是一个简单的web.xml配置，主要配置spring servlet。当然这里也辅助配置了一个log4j，方便查看日志输出，不配置也没关系。<br />另外也没有使用servlet 3.0的配置。<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">&lt;?</span><span style="color: #FF00FF; ">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000FF; ">?&gt;</span><br /><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">web-app&nbsp;</span><span style="color: #FF0000; ">xmlns</span><span style="color: #0000FF; ">="http://java.sun.com/xml/ns/j2ee"</span><span style="color: #FF0000; ">&nbsp;xmlns:xsi</span><span style="color: #0000FF; ">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;xsi:schemaLocation</span><span style="color: #0000FF; ">="http://java.sun.com/xml/ns/j2ee&nbsp;http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;version</span><span style="color: #0000FF; ">="2.4"</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">display-name</span><span style="color: #0000FF; ">&gt;</span>jetty-rest-demo<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">display-name</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">context-param</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">param-name</span><span style="color: #0000FF; ">&gt;</span>log4jConfigLocation<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">param-name</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">param-value</span><span style="color: #0000FF; ">&gt;</span>classpath:log4j.properties<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">param-value</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">context-param</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">listener</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">listener-class</span><span style="color: #0000FF; ">&gt;</span>org.springframework.web.util.Log4jConfigListener<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">listener-class</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">listener</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">servlet</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">servlet-name</span><span style="color: #0000FF; ">&gt;</span>dispatcher<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">servlet-name</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">servlet-class</span><span style="color: #0000FF; ">&gt;</span>org.springframework.web.servlet.DispatcherServlet<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">servlet-class</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">load-on-startup</span><span style="color: #0000FF; ">&gt;</span>1<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">load-on-startup</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">servlet</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">servlet-mapping</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">servlet-name</span><span style="color: #0000FF; ">&gt;</span>dispatcher<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">servlet-name</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">url-pattern</span><span style="color: #0000FF; ">&gt;</span>/*<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">url-pattern</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">servlet-mapping</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">web-app</span><span style="color: #0000FF; ">&gt;</span></div><h2>dispatcher-servlet.xml</h2>接下来是spring mvc的配置。<br />包含三部分：要扫描的住解包，mvc注解驱动以及jsp的渲染映射（其实这个例子中没有用到）。<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">&lt;?</span><span style="color: #FF00FF; ">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000FF; ">?&gt;</span><br /><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">beans&nbsp;</span><span style="color: #FF0000; ">xmlns</span><span style="color: #0000FF; ">="http://www.springframework.org/schema/beans"</span><span style="color: #FF0000; ">&nbsp;xmlns:xsi</span><span style="color: #0000FF; ">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;xmlns:context</span><span style="color: #0000FF; ">="http://www.springframework.org/schema/context"</span><span style="color: #FF0000; ">&nbsp;xmlns:mvc</span><span style="color: #0000FF; ">="http://www.springframework.org/schema/mvc"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;xsi:schemaLocation</span><span style="color: #0000FF; ">="http://www.springframework.org/schema/beans&nbsp;http://www.springframework.org/schema/beans/spring-beans-3.1.xsd<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/context&nbsp;http://www.springframework.org/schema/context/spring-context-3.1.xsd<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/mvc&nbsp;http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd"</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">context:component-scan&nbsp;</span><span style="color: #FF0000; ">base-package</span><span style="color: #0000FF; ">="info.imxylz.study.jetty.rest"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">mvc:annotation-driven&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">bean&nbsp;</span><span style="color: #FF0000; ">class</span><span style="color: #0000FF; ">="org.springframework.web.servlet.view.InternalResourceViewResolver"</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="prefix"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="/WEB-INF/pages/"</span><span style="color: #0000FF; ">&gt;&lt;/</span><span style="color: #800000; ">property</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="suffix"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">=".jsp"</span><span style="color: #0000FF; ">&gt;&lt;/</span><span style="color: #800000; ">property</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="viewClass"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="org.springframework.web.servlet.view.JstlView"</span><span style="color: #0000FF; ">&gt;&lt;/</span><span style="color: #800000; ">property</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">bean</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">beans</span><span style="color: #0000FF; ">&gt;</span></div><br /><h2>Controller</h2>下载开始写第一个Controller，当然这个Controller稍微有一点点别扭。<br />直接返回字符串，另外将索引页映射到一个字符串上。（也不对中文进行处理）<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">package</span>&nbsp;info.imxylz.study.jetty.rest.controller;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.stereotype.Controller;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.web.bind.annotation.PathVariable;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.web.bind.annotation.RequestMapping;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.web.bind.annotation.ResponseBody;<br /><br /><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;*&nbsp;a&nbsp;rest&nbsp;demo&nbsp;(spring&nbsp;3.x)<br />&nbsp;*&nbsp;<br />&nbsp;*&nbsp;</span><span style="color: #808080; ">@author</span><span style="color: #008000; ">&nbsp;adyliu&nbsp;(imxylz@gmail.com)<br />&nbsp;*&nbsp;</span><span style="color: #808080; ">@since</span><span style="color: #008000; ">&nbsp;2012-3-9<br />&nbsp;</span><span style="color: #008000; ">*/</span><br />@Controller<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;DemoController&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@ResponseBody<br />&nbsp;&nbsp;&nbsp;&nbsp;@RequestMapping("/index/{name}/")<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;String&nbsp;index(@PathVariable("name")&nbsp;String&nbsp;name)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;"Welcome,&nbsp;"&nbsp;+&nbsp;name;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;@ResponseBody<br />&nbsp;&nbsp;&nbsp;&nbsp;@RequestMapping("")<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;String&nbsp;index()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;"This&nbsp;is&nbsp;a&nbsp;rest&nbsp;demo";<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div><br /><h2>Access</h2>现在该是打开浏览器显示下了。<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->http://localhost:8080/index/Ady/<br />http://localhost:8080/index/Ady%20Liu/<br />http://localhost:8080/</div><br />好了，这算是一个最简单的入门例子了。<br />下面的参考资源中有git的源码。<br /><div style="margin-top: 1.33em; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; "></div>
<h2>Resources</h2>
<ul style="margin-top: 0px; margin-bottom: 0px; border-left-width: 5px; border-left-style: solid; border-left-color: #dddddd; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; ">
     <li>Source code: git@github.com:adyliu/jetty-rest-demo.git (branch: v1.0-helloworld)</li>
     <li>Jetty Maven Plugin:&nbsp;<a href="http://wiki.eclipse.org/Jetty/Feature/Jetty_Maven_Plugin" rel="nofollow" style="text-decoration: none; ">http://wiki.eclipse.org/Jetty/Feature/Jetty_Maven_Plugin</a></li>
     <li>Spring MVC:&nbsp;<a href="http://static.springsource.org/spring/docs/3.1.1.RELEASE/spring-framework-reference/html/mvc.html" rel="nofollow" style="text-decoration: none; ">http://static.springsource.org/spring/docs/3.1.1.RELEASE/spring-framework-reference/html/mvc.html</a></li>
</ul><img src ="http://www.blogjava.net/xylz/aggbug/371598.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2012-03-09 17:52 <a href="http://www.blogjava.net/xylz/archive/2012/03/09/371598.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[深入浅出Jetty 02] Jetty 8.x 简单试用</title><link>http://www.blogjava.net/xylz/archive/2012/01/29/368970.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Sun, 29 Jan 2012 08:41:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2012/01/29/368970.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/368970.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2012/01/29/368970.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/368970.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/368970.html</trackback:ping><description><![CDATA[<h1>Jetty 8.x 简单试用</h1><h2>运行</h2><p style="margin-top: 0px; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; background-color: #ffffff; ">安装好了以后，在jetty的主目录下，运行起来。</p><pre style="font-size: 1.2em; font-family: 'Lucida Console', 'Andale Mono', 'Courier New', Courier, monospace; line-height: 1.2em; margin-top: 2px; margin-bottom: 2px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-color: initial; border-image: initial; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f9f9f9; overflow-x: auto; overflow-y: auto; border-top-left-radius: 5px; border-top-right-radius: 5px; border-bottom-right-radius: 5px; border-bottom-left-radius: 5px; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; margin-right: 2px; margin-left: 2px; ">java -jar start.jar </pre><p style="margin-top: 0px; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; background-color: #ffffff; ">如果仔细看的话还有一个start.ini，这是典型的eclipse启动方式。事实上jetty8是按照eclipse的OSGI启动模型来运行的。</p><div style="margin-top: 1.33em; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; background-color: #ffffff; "></div><h2>远程访问</h2><p style="margin-top: 0px; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; background-color: #ffffff; ">默认情况下jetty使用8080端口，访问下看看。</p><pre style="font-size: 1.2em; font-family: 'Lucida Console', 'Andale Mono', 'Courier New', Courier, monospace; line-height: 1.2em; margin-top: 2px; margin-bottom: 2px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-color: initial; border-image: initial; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f9f9f9; overflow-x: auto; overflow-y: auto; border-top-left-radius: 5px; border-top-right-radius: 5px; border-bottom-right-radius: 5px; border-bottom-left-radius: 5px; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; margin-right: 2px; margin-left: 2px; ">http://adyliu-pc:8080 </pre><p style="margin-top: 0px; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; background-color: #ffffff; ">出现了点问题。启动后居然是jetty7后的描述信息。看来jetty8发布的时候比较粗糙，这些细节都没有处理好。事实上，官方站点上的文章都是和jetty7.x有关的，没有更新到8.x版本。<br /><img src="http://www.blogjava.net/images/blogjava_net/xylz/jetty01.png" width="949" height="391" alt="" /><br /></p><p style="margin-top: 1.33em; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; background-color: #ffffff; ">好在有一行提示说，如果要远程访问的话，需要开启一个设置。好吧，按照说明，将默认test.war的远程访问模式打开。 修改文件$JETTY_HOME/contexts/test.d/override-web.xml中的如下部分<br /></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">filter</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">filter-name</span><span style="color: #0000FF; ">&gt;</span>TestFilter<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">filter-name</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">filter-class</span><span style="color: #0000FF; ">&gt;</span>com.acme.TestFilter<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">filter-class</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">init-param</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">param-name</span><span style="color: #0000FF; ">&gt;</span>remote<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">param-name</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">param-value</span><span style="color: #0000FF; ">&gt;</span>true<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">param-value</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">init-param</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">filter</span><span style="color: #0000FF; ">&gt;</span></div><p style="margin-top: 0px; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; background-color: #ffffff; "><br />这里已经将默认remote的属性值false改为了true。然后再试试。</p><div style="margin-top: 1.33em; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; background-color: #ffffff; "></div><div style="font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; background-color: #ffffff; "><br /><img src="http://www.blogjava.net/images/blogjava_net/xylz/jetty02.png" width="959" height="485" alt="" /></div><p style="margin-top: 1.33em; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; background-color: #ffffff; ">显然，这样就已经支持远程访问了。</p><div style="margin-top: 1.33em; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; background-color: #ffffff; "></div><h2>Servlet访问</h2><p style="margin-top: 0px; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; background-color: #ffffff; ">test.war模块里面有一个dump的Servlet，它可以查看当前请求的Request/Session/Cookie信息。我们简单看一下Request请求。<br /><br /></p><div style="margin-top: 1.33em; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; background-color: #ffffff; "></div><div style="font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; background-color: #ffffff; "><img src="http://www.blogjava.net/images/blogjava_net/xylz/jetty03.png" width="900" height="609" alt="" /></div><p style="margin-top: 0px; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; background-color: #ffffff; ">这里面的信息非常丰富，这为以后调试当前请求信息提供了很方便的样例。</p><div style="margin-top: 1.33em; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; background-color: #ffffff; "></div><h2>Comet模型</h2><p style="margin-top: 0px; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; background-color: #ffffff; ">Jetty8.x里面有两种comet模型，一种是常见的长连接(Long Polling), 另一种就是HTML5支持的WebSocket模型。</p><p style="margin-top: 1.33em; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; background-color: #ffffff; ">我们先来简单看一下Long Polling模型。在这种方式下，浏览器定时发起一个长连接，等待服务器返回。一次请求完了以后仍然会发起一个新的请求，总是有一个连接保持双方的通讯。 下图描述了此效果。<br /><img src="http://www.blogjava.net/images/blogjava_net/xylz/jetty-long-polling.png" width="717" height="505" alt="" /><br /></p><p style="margin-top: 1.33em; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; background-color: #ffffff; ">而WebSocket模型显然不是所有浏览器都支持的。高版本的Chrome就支持，比如我的chrome 18.0的开发版本就能很好的支持WebSocket。<br /><img src="http://www.blogjava.net/images/blogjava_net/xylz/jetty-websocket.png" width="721" height="380" alt="" /><br /></p><p style="margin-top: 1.33em; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; background-color: #ffffff; ">有意思的是，这里的请求头和响应头有一些特殊的标识。以后涉及到websocket的时候再来研究。<br /><img src="http://www.blogjava.net/images/blogjava_net/xylz/jetty-websocket-headers.png" width="622" height="341" alt="" /><br /></p><p style="margin-top: 1.33em; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; background-color: #ffffff; ">经测试，我机器上的chrome 18.0,firefox 8.0都支持websocket的，而IE9仍然不支持。<br /><br /><img src="http://www.blogjava.net/images/blogjava_net/xylz/jetty-firefox.png" alt="" /><br /></p><img src ="http://www.blogjava.net/xylz/aggbug/368970.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2012-01-29 16:41 <a href="http://www.blogjava.net/xylz/archive/2012/01/29/368970.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[深入浅出Jetty 01] Jetty 8.x 安装</title><link>http://www.blogjava.net/xylz/archive/2012/01/29/368969.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Sun, 29 Jan 2012 08:34:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2012/01/29/368969.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/368969.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2012/01/29/368969.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/368969.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/368969.html</trackback:ping><description><![CDATA[<p style="margin-top: 0px; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; background-color: #ffffff; ">Jetty从7.x已经迁移到eclipse下了，从eclipse的下载目录开始安装吧。</p>
<p style="margin-top: 1.33em; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; background-color: #ffffff; ">最新的发布版本是8.1.0.v20120127，我们从这个版本开始。<br />
</p>
<h2>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->JETTY_VERSION=8.1.0.v20120127<br />
wget&nbsp;http:<span style="color: #008000; ">//</span><span style="color: #008000; ">download.eclipse.org/jetty/$JETTY_VERSION/dist/jetty-distribution-$JETTY_VERSION.tar.gz</span><span style="color: #008000; "><br />
</span>tar&nbsp;xfz&nbsp;jetty-distribution-$JETTY_VERSION.tar.gz<br />
cd&nbsp;jetty-distribution-$JETTY_VERSION<br />
java&nbsp;-jar&nbsp;start.jar</div>
<span style="font-size: 14px; font-weight: normal;"><br />
</span>附录</h2>
<ul style="margin-top: 0px; margin-bottom: 0px; border-left-width: 5px; border-left-style: solid; border-left-color: #dddddd; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; background-color: #ffffff; ">
     <li>下载地址：<a href="http://download.eclipse.org/jetty/8.1.0.v20120127/dist/jetty-distribution-8.1.0.v20120127.tar.gz" rel="nofollow" style="text-decoration: none; ">http://download.eclipse.org/jetty/8.1.0.v20120127/dist/jetty-distribution-8.1.0.v20120127.tar.gz
     </a></li>
    <li>更多下载安装方式:<a href="http://wiki.eclipse.org/Jetty/Starting/Downloads">http://wiki.eclipse.org/Jetty/Starting/Downloads </a></li>
</ul><img src ="http://www.blogjava.net/xylz/aggbug/368969.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2012-01-29 16:34 <a href="http://www.blogjava.net/xylz/archive/2012/01/29/368969.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>