https://blog.csdn.net/tomato__/article/details/28874805

Web应用的框架

标准Jetty发布版本能部署标准servlet Spec Web应用和Jetty内部ContextHandler部署描述符,或者两者的一个混合。
Web应用是可部署的动态(servlets、filters、jsps、等等)和静态内容、支持库、和绑定到特定上下文路径的描写性的元数据的集合。
格式和布局最终都是通过Servlet Spec定义,你可以查阅官方Servlet Spec文档获取关于Web应用布局和结构的更多细节,这里将给出一个基本的轮廓。
Web应用能被捆绑到一个单个的Web文件(WAR文件)或者作为一个文件夹树:
 1)/WEB-INF/
 专门的Servlet API定义文件夹,通常存储和Web应用相关但不为外部访问的任何东西。
 如果你有内容被你的Web应用内部访问,但不会被web浏览器直接地访问,你就应该把他们放在这里。
 2)/WEB-INF/web.xml
 必须的部署描述符,用于定义你的Web应用的各种行为。
 3)/WEB-INF/classes/
 Web应用的java classes文件放置目录。
 4)/WEB-INF/lib/
 JAR文件放置的目录。

自动的Web应用部署

为了部署Web应用,最简单的方式就是放置你的WAR文件或者解压后的WAR文件夹到${jetty.home}/webapps/,Jetty的部署扫描器将发现它,并部署它到同名的Context路径下。
上下文路径基于你的WAR的文件名(或文件夹名)。下面是一些例子(文件或文件夹名->上下文路径):
/webapps/footrope.war -> http://host/footrope/
/webapps/baggywrinkle-1.0.war -> http://host/baggywrinkle-1.0/
/webapps/lazaret-2.1.3-SNAPSHOT.war -> http://host/lazaret-2.1.3-SNAPSHOT/
/webapps/belaying-pins/WEB-INF/web.xml -> http://host/belaying-pins/
/webapps/root.war (special name) -> http://host/
/webapps/root/WEB-INF/web.xml (special name) -> http://host/

配置特定的Web应用部署

用自动的Web应用部署方式是快速和简单的,但有时你也许需要调整一些部署属性(例如,你想指定一个上下文路径而不是使用文件名,或者你想为这个Web应用指定一个特定的数据库连接池),你可以使用Jetty Deployable Descriptor XML文件来实现。
Jetty支持通过XML文件部署Web应用,这些XML文件将构建一个Jetty能部署的ContextHandler实例。

使用基本的描述符文件

在默认的Jetty安装中,Jetty扫描他的$JETTY_HOME/webapps文件夹查找上下文部署描述符文件,为了用这个文件部署一个web应用,只需要放置这个文件在那个文件夹中。
部署描述符文件自己是一个配置了一个WebAppContext类的XML文件。为了一个基本的安装,你需要设置仅两个属性:
     war:web应用文件(或文件夹)的文件路径;
     contextPath:web应用使用的上下文路径。
例如,下面是是一个描述符文件,将/opt/myapp/myapp.war部署到上下文路径/wiki:


 
  1. <?xml version="1.0" encoding="ISO-8859-1"?>

  2. <!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">

  3.  
  4. <Configure class="org.eclipse.jetty.webapp.WebAppContext">

  5. <Set name="contextPath">/wiki</Set>

  6. <Set name="war">/opt/myapp/myapp.war</Set>

  7. </Configure>

或者你可以使用SystemProperty和Property元素在你的描述符文件中,如果你设置了系统属性myapp.home=/opt/myapp,你能重写上面的例子:


 
  1. <?xml version="1.0" encoding="ISO-8859-1"?>

  2. <!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">

  3.  
  4. <Configure class="org.eclipse.jetty.webapp.WebAppContext">

  5. <Set name="contextPath">/wiki</Set>

  6. <Set name="war"><SystemProperty name="myapp.home"/>/myapp.war</Set>

  7. </Configure>

