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座標如下
<dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-project</artifactId> <version>${project.version}</version></dependency> 1.4.2 在Maven中心的更新日誌
Jetty不同版本的更新日誌記錄在一個叫做VERSIONS.txt的檔案中,也可以在Maven中心找到,座標如下
<dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-project</artifactId> <version>${project.version}</version> <classifier>version</classifier> <type>txt</type></dependency> 二、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目錄下並沒有部<