文章首發於公衆號【大數據學徒】,感興趣請搜索 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。
歡迎交流討論,吐槽建議,分享收藏。