如果你需要为你的应用修改home路径,你仅需要改变系统属性,这在有些场合非常有用。

配置高级描述符文件

如果你看WebAppContext类的文档,你会发现它有许多属性而不是仅仅有上面提到的两项,下面是一些为你的描述符文件配置高级属性的例子。
第一个例子告诉Jetty在部署WAR文件的时候不要解压。这能帮助用户避免修改解压后的WAR,导致web应用下次部署的时候修改被还原。


 
  1. <?xml version="1.0" encoding="ISO-8859-1"?>

  2. <!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">

  3.  
  4. <Configure class="org.eclipse.jetty.webapp.WebAppContext">

  5. <Set name="contextPath">/wiki</Set>

  6. <Set name="war"><SystemProperty name="myapp.home"/>/myapp.war</Set>

  7. <Set name="extractWAR">false</Set>

  8. </Configure>

下面的例子是获取JavaEE Servlet上下文,并为它设置初始化参数。你也能使用setAttribute方法设置Servlet上下文属性。然而,由于web应用的web.xml在部署描述符之后处理,web.xml值可能覆盖你设置的属性值。


 
  1. <?xml version="1.0" encoding="ISO-8859-1"?>

  2. <!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">

  3.  
  4. <Configure class="org.eclipse.jetty.webapp.WebAppContext">

  5. <Set name="contextPath">/wiki</Set>

  6. <Set name="war"><SystemProperty name="myapp.home"/>/myapp.war</Set>

  7. <Get name="ServletContext">

  8. <Call name="setInitParameter">

  9. <Arg>myapp.config</Arg>

  10. <Arg><SystemProperty name="myapp.home">/config/app-config.xml</Arg>

  11. </Call>

  12. </Get>

  13. </Configure>

下面是设置一个指定的web.xml的覆盖描述符的例子,该描述符在web应用的web.xml之后处理,因此它可以覆盖web.xml中设置的同名属性。当你想添加参数或者额外的附加Servlet mappings又不想修改压缩的WAR文件的时候,可以采用这种方式。


 
  1. <?xml version="1.0" encoding="ISO-8859-1"?>

  2. <!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">

  3.  
  4. <Configure class="org.eclipse.jetty.webapp.WebAppContext">

  5. <Set name="contextPath">/wiki</Set>

  6. <Set name="war"><SystemProperty name="myapp.home"/>/myapp.war</Set>

  7. <Set name="overrideDescriptor">/opt/myapp/overlay-web.xml</Set>

  8. </Configure>

下面的例子不仅配置web应用上下文,而且配置一个数据库连接池。


 
  1. <?xml version="1.0" encoding="ISO-8859-1"?>

  2. <!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">

  3.  
  4. <Configure class="org.eclipse.jetty.webapp.WebAppContext">

  5. <Set name="contextPath">/wiki</Set>

  6. <Set name="war"><SystemProperty name="myapp.home"/>/myapp.war</Set>

  7. </Configure>

  8.  
  9. <New id="DSTest" class="org.eclipse.jetty.plus.jndi.Resource">

  10. <Arg></Arg>

  11. <Arg>jdbc/DSTest</Arg>

  12. <Arg>

  13. <New class="org.apache.commons.dbcp.BasicDataSource">

  14. <Set name="driverClassName">org.some.Driver</Set>

  15. <Set name="url">jdbc.url</Set>

  16. <Set name="username">jdbc.user</Set>

  17. <Set name="password">jdbc.pass</Set>

  18. </New>

  19. </Arg>

  20. </New>

WebAppContext还有许多其它的设置项,具体可以参看WebAppContext的javadoc文档。

部署WebAppContexts的处理

web应用在进入service之前,需要一些处理:解压、为它们的jar指定classloader、web.xml和web-fragment.xml描述符处理、类的注释扫描。当web应用变得更加复杂时,我们增加方法帮助你在部署时添加或者减少处理的数量。在这节我们将学习部署处理和你怎么裁剪它。

