首页 > 其他 > 详细

Jetty学习三:配置概览-需要配置什么

时间:2014-06-04 13:19:42      阅读:583      评论:0      收藏:0      [点我收藏+]

上一节讲述了怎么配置Jetty,这节将告诉你使用Jetty你需要配置些什么。

配置Server

Server实例是Jetty服务端的中心协调对象,它为所有其他Jetty服务端组件提供服务和生命周期管理。在标准Jetty发布中,核心的服务端配置是在etc/jetty.xml文件中,你也能在其中包含其他服务端配置,可以包括:
 1)ThreadPool
 Server实例提供了一个线程池,你可以在etc/jetty.xml中配置最大线程数和最小线程数。
 2)Handlers
 Jetty服务端只能有一个Handler实例处理HTTP请求。然而一个handler可以是一个容器或者是其它多个handler的包装,这些handler可以形成一棵树,通常是树的一个分支的根到叶子节点的所有handler协作处理一个请求。默认的handler树设置在etc/jetty.xml文件中,包含一个Context Handler集合和默认Handler。Context Handler集合通过上下文路径和部署Context Handler和Web Application Context的路径选择下一个handler。默认Handler处理其它handler不处理的请求和产生404页面的请求。其它一些配置文件可以添加handler到handler树(例如:jetty-rewrite.xml、jetty-requestlog.xml)或者配置组件到热部署handler(例如:jetty-deploy.xml)。
 3)Server Attributes
 server拥有一个字符串和对象的map,以供其它Jetty组件能把指定的对象和server联系在一起,如果这些对象实现了LifeCycle接口,他们将和server一起开始和停止。
 4)Server fields
 server也有一些特性的配置域,在etc/jetty.xml中设置,用于控制其它事情中,HTTP响应的日期和版本。
 5)Connectors
 Server拥有一个connector的集合,用于接收HTTP和Jetty支持的其它协议的连接。
 6)Services
 server能拥有额外的服务对象,有时作为attributes,但更多是作为LifeCycle beans。例如Login Services和DataSources,你在server级配置,然后注入它们到web应用使用它们。

配置Connectors

Jetty Server Connector是一个网络终端,用于接收一个或多个协议发起的连接,这个协议为Jetty Server产生请求和/或消息。在标准Jetty Server发布版本中,支持多种协议和协议的融合:jetty-http.xml,jetty-https.xml和jetty-spdy.xml。你通常需要配置:
 1)Port
 连接器监听的TCP/IP端口,对应属性jetty.port(或者jetty.tls.port),如果没有发现,则使用默认值8080(TLS默认为8443).
 2)Host
 你能配置主机作为主机名或者IP地址。如果不设置,或者设置为0.0.0.0,连接器将监听所有本地接口。对应属性jetty.host。
 3)Idle Timeout
 连接处于空闲状态达到这个时间,连接将被连接器关闭,单位毫秒。
 4)HTTP Configuration
 HTTP配置。标准Jetty Server发布版本在jetty.xml文件中创建了一个HttpConfiguration,能在连接器文件中通过XML Ref元素使用。
 5)SSL Context Factory
 如果使用TLS连接器类型(HTTPS和SPDY),需要配置SSL Context Factory,用于获取服务端认证信息。

配置上下文

Jetty上下文是一个处理器,一个上下文尅包含标准Jetty处理器或者自定义应用处理器。所有上下文都需要配置:
 1)contextPath
 contextPath是URL前缀,用于标识一个HTTP请求对应的上下文。例如,如果一个上下文有一个上下文路径/foo,它处理请求:/foo、/foo/index.html、/foo/bar/,和/foo/image.png,但是它不处理请求:/、/other/,或者/favicon.ico。上下文路径为/的上下文被叫做根上下文。
 上下文能通过部署器默认设置(用文件名作为上下文路径的基础);或者通过编码设置;或者通过Jetty IoC XML设置,这个可以通过部署器或者在标准web app上下文的WEB-INF/jetty-web.xml文件中配置。
 2)virtualHost
 上下文可以有一个或者多个虚拟主机设置,虚拟主机不需要设置任何网络参数,相当于都应一个IP地址的服务的别名,一个服务可以有多个别名。有虚拟主机的上下文只会处理请求头中有匹配这个虚拟主机的请求。
 3)classPath
 上下文可以设置classPath。标准web应用通过 WEB-INF/lib和WEB-INF/classes文件夹指定classpath,并且可以附加关于委派类加载到付clasloader的规则。
 4)attributes
 属性是任意命名的对象,与一个上下文联系在一起,被频繁用于在一个web应用和他的container之间传输实体。例如属性javax.servlet.context.tempdir被用于传输为web应用分配的临时文件夹的File实例。
 5)resourceBase
 resource base是一个文件夹(或文件夹集合或URL),包含上下文的静态资源。可以是图片和HTML文件,或者JSP源文件。在传统的web服务器中,这个值叫做docroot。

