1.1 什麼是Jetty Jetty是一個提供HHTP伺服器、HTTP用戶端和javax.servlet容器的開源項目。 這個入門教程分為五個部分: 第一部分部分重點介紹如何使用Jetty,它提供如下資訊,如什麼是Jetty,從哪可以下載它,怎麼在像Maven一樣的倉庫中找到它。這一部分同樣會提供啟動Jetty和如何配置Jetty的快速入門。 第二部分從更細緻的方面介紹Jetty的配置,介紹怎麼用Jetty來部署一個web應用程式,怎麼配置容器和串連,以及如何?SSL和其它安全措施。 Jetty的管理員應該關注第三部分。從啟動Jetty容器開始到session管理,日誌記錄,HTTP/2支援和Jetty最佳化,這一章節將協助Jetty管理員獲得更多關於Jetty服務以外的知識,這一章節同樣包含容器最常用的特性配置如JNDI和JMX。 針對使用Jetty的進階使用者,第四部分著重於Jetty的開發,本章節的重點是如何將Jetty嵌入一個已經存在的應用程式中。這部分包含幾個簡單的例子和操作Jetty架構的指南。這一部分同樣包含如何使用Jetty的maven外掛程式以及Jetty調試。 最後一個部分是引用部分,也包含Jetty的架構資訊,Jetty的XML文法介紹,以及常見問題的解析,這章也介紹如何參與Jetty社區,如何貢獻代碼,以及如何尋求協助。
1.2 如何選擇Jetty的版本 Jetty9是Jetty的最近一個版本且比之前的版本有很大的改進,其中一個改進是Jetty所有特性已經體現在Jetty9的文檔裡。所以對於很多使用Jetty老版本的使用者,我們建議使用Jetty9,我們也表示將會在接下來的幾年裡積極維護這一個版本。
表格1.1Jetty版本
版本
Year
Home
JVM
協議
Servlet
JSP
狀態
9.3
2015
Eclipse
1.8
HTTP/1.1 (RFC 7230), HTTP/2 (RFC 7540),
WebSocket (RFC 6455, JSR 356), FastCGI
3.1
2.3
穩定版本
9.2
2014
Eclipse
1.7
HTTP/1.1 RFC2616, javax.websocket, SPDY v3
3.1
2.3
穩定版本
8
2009-
Eclipse/Codehaus
1.6
HTTP/1.1 RFC2616, WebSocket RFC 6455, SPDY v3
3.0
2.2
珍貴版本
7
2008-
Eclipse/Codehaus
1.5
HTTP/1.1 RFC2616, WebSocket RFC 6455, SPDY v3
2.5
2.1
珍貴版本
6
2006-2010
Codehaus
1.4-1.5
HTTP/1.1 RFC2616
2.5
2.0
已經作廢
5
2003-2009
Sourceforge
1.2-1.5
HTTP/1.1 RFC2616
2.4
2.0
已經作廢
4
2001-2006
Sourceforge
1.2, J2ME
HTTP/1.1 RFC2616
2.3
1.2
遠古時期
3
1999-2002
Sourceforge
1.2
HTTP/1.1 RFC2068
2.2
1.1
石器時代
2
1998-2000
Mortbay
1.1
HTTP/1.0 RFC1945
2.1
1.0
傳說層級
1
1995-1998
Mortbay
1.0
HTTP/1.0 RFC1945
-
-
神話層級
1.3 Jetty 和Java EE Web規範 Jetty實現的Java EE規範主要是Servlet規範,最新的Java EE平台介紹了一個新的Web 規範,建議開發人員只需要大部分技術中的一部分即可。然而Jetty沒有實現Web 規範中所有的技術,Jetty設計為一個容器,可以使用外掛程式自由擴充想要的功能。 1.3.1 Java EE 7 Web規範 在Java EE7的規範中,更新了一些重要的功能以及添加了一些新的: 表格1.2 JavaEE7 Web Profile
JSR
名稱
jetty-9.1.x是否包含
支援外掛程式
JSR 340
Servlet Specification API 3.1
Yes
JSR 344
Java Server Faces 2.2 (JSF)
No
Yes, Mojarra or MyFaces
JSR 245 / JSR 341
Java Server Pages 2.3/Java Expression Language 3.0 (JSP/EL)
Yes
Yes
JSR 52
Java Standard Tag Library 1.2 (JSTL)
Yes
Yes
JSR 45
Debugging Support for Other Languages 1.0
Yes (via JSP)
Yes (via JSP)
JSR 346
Contexts and Dependency Injection for the
JavaEE Platform 1.1 (Web Beans)
No
Yes, Weld
JSR 330
Dependency Injection for Java 1.0
No
Yes as part of a CDI implementation, Weld
JSR 316
Managed Beans 1.0
No
Yes, as part of another technology
JSR 345
Enterprise JavaBeans 3.2 Lite
No
JSR 338
Java Persistance 2.1 (JPA)
No
Yes, eg Hibernate
JSR 250
Common Annotations for the Java Platform 1.2
Yes
Partially (for non-core Servlet Spec annotations)
JSR 907
Java Transaction API 1.2 (JTA)
Yes
Yes
JSR 349
Bean Validation 1.1
No
Yes as part of another technology eg JSF, or
a stand-alone implementation such as Hiberate Validator
JSR 339
Java API for RESTful Web Services 2.0 (JAX-RS)
No
JSR 356
Java API for Websocket 1.0
Yes
No
JSR 353
Java API for JSON Processing 1.0 (JSON-P)
No
Yes, eg JSON-P reference implementation
JSR 318
Interceptors 1.2
No
Yes as part of a CDI implementation
1.3.2 Jetty EE 6 Web Profile
下面介紹JavaEE6 Web Profile,以及與Jetty的關係
表格 1.3. Java EE 6 Web Profile
JSR
Name
Included with jetty-9.0.x
Pluggable
JSR 315
Servlet Specification API 3.0
Yes
JSR 314
JavaServer Faces 2.0 (JSF)
No
Yes, for example, Mojarra or MyFaces
JSR 245
JavaServer Pages 2.2/Java Expression
Language 2.2 (JSP/EL)
Yes
Yes
JSR 52
Java Standard Tag Library 1.2 (JSTL)
Yes
Yes
JSR 45
Debugging Support for Other Languages 1.0
Yes (via JSP)
Yes (via JSP)
JSR 299
Contexts and Dependency Injection for
the Java EE Platform 1.0 (Web Beans)
No
Yes, Weld or OpenWebBeans
JSR 330
Dependency Injection for Java 1.0
No
Yes as part of a CDI implementation, Weld
JSR 316
Managed Beans 1.0
No
Yes, as part of another technology.
JSR 318
Enterprise JavaBeans 3.1
No
Yes, OpenEJB
JSR 317
Java Persistance 2.0 (JPA)
No
Yes, Hibernate
JSR 250
Common Annotations for the Java Platform
Yes
Partially (for non-core Servlet Spec annotations)
JSR 907
Java Transaction API (JTA)
Yes
Implementations are pluggable, such as Atomikos, JOTM,
Jencks (Geronimo Transaction Manager)
JSR 303
Bean Validation 1.0
No
Yes as part of another technology (JSF), or a stand-alone
implementation such as Hiberate Validator
1.4 在Maven中擷取Jetty 1.4.1 Maven座標 Jetty從一開始就已經存在於Maven中心了,所以Maven的座標在最近幾年也發生了變化,當Jetty基於SourceForge管理時Maven的groupId是org.mortbay.jetty,當Jetty 7來到eclipse後groupId也改變了。 Jetty的POM座標如下
1.4.2 在Maven中心的更新日誌
Jetty不同版本的更新日誌記錄在一個叫做VERSIONS.txt的檔案中,也可以在Maven中心找到,座標如下
二、Jetty的使用
你可以通過多種方式將Jetty植入使用的程式中,在不同的系統中使用它,或者做為一個獨立的伺服器來使用,這一節介紹了後者,即作為一個單獨的伺服器來部署web應用。 2.1 下載Jetty 2.1.1 下載Jetty項目 Jetty的下載網頁為:https://www.eclipse.org/jetty/download.html 如果jdk環境支援盡量使用最新版本,將下載後的解壓放在使用的位置,以後章節將使用JETTY_HOME或者 $(jetty.home)來代表Jetty的存放路徑。 2.1.2 Jetty工程簡介 Jetty所有頂級目錄簡介:
表格 2.1. Contents
Location
Description
license-eplv10-aslv20.html
Jetty的許可檔案
README.txt
有用的開始資訊
VERSION.txt
版本資訊
bin/
存放在Unix系統下啟動並執行shell指令碼
demo-base/
一個可運行包含樣本web應用的Jetty伺服器基目錄
etc/
Jetty的設定檔
lib/
Jetty運行所必須的jar檔案
logs/
日誌
modules/
各個模組
notice.html
許可資訊等
resources/
包含新增到classpath設定檔夾,如log4j.properties
start.ini
存放啟動資訊
start.jar
運行Jetty的jar
webapps/
一個用來存放運行在預設配置下的Jetty Web應用目錄
2.2 運行Jetty 執行以下代碼,Jetty會在預設8080連接埠運行
cd $JETTY_HOMEjava -jar start.jar
若執行成功會輸出以下資訊
2015-06-04 10:50:44.806:INFO::main: Logging initialized @334ms2015-06-04 10:50:44.858:WARN:oejs.HomeBaseWarning:main: This instance of Jetty is not running from a separate {jetty.base} directory, this is not recommended. See documentation at http://www.eclipse.org/jetty/documentation/current/startup.html2015-06-04 10:50:44.995:INFO:oejs.Server:main: jetty-9.3.0.v201506012015-06-04 10:50:45.012:INFO:oejdp.ScanningAppProvider:main: Deployment monitor [file:///opt/jetty-distribution-9.3.0.v20150601/webapps/] at interval 12015-06-04 10:50:45.030:INFO:oejs.ServerConnector:main: Started ServerConnector@19dfb72a{HTTP/1.1,[http/1.1]}{0.0.0.0:8080}2015-06-04 10:50:45.030:INFO:oejs.Server:main: Started @558ms
你可以通過瀏覽器訪問http://localhost:8080.。然而在 JETTYHOME/webapps目錄下並沒有部<