上一節講述了怎么配置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源文件。
在傳統的webserver中。這個值叫做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屬性文件里讀取username和證書。
為了配置一個匹配上面的“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部署配置上下文的描寫敘述符。