通过API配置上下文

你能直接调用ContextHandler来配置上下文,如下:

package org.eclipse.jetty.embedded;
 
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.ContextHandler;
 
public class OneContext {
 
    public static void main(String[] args) throws Exception {
        Server server = new Server(8080);
        ContextHandler context = new ContextHandler();
        context.setContextPath("/");
        context.setResourceBase(".");
        context.setClassLoader(Thread.currentThread().getContextClassLoader());
        context.setHandler(new HelloHandler());
        server.setHandler(context);
        server.start();
        server.join();
    }
}

通过IoC XML配置上下文

部署器发现和热部署上下文IoC描述符,IoC XML的格式如下:

<?xml version="1.0"  encoding="UTF-8"?>
<!DOCTYPE Configure PUBLIC 
    "-//Mort Bay Consulting//DTD Configure//EN" 
    "http://www.eclipse.org/jetty/configure_9_0.dtd">
 
<!--
  Configure a custom context for serving javadoc as static resources 
-->
 
<Configure class="org.eclipse.jetty.server.handler.ContextHandler">
  <Set name="contextPath">/javadoc</Set>
  <Set name="resourceBase"><SystemProperty name="jetty.home" default="."/>/javadoc/</Set>
  <Set name="handler">
    <New class="org.eclipse.jetty.server.handler.ResourceHandler">
      <Set name="welcomeFiles">
        <Array type="String">
          <Item>index.html</Item>
        </Array>
      </Set>
      <Set name="cacheControl">max-age=3600,public</Set>
    </New>
  </Set>
</Configure>

配置Web应用

Jetty支持WAR文件和未打包的web应用作为一个指定的上下文,配置方法包括:
 1)采用标准布局,设置resourceBase位置(WAR的根目录)和初始化classpath为jar包放置在WEB-INF/lib,classes放置在WEB-INF/classes;
 2)标准WEB-INF/web.xml定义了配置初始化参数、过滤器、servlets、监听器、安全约束、欢迎文件和被注入的资源;
 3)默认web.xml(被Jetty提供,或者通过配置)配置JSP Servlet和处理静态内容的默认servlet。标准web.xml可以覆盖默认web.xml;
 4)在WEB-INF/lib中的jar包中的类可以使用注释定义附加的过滤器、servlet和监听器;
 5)在WEB-INF/lib中的jar包中的标准部署描述符片段可以定义附加的初始化参数、过滤器、servlet、监听器、安全约束、欢迎文件和被注入的资源;
 6)WEB-INF/jetty-web.xml(可选)可以包含Jetty IoC配置,用于配置上下文和处理器的Jetty指定API。

设置上下文路径

默认情况下,部署器设置上下文路径为:如果你部署一个WAR文件叫foobar.WAR,则上下文路径为/foobar;如果你部署一个WAR文件叫ROOT.WAR,上下文路径为/。Jetty也允许在WAR内部(WAR自己)或者外部(WAR的部署器)设置上下文路径。
为了设置上下文路径在WAR文件内,你能使用WEB-INF/jetty-web.xml文件设置上下文路径:

<?xml version="1.0"  encoding="UTF-8"?>
<!DOCTYPE Configure PUBLIC 
    "-//Mort Bay Consulting//DTD Configure//EN" 
    "http://www.eclipse.org/jetty/configure_9_0.dtd">
 
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
    <Set name="contextPath">/contextpath</Set>
</Configure>

或者你可以在WAR外部使用IoC文件设置,并在其中指定WAR文件:

