文章首发于公众号【大数据学徒】,感兴趣请搜索 dashujuxuetu 或者文末扫码关注。
最近在工作和学习过程中都遇到了 Jetty,绕不过去,我逐渐感到即使工作和技术栈是立足在大数据方面,还是有必要熟悉甚至是精通一些 Web 开发的知识、常用的框架等等,因此本文是我 Jetty 入门的第一课,内容是 Jetty 的安装运行和基本的 API 使用方法,接下来应该还有更多与 Jetty 相关的文章。
Jetty 是一个基于 Java 的、轻量级的、扩展性强的 web 服务器和 servlet 引擎,对于 HTTP、HTTP/2 和 WebSocket 等协议的实现做到了高吞吐量和低延迟,易用性和兼容性俱佳。Jetty 作为一个现代的、全异步的 web 服务器,既可以直接在应用中内嵌,也可以使用传统的 webapp 部署方式。
内容提要:
- 环境说明
- 安装 Jetty
- 运行 Jetty
- 常用配置
- home 目录和 base 目录
- 修改端口
- 其它配置项
- 基本的 API 使用方法
- 创建项目
- 最简单的 Server
- 稍微复杂一点的 Server
- 总结
本文代码已经上传至 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_HOME
和 JETTY_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。
欢迎交流讨论,吐槽建议,分享收藏。
勤学似春起之苗,不见其增,日有所长 辍学如磨刀之石,不见其损,日有所亏 关注【大数据学徒】,用技术干货助你日有所长