Jetty的配置类

当一个webapp正在被部署时,一系列org.eclipse.jetty.webapp.Configuration类将被应用到它,它们中的每一个都履行一个特定的功能。这些配置的顺序是有意义的,后续的配置在先前的配置基础上处理。下面是被应用到每一个org.eclipse.jetty.webapp.WebAppContext的配置列表,按顺序:

org.eclipse.jetty.webapp.WebInfConfiguration -> 抽取war,整理jars和定义classpath
org.eclipse.jetty.webapp.WebXmlConfiguration -> 处理WEB-INF/web.xml文件
org.eclipse.jetty.webapp.MetaInfConfiguration -> 为META-INF/resources和META-INF/web-fragment.xml查看container和webapp jars
org.eclipse.jetty.webapp.FragmentConfiguration -> 处理所有的发现的META-INF/web-fragment.xml文件
org.eclipse.jetty.webapp.JettyWebXmlConfiguration -> 处理WEB-INF/jetty-web.xml文件

一个配置类的结构

一个配置类在WebAppContext的生命周期中有五个阶段:
 1)preConfigure:在WebAppContext启动时执行。配置应该发现它在后续的阶段需要的所有资源;
 2)configure:这个阶段将执行配置类的工作,通常会使用在preConfigure阶段发现的资源;
 3)postConfigure:这个阶段配置将清理上一个阶段创建的一些资源,这些资源在WebAppContext的生命周期中将不再需要;
 4)deconfigure:这个阶段在WebAppContext被停止时出现,允许配置撤销它创建的资源/元数据;
 5)destroy:这个阶段在WebAppContext从service移除时调用,例如:和它相关的war文件将从$JETTY_HOME/webapps文件夹中删除。
每个配置类的每个阶段都按照配置类的配置顺序被调用,例如,用默认配置类作为例子,preConfigure()被调用的顺序依照WebInfConfiguration、WebXmlConfiguration、MetaInfConfiguration、FragmentConfiguration、最后JettyWebXmlConfiguration,这个循环又开始在configure()阶段,然后是postConfigure()阶段,循环再次重复在deconfigure(),最终在destroy()阶段。

通过创建额外的配置扩展容器支持

由上所述,有一个默认的配置集合支持基本的webapp部署。你将注意到我们没有提到一些JavaEE特征,例如JNDI,也没有提到高级servlet spec特征,例如注释。那是因为Jetty的哲学是允许用户按照自己的需要裁剪容器。如果你不需要这些特征,那么你不需要为它们付出代价 - 一个重要的考虑是因为这些特征例如注释需要大量的和耗时的WEB-INF/lib包的扫描,这些都可能成为部署延迟的源头。我们将在下面的“其它配置”中看到另一个Jetty提供的webapp工具,可以帮助削减分析jar包的时间消耗。
Jetty采用插件的方式提供对JNDI和注释的支持。

首先,让我们看看怎么支持JNDI。
我们需要用到两个额外的配置:

org.eclipse.jetty.plus.webapp.EnvConfiguration -> 创建java:comp/env为webapp,应用WEB-INF/jetty-env.xml文件
org.eclipse.jetty.plus.webapp.PlusConfiguration -> 处理JNDI关联的WEB-INF/web.xml标记,并且与名目挂钩

这些配置必须按照上面的顺序添加,并且应该在配置列表中的org.eclipse.jetty.webapp.JettyWebXmlConfiguration前被插入。支持JNDI的细节将在后面用一个单独的章节讲解。

下面来看看怎么注释。我们需要仅一个额外的配置类帮助提供servlet注释扫描:

org.eclipse.jetty.annotations.AnnotationConfiguration -> 扫描容器和web app jars查找@WebServlet、@WebFilter、@WebListener等

上面的配置必须在org.eclipse.jetty.webapp.JettyWebXmlConfiguration之前插入。注释的配置细节也将在后面用一个单独的章节讲解。