<?xml version="1.0"  encoding="UTF-8"?>
<!DOCTYPE Configure PUBLIC 
    "-//Mort Bay Consulting//DTD Configure//EN" 
    "http://www.eclipse.org/jetty/configure_9_0.dtd">
 
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
  <Set name="war"><SystemProperty name="jetty.home" default="."/>/webapps/test.war</Set>
  <Set name="contextPath">/test</Set>
</Configure>

一个设置上下文路径的例子可以在 $JETTY_HOME/webapps/test.xml中看到。

设置鉴权域

标准web应用的鉴权方法和域名可以在web.xml中设置,如下:

...
<login-config>
  <auth-method>BASIC</auth-method>
  <realm-name>Test Realm</realm-name>
</login-config>
...

这个例子展示BASIC认证机制将被用于域名为“Test Realm”的域。然而标准没有形容域自身怎么被实现或者配置,在Jetty总,有几个域实现方式(叫做LoginServices),这些中最简单的是HashLoginService,从一个Java属性文件中读取用户名和证书。
为了配置一个匹配上面的“Test Realm”的HashLoginService实例,下面的$JETTY_HOME/etc/test-realm.xml IoC XML文件可以在命令行中指定,或者在start.ini中设置。

<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-" "http://www.eclipse.org/jetty/configure_9_0.dtd">
<Configure id="Server" class="org.eclipse.jetty.server.Server">
    <!-- =========================================================== -->
    <!-- Configure Authentication Login Service                      -->
    <!-- Realms may be configured for the entire server here, or     -->
    <!-- they can be configured for a specific web app in a context  -->
    <!-- configuration (see $(jetty.home)/webapps/test.xml for an    -->
    <!-- example).                                                   -->
    <!-- =========================================================== -->
    <Call name="addBean">
      <Arg>
        <New class="org.eclipse.jetty.security.HashLoginService">
          <Set name="name">Test Realm</Set>
          <Set name="config"><Property name="demo.realm" default="etc/realm.properties"/></Set>
          <Set name="refreshInterval">0</Set>
        </New>
      </Arg>
    </Call>
 
    <Get class="org.eclipse.jetty.util.log.Log" name="rootLogger">
      <Call name="warn"><Arg>demo test-realm is deployed. DO NOT USE IN PRODUCTION!</Arg></Call>
    </Get>
</Configure>

这创建和配置LoginService 作为一个服务端的聚合的bean。当一个web应用被部署为域名“Test Realm”时,为匹配Login Service,将在服务端beans中查找name为域名的bean。

Web应用部署

Jetty能部署多种Web应用格式,Jetty通过扫描${jetty.home}/webapps文件夹部署上下文信息。
Context能是下面的其中一种:
 1)标准WAR文件(扩展名必须是“.war”);
 2)包含一个展开的WAR文件的文件夹(必须包含{dir}/WEB-INF/web.xml文件);
 3)包含静态内容的文件夹;
 4)一个XML描述符,使用Jetty XML语法,并且配置了一个ContextHandler实例(例如一个WebAppContext)。
新的WebAppProvider在文件夹扫描过程中将尝试避免重复部署,使用下面的规则:
 1)隐藏文件(以“.”开头的文件)将被忽略;
 2)文件夹名称以".d"结尾的将被忽略;
 3)如果一个文件夹和和WAR文件有同样的base名称(例如:foo/和foo.war),那么文件夹将被认为是解压的WAR,并且仅WAR被部署(可以重用解压的文件夹);
 4)如果一个文件夹和XML文件有同样的base名称(例如:foo/和foo.xml),那么文件夹将被认为是解压的WAR,并且仅XML被部署(可以在它自己的配置中使用这个文件夹);
 5)如果一个WAR文件和XML文件同时存在(例如:foo.war和foo.xml),那么WAR被认为被XML文件配置,并且仅XML文件被部署。
一个Context是一个ContextHandler的实例,它集合了其它带有处理HTTP请求的资源的handlers(例如resource base,class loader,configuration attributes)。一个标准web应用是一个特定的上下文实例(叫做WebAppContext),使用标准布局和web.xml部署配置上下文的描述符。

Jetty学习三:配置概览-需要配置什么,布布扣,bubuko.com

Jetty学习三:配置概览-需要配置什么

原文:http://blog.csdn.net/liuy_98_1001/article/details/28251679

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!