一篇文章讲明白Jetty使用教程(一)——开始使用Jetty

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 一篇文章讲明白Jetty使用教程(一)——开始使用Jetty

一、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

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
缓存 分布式计算 API
Spark Netty与Jetty (源码阅读十一)
  spark呢,对Netty API又做了一层封装,那么Netty是什么呢~是个鬼。它基于NIO的服务端客户端框架,具体不再说了,下面开始。   创建了一个线程工厂,生成的线程都给定一个前缀名。      像一般的netty框架一样,创建Netty的EventLoopGroup:      在常用...
1093 0