怎么设置配置列表

你可以为Jetty指定一个不同的配置列表,通过下面的方式。
 1)直接在WebAppContext中设置配置列表
如果你仅希望影响一个webapp,这可能是最容易的方式。你可以通过上下文配置文件或者代码来设置配置列表,下面是一个例子怎么为JNDI和注释添加配置:


 
  1. <?xml version="1.0"?>

  2. <!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">

  3.  
  4. <Configure class="org.eclipse.jetty.webapp.WebAppContext">

  5.  
  6. <Set name="war"><SystemProperty name="jetty.home" default="."/>/webapps/my-cool-webapp</Set>

  7.  
  8. <Set name="configurationClasses">

  9. <Array type="java.lang.String">

  10. <Item>org.eclipse.jetty.webapp.WebInfConfiguration</Item>

  11. <Item>org.eclipse.jetty.webapp.WebXmlConfiguration</Item>

  12. <Item>org.eclipse.jetty.webapp.MetaInfConfiguration</Item>

  13. <Item>org.eclipse.jetty.webapp.FragmentConfiguration</Item>

  14. <Item>org.eclipse.jetty.plus.webapp.EnvConfiguration</Item>

  15. <Item>org.eclipse.jetty.plus.webapp.PlusConfiguration</Item>

  16. <Item>org.eclipse.jetty.annotations.AnnotationConfiguration</Item>

  17. <Item>org.eclipse.jetty.webapp.JettyWebXmlConfiguration</Item>

  18. </Array>

  19. </Set>

  20.  
  21. </Configure>

 2)通过部署器为所有的webapp设置配置列表
如果你用部署器(deployer),你能在WebAppProvider设置配置列表,它们将被应用到每一个被部署器部署的WebAppContext。


 
  1. <?xml version="1.0"?>

  2. <!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">

  3.  
  4. <Configure id="Server" class="org.eclipse.jetty.server.Server">

  5.  
  6. <Call name="addBean">

  7. <Arg>

  8. <New id="DeploymentManager" class="org.eclipse.jetty.deploy.DeploymentManager">

  9. <Set name="contexts">

  10. <Ref refid="Contexts" />

  11. </Set>

  12. <Call id="webappprovider" name="addAppProvider">

  13. <Arg>

  14. <New class="org.eclipse.jetty.deploy.providers.WebAppProvider">

  15. <Set name="monitoredDirName"><Property name="jetty.home" default="." />/webapps</Set>

  16. <Set name="configurationClasses">

  17. <Array type="java.lang.String">

  18. <Item>org.eclipse.jetty.webapp.WebInfConfiguration</Item>

  19. <Item>org.eclipse.jetty.webapp.WebXmlConfiguration</Item>

  20. <Item>org.eclipse.jetty.webapp.MetaInfConfiguration</Item>

  21. <Item>org.eclipse.jetty.webapp.FragmentConfiguration</Item>

  22. <Item>org.eclipse.jetty.plus.webapp.EnvConfiguration</Item>

  23. <Item>org.eclipse.jetty.plus.webapp.PlusConfiguration</Item>

  24. <Item>org.eclipse.jetty.annotations.AnnotationConfiguration</Item>

  25. <Item>org.eclipse.jetty.webapp.JettyWebXmlConfiguration</Item>

  26. </Array>

  27. </Set>

  28. </New>

  29. </Arg>

  30. </Call>

  31. </New>

  32. </Arg>

  33. </Call>

  34. </Configure>

