【Jetty 入門實戰】傳統的安裝運行和基本的 API 使用方法

文章首發於公衆號【大數據學徒】,感興趣請搜索 dashujuxuetu 或者文末掃碼關注。html

最近在工做和學習過程當中都遇到了 Jetty,繞不過去,我逐漸感到即便工做和技術棧是立足在大數據方面,仍是有必要熟悉甚至是精通一些 Web 開發的知識、經常使用的框架等等,所以本文是我 Jetty 入門的第一課,內容是 Jetty 的安裝運行和基本的 API 使用方法,接下來應該還有更多與 Jetty 相關的文章。java

Jetty 是一個基於 Java 的、輕量級的、擴展性強的 web 服務器和 servlet 引擎,對於 HTTP、HTTP/2 和 WebSocket 等協議的實現作到了高吞吐量和低延遲,易用性和兼容性俱佳。Jetty 做爲一個現代的、全異步的 web 服務器,既能夠直接在應用中內嵌,也可使用傳統的 webapp 部署方式。git


內容提要:github

  1. 環境說明
  2. 安裝 Jetty
  3. 運行 Jetty
  4. 經常使用配置
    • home 目錄和 base 目錄
    • 修改端口
    • 其它配置項
  5. 基本的 API 使用方法
    • 建立項目
    • 最簡單的 Server
    • 稍微複雜一點的 Server
  6. 總結

本文代碼已經上傳至 github:github.com/iamabug/jet…web

1. 環境說明

操做系統:不限shell

JDK:1.8瀏覽器

IDE:IntelliJ IDEAbash

Jetty 版本:9.4服務器

2. 安裝 Jetty

下載並解壓 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

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。

歡迎交流討論,吐槽建議,分享收藏。

勤學似春起之苗,不見其增,日有所長
輟學如磨刀之石,不見其損,日有所虧
關注【大數據學徒】,用技術乾貨助你日有所長

大數據學徒
相關文章
相關標籤/搜索