文章首发于公众号【大数据学徒】,感兴趣请搜索 dashujuxuetu 或者文末扫码关注。html
最近在工做和学习过程当中都遇到了 Jetty,绕不过去,我逐渐感到即便工做和技术栈是立足在大数据方面,仍是有必要熟悉甚至是精通一些 Web 开发的知识、经常使用的框架等等,所以本文是我 Jetty 入门的第一课,内容是 Jetty 的安装运行和基本的 API 使用方法,接下来应该还有更多与 Jetty 相关的文章。java
Jetty 是一个基于 Java 的、轻量级的、扩展性强的 web 服务器和 servlet 引擎,对于 HTTP、HTTP/2 和 WebSocket 等协议的实现作到了高吞吐量和低延迟,易用性和兼容性俱佳。Jetty 做为一个现代的、全异步的 web 服务器,既能够直接在应用中内嵌,也可使用传统的 webapp 部署方式。git
内容提要:github
本文代码已经上传至 github:github.com/iamabug/jet…web
操做系统:不限shell
JDK:1.8浏览器
IDE:IntelliJ IDEAbash
Jetty 版本:9.4服务器
下载并解压 Jetty 的压缩包:app
# 下载解压并进入目录
$ 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 |
运行 Jetty 的命令为:
java -jar start.jar
复制代码
打开浏览器访问:http://localhost:8080
,会发现是个 404:
这是由于启动目录下面部署任何 webapp。Ctrl + C
中止,而后切换到 demo-base
目录:
cd demo-base
java -jar
复制代码
再访问 http://localhost:8080
,应该会看到以下页面:
能够随便点点这些连接,看看有哪些 demo,感觉一下。
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
复制代码
上面介绍的是传统的部署方式,灵活性不够,因此 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>
复制代码
建立一个最简单的 Jetty 服务器只须要三行代码:
public class DummyServer {
public static void main(String[] args) throws Exception{
Server server = new Server(8080);
server.start();
server.join();
}
}
复制代码
运行而后访问 8080 端口:
不出意外,是个 404,由于咱们没有让这个 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
确实按照指望的方式处理了请求。
在本文中,咱们分别体验了使用 Jetty 的安装包启动 Jetty 服务器以及使用 Jetty API 来编写 Jetty 服务器两种方法,对 Jetty 有了初步的认识,在后续的文章中咱们将更深刻的学习 Jetty。
欢迎交流讨论,吐槽建议,分享收藏。