3)添加或者插入到一个存在的列表
你可以将配置类添加或者插入一个已经存在的配置列表,下面是一个例子,它实现了为JNDI添加一个配置支持 - 你可以通过xml配置文件按,或者通过代码,这里使用配置文件,实际上它是Jetty发布版本的$JETTY_HOME/etc/jetty-plus.xml:


 
  1. <?xml version="1.0"?>

  2. <!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">

  3.  
  4. <Configure id="Server" class="org.eclipse.jetty.server.Server">

  5.  
  6. <!-- =========================================================== -->

  7. <!-- Add plus Configuring classes to all webapps for this Server -->

  8. <!-- =========================================================== -->

  9. <Call class="org.eclipse.jetty.webapp.Configuration$ClassList" name="setServerDefault">

  10. <Arg><Ref refid="Server" /></Arg>

  11. <Call name="addAfter">

  12. <Arg name="afterClass">org.eclipse.jetty.webapp.FragmentConfiguration</Arg>

  13. <Arg>

  14. <Array type="String">

  15. <Item>org.eclipse.jetty.plus.webapp.EnvConfiguration</Item>

  16. <Item>org.eclipse.jetty.plus.webapp.PlusConfiguration</Item>

  17. </Array>

  18. </Arg>

  19. </Call>

  20. </Call>

  21.  
  22. </Configure>

org.eclipse.jetty.webapp.Configuration.ClassList类提供了下面的方法:
 1)addAfter:在给出的配置类名的后面插入提供的配置类列表;
 2)addBefore:在给出的配置类名之前插入提供的配置类列表。

其它配置

org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern

这是一个上下文属性,用于设置在an org.eclipse.jetty.webapp.WebAppContext,控制容器的classpath的哪些部分应该为一些特性做处理,这些特性包括:注释、META-INF/resources、META-INF/web-fragment.xml等。
属性的值是一个正则表达式,下面是一个例子,使用xml文件(也可以用代码),指定匹配任何名字以“foo-”或者“bar-”开始的jar,或者名字为classes的文件夹:


 
  1. <?xml version="1.0"?>

  2. <!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">

  3.  
  4. <Configure class="org.eclipse.jetty.webapp.WebAppContext">

  5.  
  6. <Call name="setContextAttribute">

  7. <Arg>org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern</Arg>

  8. <Arg>.*/foo-[^/]*\.jar$|.*/bar-[^/]*\.jar$|.*/classes/.*</Arg>

  9. </Call>

  10.  
  11. </Configure>

注意配置的顺序决定了jar或者class文件夹扫描的顺序。

org.eclipse.jetty.server.webapp.WebInfIncludeJarPattern

和上面类似,这个属性控制哪个jar因为注释和META-INF下的资源被处理。然而,这个属性只处理webapp的classpath(通常是WEB-INF/lib)下的jar。当你有许多jar在WEB-INF/lib中,但你知道只有少数的jar需要被扫描的时候特别有用。
下面是一个例子,这里只匹配以“spring-”开头的jar:


 
  1. <?xml version="1.0"?>

  2. <!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">

  3.  
  4. <Configure class="org.eclipse.jetty.webapp.WebAppContext">

  5.  
  6. <Call name="setContextAttribute">

  7. <Arg>org.eclipse.jetty.server.webapp.WebInfIncludeJarPattern</Arg>

  8. <Arg>.*/spring-[^/]*\.jar$</Arg>

  9. </Call>

  10.  
  11. </Configure>

注意配置的顺序决定了jar扫描的顺序。

配置静态内容部署

你可以用Jetty部署描述符文件和内部的ResourceHandler设置简单的静态内容服务。仅需要在${jetty.home}/webapps文件夹中创建一个文件scratch.xml,然后粘贴这些文件内容在它里面。


 
  1. <?xml version="1.0"?>

  2. <!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">

  3. <Configure class="org.eclipse.jetty.server.handler.ContextHandler">

  4. <Set name="contextPath">/scratch</Set>

  5. <Set name="handler">

  6. <New class="org.eclipse.jetty.server.handler.ResourceHandler">

  7. <Set name="resourceBase">/home/jesse/scratch</Set>

  8. <Set name="directoriesListed">true</Set>

  9. </New>

  10. </Set>

  11. </Configure>

