一、Jetty简介
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版本
版本YearHomeJVM协议ServletJSP状态
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
JSRNameIncluded with jetty-9.0.xPluggable
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坐标如下
org.eclipse.jetty
jetty-project
${project.version}
1.4.2 在Maven中心的更新日志
Jetty不同版本的更新日志记录在一个叫做VERSIONS.txt的文件中,也可以在Maven中心找到,坐标如下
org.eclipse.jetty
jetty-project
${project.version}
version
txt
二、Jetty的使用
你可以通过多种方式将Jetty植入使用的程序中,在不同的系统中使用它,或者做为一个独立的服务器来使用,这一节介绍了后者,即作为一个单独的服务器来部署web应用。
2.1 下载Jetty
2.1.1 下载Jetty项目
Jetty的下载网页为:
如果jdk环境支持尽量使用最新版本,将下载后的解压放在使用的位置,以后章节将使用JETTY_HOME或者 $(jetty.home)来代表Jetty的存放路径。
2.1.2 Jetty工程简介
Jetty所有顶级目录简介:
表格 2.1. Contents
LocationDescription
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_HOME
java -jar start.jar
若执行成功会输出以下信息
2015-06-04 10:50:44.806:INFO::main: Logging initialized @334ms
2015-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
2015-06-04 10:50:44.995:INFO:oejs.Server:main: jetty-9.3.0.v20150601
2015-06-04 10:50:45.012:INFO:oejdp.ScanningAppProvider:main: Deployment monitor 【 at interval 1
2015-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
你可以通过浏览器访问然而在$JETTY_HOME/webapps目录下并没有部署任何web应用,所以你将会看到一个Jetty提供的404错误页面,并不推荐在$JETTY_HOME下运行Jetty,而是建议运行一个Jetty基础应用。错误页面如下
2.2.1 基础应用例子
标准的Jetty应用,有一个demo-base的文件夹,可以不在$JETTY_HOME下运行Jetty,在demo-base文件夹下执行以下命令:
java -jar $JETTY_HOME/start.jar
成功运行将有如下信息输出:
2015-06-04 10:55:24.161:INFO::main: Logging initialized @308ms
2015-06-04 10:55:24.431:WARN::main: demo test-realm is deployed. DO NOT USE IN PRODUCTION!
2015-06-04 10:55:24.434:INFO:oejs.Server:main: jetty-9.3.0.v20150601
2015-06-04 10:55:24.457:INFO:oejdp.ScanningAppProvider:main: Deployment monitor 【 at interval 1
2015-06-04 10:55:24.826:INFO:oejsh.ContextHandler:main: Started o.e.j.w.WebAppContext@c038203{/,
2015-06-04 10:55:24.929:WARN::main: test-jaas webapp is deployed. DO NOT USE IN PRODUCTION!
2015-06-04 10:55:24.978:INFO:oejsh.ContextHandler:main: Started o.e.j.w.WebAppContext@46238e3f{/test-jaas,
2015-06-04 10:55:25.162:WARN::main: async-rest webapp is deployed. DO NOT USE IN PRODUCTION!
2015-06-04 10:55:25.208:INFO:oejsh.ContextHandler:main: Started o.e.j.w.WebAppContext@6b67034{/async-rest,【 jar:
2015-06-04 10:55:25.311:WARN::main: test-jndi webapp is deployed. DO NOT USE IN PRODUCTION!
2015-06-04 10:55:25.386:INFO:oejsh.ContextHandler:main: Started o.e.j.w.WebAppContext@8b96fde{/test-jndi,
2015-06-04 10:55:25.508:WARN::main: test-spec //代码效果参考:http://www.zidongmutanji.com/bxxx/113276.html
webapp is deployed. DO NOT USE IN PRODUCTION!2015-06-04 10:55:25.594:INFO:oejsh.ContextHandler:main: Started o.e.j.w.WebAppContext@69930714{/test-spec,【 jar:
2015-06-04 10:55:25.781:INFO:oejsh.ContextHandler:main: Started o.e.j.w.WebAppContext@3eb7fc54{/proxy,
2015-06-04 10:55:25.786:INFO:oejsh.ContextHandler:main: Started o.e.j.s.h.MovedContextHandler@59662a0b{/oldContextPath,null,AVAILABLE}
2015-06-04 10:55:25.951:WARN::main: test webapp is deployed. DO NOT USE IN PRODUCTION!
2015-06-04 10:55:26.248:INFO:oejsh.ContextHandler:main: Started o.e.j.w.WebAppContext@4f83df68{/test,
2015-06-04 10:55:26.255:INFO:oejs.ServerConnector:main: Started ServerConnector@5a9c4ad9{HTTP/1.1,【http/1.1】}{0.0.0.0:8080}
2015-06-04 10:55:26.259:INFO:oejus.SslContextFactory:main: x509={jetty.eclipse.org=jetty} wild={} alias=null for SslContextFactory@23941fb4()
2015-06-04 10:55:26.269:INFO:oejs.ServerConnector:main: Started ServerConnector@5d908d47{SSL,【ssl, http/1.1】}{0.0.0.0:8443}
2015-0