【Jetty 入门实战】传统的安装运行和基本的 API 使用方法

946 阅读3分钟

文章首发于公众号【大数据学徒】,感兴趣请搜索 dashujuxuetu 或者文末扫码关注。

最近在工作和学习过程中都遇到了 Jetty,绕不过去,我逐渐感到即使工作和技术栈是立足在大数据方面,还是有必要熟悉甚至是精通一些 Web 开发的知识、常用的框架等等,因此本文是我 Jetty 入门的第一课,内容是 Jetty 的安装运行和基本的 API 使用方法,接下来应该还有更多与 Jetty 相关的文章。

Jetty 是一个基于 Java 的、轻量级的、扩展性强的 web 服务器和 servlet 引擎,对于 HTTP、HTTP/2 和 WebSocket 等协议的实现做到了高吞吐量和低延迟,易用性和兼容性俱佳。Jetty 作为一个现代的、全异步的 web 服务器,既可以直接在应用中内嵌,也可以使用传统的 webapp 部署方式。


内容提要:

  1. 环境说明
  2. 安装 Jetty
  3. 运行 Jetty
  4. 常用配置
    • home 目录和 base 目录
    • 修改端口
    • 其它配置项
  5. 基本的 API 使用方法
    • 创建项目
    • 最简单的 Server
    • 稍微复杂一点的 Server
  6. 总结

本文代码已经上传至 github:github.com/iamabug/jet…

1. 环境说明

操作系统:不限

JDK:1.8

IDE:IntelliJ IDEA

Jetty 版本:9.4

2. 安装 Jetty

下载并解压 Jetty 的压缩包:

# 下载解压并进入目录
$ wget https://repo1.maven.org/maven2/org/eclipse/jetty/jetty-distribution/9.4.24.v20191120/jetty-distribution-9.4.24.v20191120.tar.gz
$ tar xvf jetty-distribution-9.4.24.v20191120.tar.gz
$ cd jetty-distribution-9.4.24.v20191120

目录下各个文件和目录的作用如下表:

文件或目录 作用
bin 存放Unix 系统上用的 shell 脚本
demo-base 存放一些 webapp 的 demo
etc 存放Jetty XML 配置文件
lib 存放 Jetty 运行依赖的 Jar 包
logs 存放请求日志
modules 存放模块定义
resources 存放额外资源,通过配置激活使用
start.ini 用于添加命令行的额外参数
start.jar 启动 Jetty 的 Jar 包
webapps 默认配置下运行的 webapp

3. 运行 Jetty

运行 Jetty 的命令为:

java -jar start.jar

打开浏览器访问:http://localhost:8080,会发现是个 404:

这是因为启动目录下面部署任何 webapp。Ctrl + C 停止,然后切换到 demo-base 目录:

cd demo-base
java -jar 

再访问 http://localhost:8080,应该会看到如下页面:

可以随便点点这些链接,看看有哪些 demo,感受一下。

4. 常用配置

home 目录和 base 目录

Jetty 的 home 目录指的是 Jetty 的安装目录,就是我们上面下载解压的那个路径,存放了 start.jar 和 依赖库,是 Jetty 能够正常运行。home目录最好不要做任何修改

Jetty 的 base 目录是存放了特定的 webapp 和 ini 配置文件的目录,是一个具体的应用程序的目录,默认是当前目录,为什么上面切换到 demo-base 目录运行起来的页面就有很多东西呢,就是因为 demo-base 目录下有各种必要的目录、配置文件和 webapp,查看一下 demo-base 目录下的内容:

这两个目录可以通过 JETTY_HOMEJETTY_BASE 环境变量指定,一般的使用方式是在 JETTY_BASE 目录下执行 JETTY_HOME 目录下的 start.jar ,像这样:

# 需要先指定 JETTY_HOME 和 JETTY_BASE
$ cd $JETTY_BASE
$ java -jar $JETTY_HOME/start.jar

也可以以这样的方式:

java -jar start.java jetty.base=/some/path

修改端口

这是一个最常见的需求,做法如下:

$ cd $JETTY_BASE
$ java -jar $JETTY_HOME/start.jar jetty.http.port=8081

其它的配置项

还有很多其它的配置项,可以通过下面的方式查看:

$ java -jar $JETTY_HOME/start.jar --help

5. API 的基本使用方法

上面介绍的是传统的部署方式,灵活性不够,所以 Jetty 还提供了另外一种开发方式,就是嵌入式开发(和单片机、ARM 等都没关系!),其实很简单,就是作为一个普通的 HTTP 模块,直接在应用代码中通过 Jetty 的 API 来启动 Jetty 服务器,下面来实操一波:

创建项目

在 IDEA 中创建一个 maven 项目,pom.xml 中添加依赖:

<dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-server</artifactId>
    <version>9.4.23.v20191118</version>
</dependency>

最简单的 Server

创建一个最简单的 Jetty 服务器只需要三行代码:

public class DummyServer {
    public static void main(String[] args) throws Exception{
        Server server = new Server(8080);
        server.start();
        server.join();
    }
}

运行然后访问 8080 端口:

不出意外,是个 404,因为我们没有让这个 Server 做任何事。

稍微复杂一点的 Server

我认为初学者不理解原理也没有关系,先熟悉套路,让代码跑起来比较重要,原理可以在有必要的时候再研究。

Jetty 服务器添加处理请求逻辑的方法是添加 Handler,下面我们通过添加一个简单的 HelloHandler 使得能够在浏览器中显示被访问的 URI 和被访问次数HelloHandler 类如下所示:

public class HelloHandler extends AbstractHandler {

  	// 统计处理的请求储量
    private int count;
    public HelloHandler() {
        count = 0;
    }
    public void handle(String s, Request request, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws IOException, ServletException {
        // 设置响应的内容类型
        httpServletResponse.setContentType("text/html; charset=utf-8");
        // 设置响应的状态码
        httpServletResponse.setStatus(HttpServletResponse.SC_OK);
        // 构造响应内容
        PrintWriter out = httpServletResponse.getWriter();
        out.println("<h1>被访问URI: " + s + " </h1>");
        out.println("<h1>被访问次数: " + count++ + "</h1>");
        // 该请求已处理完毕
        request.setHandled(true);
    }
}

创建一个新的 HelloServer

public class HelloServer {

    public static void main(String[] args) throws Exception{
        Server server = new Server(8080);
        // 为 Server 添加了一个 handler,处理所有的请求
        server.setHandler(new HelloHandler());
        server.start();
        server.join();
    }
}

在浏览器中访问 http://localhost:8080

在 URL 后面加上 /test

被访问的URI 和次数都发生了变化,说明 HelloHandler 确实按照期望的方式处理了请求。

6. 总结

在本文中,我们分别体验了使用 Jetty 的安装包启动 Jetty 服务器以及使用 Jetty API 来编写 Jetty 服务器两种方法,对 Jetty 有了初步的认识,在后续的文章中我们将更深入的学习 Jetty。

欢迎交流讨论,吐槽建议,分享收藏。

勤学似春起之苗,不见其增,日有所长 辍学如磨刀之石,不见其损,日有所亏 关注【大数据学徒】,用技术干货助你日有所长

大数据学徒