这是一个很基本的静态文件服务设置,如果你想要你写高级设置,可以使用DefaultServlet。

热部署

Jetty可以通过监听一个文件改变来部署任意的上下文或者web应用。如果你增加一个web应用或一个上下文描述符到这个文件夹,Jetty的DeploymentManager(DM)将部署一个新的上下文。如果你接触或者更新一个上下文描述符,DM停止、重配置、并重新部署它的上下文。如果你移除一个上下文,DM停止它,并从server移除它。
为了控制这个行为,你将需要配置一些WebAppProvider属性。
 1)monitoredDirName:需要扫描的可能部署web应用(或部署描述符xml文件)的文件夹;
 2)scanInterval:提供的monitoredDirName的扫描周期,单位秒;0表示不支持热部署。
这个配置默认的位置是在${jetty.home}/etc/jetty-deploy.xml文件中。


 
  1. <?xml version="1.0"?>

  2. <!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">

  3. <Configure id="Server" class="org.eclipse.jetty.server.Server">

  4.  
  5. <Call name="addBean">

  6. <Arg>

  7. <New id="DeploymentManager" class="org.eclipse.jetty.deploy.DeploymentManager">

  8. <Set name="contexts">

  9. <Ref refid="Contexts" />

  10. </Set>

  11. <Call name="setContextAttribute">

  12. <Arg>org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern</Arg>

  13. <Arg>.*/servlet-api-[^/]*\.jar$</Arg>

  14. </Call>

  15.  
  16. <Call id="webappprovider" name="addAppProvider">

  17. <Arg>

  18. <New class="org.eclipse.jetty.deploy.providers.WebAppProvider">

  19. <Set name="monitoredDirName"><Property name="jetty.home" default="." />/webapps</Set>

  20. <Set name="defaultsDescriptor"><Property name="jetty.home" default="." />/etc/webdefault.xml</Set>

  21. <Set name="scanInterval">1</Set>

  22. <Set name="extractWars">true</Set>

  23. </New>

  24. </Arg>

  25. </Call>

  26. </New>

  27. </Arg>

  28. </Call>

  29. </Configure>

更多的细节将在“部署架构”中讲解。

部署架构

Jetty围绕一个可扩展的部署管理器架构构建,这个架构包括它内部的Web应用的生命周期。
为了让Jetty提供内容服务(静态或动态),你需要创建一个ContextHandler,并在适当的位置添加它到Jetty。在Jetty 7增加的可插拔的DeploymentManager使这个过程变得更加容易。Jetty发布中包含了DeploymentManager的例子,部署WAR文件并部署Jetty context.xml文件到Jetty。
DeploymentManager是webapp部署机制的核心;它包含一个应用生命周期图(Application LifeCycle Graph),应用提供者(Application Provider),和在图中的一组绑定。应用提供者负责发现和提供应用到应用生命周期图,图中的绑定用于控制部署过程。


 

应用提供者(Application Providers)

Jetty部署一个应用前,一个AppProvider标识这个APP,然后提供它到DeploymentManager。Jetty发布中主要的AppProvider是WebAppProvider。

应用生命周期图(Application LifeCycle Graph)

DeploymentManager的核心特征是应用生命周期图。

图的节点和边在Jetty中是预定义的,根据最通常的行为和状态发现,但它们并不是硬编码的,你能根据你的需要调整和添加它们。
新的应用在Undeployed节点进入这个图,然后java.lang.String DeploymentManager.requestAppGoal(App,String)方法推动他们通过整个图。

生命周期绑定(LifeCycle Bindings)

一组默认的AppLifeCycle.Bindings定义标准行为,并处理部署、启动、停止和卸载应用。你能写你自己的AppLifeCycle.Bindings,然后分配它们到应用生命周期图的任何地方。
你写的AppLifeCycle.Binding可以包括:
 1)验证进入的应用;
 2)阻止已知的被禁止的应用的部署;
 3)在一个协作的环境中,提交安装到应用审计服务;
 4)分发应用到在蔟(cluster)或云(cloud)中的其它节点;
 5)通知应用状态改变的owner/admin。
有四个默认的绑定:
 1)StandardDeployer:在合适的位置部署ContextHandler进入Jetty;
 2)StandardStarter:设置ContextHandler到started,开始接收输入请求;
 3)StandardStopper:停止ContextHandler,停止接收输入请求;
 4)StandardUndeployer:从Jetty中移除ContextHandler。

还有一个非标准的绑定,叫Debug Binding,用于debugging,它为通过应用生命周期的各种转换记录日志。

理解默认的WebAppProvider

WebAppProvider为WAR文件、文件夹或Jetty部署描述符XML文件提供部署。它支持热部署。
WebAppProvider的基本操作是为部署预扫描文件夹。在标准Jetty发布中,这被配置在${jetty.home}/etc/jetty-deploy.xml文件。


 
  1. <?xml version="1.0"?>

  2. <!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">

  3. <Configure id="Server" class="org.eclipse.jetty.server.Server">

  4.  
  5. <Call name="addBean">

  6. <Arg>

  7. <New id="DeploymentManager" class="org.eclipse.jetty.deploy.DeploymentManager">

  8. <Set name="contexts">

  9. <Ref refid="Contexts" />

  10. </Set>

  11. <Call id="webappprovider" name="addAppProvider">

  12. <Arg>

  13. <New class="org.eclipse.jetty.deploy.providers.WebAppProvider">

  14. <Set name="monitoredDirName"><Property name="jetty.home" default="." />/webapps</Set>

  15. <Set name="defaultsDescriptor"><Property name="jetty.home" default="." />/etc/webdefault.xml</Set>

  16. <Set name="scanInterval">1</Set>

  17. <Set name="extractWars">true</Set>

  18. </New>

  19. </Arg>

  20. </Call>

  21. </New>

  22. </Arg>

  23. </Call>

  24. </Configure>

上面的配置将创建一个DeploymentManager,并作为一个Server LifeCycle Bean。
 1)contexts
 一个HandlerContainer引用,通常在${jetty.home}/etc/jetty.xml文件中的id="Contexts"的项,是一个ContextHandlerCollection的实例。
 2)monitoredDirName
 一个指向文件夹的文件路径或者URL,用于扫描web应用。扫描按照下面的规则:
  (1)Base文件夹必须存在
  (2)隐藏文件("."开头的文件)被忽略
  (3)以".d"结尾的文件夹被忽略
  (4)通常的CVS文件夹"CVS"和"CVSROOT"被忽略
  (5)任何*.war文件被自动部署
  (6)任何*.xml文件被作为上下文描述符部署
  (7)当WAR文件和XML文件有相同的base那么,那么WAR文件不被部署,XML文件被认为配置和引用WAR文件
  (8)文件夹是可部署的
  (9)文件夹和WAR文件同名,文件夹不被部署,WAR文件被认为和文件夹相同并自动部署
  (10)文件夹和XML文件同名,文件夹不被部署,XML文件认为配置和引用文件夹
  (11)其它所有文件夹采用自动部署
  (12)如果自动部署被用,文件名root.war或者文件夹名root将部署到"/"上下文路径
 3)defaultsDescriptor
 指定默认的servlet web描述符供所有web应用使用。描述符的目的是在web应用自己的/WEB-INF/web.xml被应用前,为web应用提供共同的配置。Jetty发布中自带的${jetty.home}/etc/webdefault.xml控制JSP和默认servlets的配置。
 4)scanInterval
 monitoredDirName文件夹的扫描周期,单位秒,扫描包括:新的上下文需要部署,改变的上下文重部署,和移除的上下文卸载。
 5)extractWars
 如果参数为true,任何WAR或者zip文件在部署之前被先提取到一个临时的文件夹。如果在web应用中有未编译的JSP,这样做是很好的。
 6)parentLoaderPriority
 参数是一个布尔变量,选择标准Java parent first delegation被使用,或者servlet specification webapp classloading priority。后者是默认。

快速启动Webapps

Servlet的自动发现特征会使部署慢且不确定。web应用配置的自动发现在webapp的部署中是有用的,它允许通过指定jar文件来激活新的特征和框架。然而,为了部署,需要扫描一些jar包的内容,导致webapp启动时间延迟。
从Jetty的9.2.0.M0版本开始,增加了快速启动模块,允许webapp被预扫描和预配置。这意味着所有的扫面将在部署之前完成,所有需要部署的项都将在部署之前准备好。所有的配置都会被编码到一个有效的web.xml中,叫WEB-INF/quickstart-web.xml,quickstart-web.xml文件不仅包含所有的Servlets、Filters和Constraints,而且它也编码为所有发现的上下文参数:
 1)ServletContainerInitializers 
 2)HandlesTypes classes
 3)Taglib Descriptors
使用快速启动机制,jetty能完全绕过所有扫描和发现模型,快速启动一个webapp。

设置快速启动

为了使用宏快速启动,模块对jetty实例必须是可用的。在maven项目中仅需要添加一个在artifact ID为jetty-quickstart的依赖,或者使用下面的命令启动jetty发布版本:

	>java -jar $JETTY_HOME/start.jar --add-to-startd=quickstart

同时你部署的webapps需要是org.eclipse.jetty.quickstart.QuickStartWebApp的实例,而不是通常的org.eclipse.jetty.webapp.WebAppContext。如果你的web应用已经有一个webapps/myapp.xml文件,则你能简单的改变配置元素中的这个类,否则你需要创建一个如下的webapps/myapp.xml文件:


 
  1. <?xml version="1.0" encoding="ISO-8859-1"?>

  2. <!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">

  3. <Configure class="org.eclipse.jetty.quickstart.QuickStartWebApp">

  4. <Set name="war"><Property name="jetty.webapps" default="."/>/benchmark.war</Set>

  5. <Set name="contextPath">/benchmark</Set>

  6. <Set name="autoPreconfigure">true</Set>

  7. </Configure>

预配置web应用

如果QuickStateWebApp的方法setAutoPreconfigure(true)被调用(看上面myapp.xml的例子),那么webapp第一次部署时,一个WEB-INF/quickstart-web.xml文件将被产生,它包含了所有发现的配置。在接下来的部署中,所有的扫描将被跳过,quickstart-web.xml被直接用于配置web应用。
也可以通过手动的运行类org.eclipse.jetty.quickstart.PreconfigureQuickStartWar来预配置一个war文件,如下:

	>java -cp jetty-all-9.2.0.jar:servlet.jar org.eclipse.jetty.quickstart.PreconfigureQuickStartWar <myapp.war>

这将在第一次配置之前创建一个quickstart-web.xml文件。注意这也能是发现配置的好的调试工具。运行类似若不带参数可以看到运行它的其它选项。

用预编译JSP避免TLD扫描

预编译JSP是提高web应用启动时间的好方法,从jetty 9.2.0开始,apache Jasper JSP实现被使用,允许TLD扫描被略过。这可以通过增加一个上下文参数到web.xml文件做到(这可以通过使用Jetty Maven JSPC插件自动做到):


 
  1. <context-param>

  2. <param-name>org.eclipse.jetty.jsp.precompiled</param-name>

  3. <param-value>true</param-value>

  4. </context-param>

绕过start.jar

Jetty Start.jar是一个非常有力和灵活的机制,用于构造一个classpath和执行编码在jetty xml格式的配置。然而,这个机制在构造classpath时需要花费时间。start.jar可以通过使用-dry-run选项绕过start.jar机制:


 
  1. >RUN=$(java -jar $JETTY_HOME/start.jar --dry-run)

  2. >eval $RUN