Java使用Jetty實現嵌入式Web伺服器及Servlet容器

来源:https://www.cnblogs.com/bfchengnuo/archive/2017/12/27/8128035.html
-Advertisement-
Play Games

首先來介紹下 Jetty,根據 wiki 的介紹: Jetty 是一個純粹的基於 Java 的網頁伺服器和 Java Servlet 容器。儘管網頁伺服器通常用來為人們呈現文檔, 但是 Jetty 通常在較大的軟體框架中用於電腦與電腦之間的通信。 Jetty 作為 Eclipse 基金會的一部分 ...


首先來介紹下 Jetty,根據 wiki 的介紹:

Jetty 是一個純粹的基於 Java 的網頁伺服器和 Java Servlet 容器。儘管網頁伺服器通常用來為人們呈現文檔,但是 Jetty 通常在較大的軟體框架中用於電腦與電腦之間的通信。

Jetty 作為 Eclipse 基金會的一部分,是一個自由和開源項目。該網頁伺服器被用在 Apache ActiveMQ、Alfresco、Apache Geronimo、Apache Maven、Google App Engine、Eclipse、FUSE 等產品上。

Jetty 也是 Lift、Eucalyptus、Red5、Hadoop、I2P 等開源項目的伺服器。Jetty 支持最新的 Java Servlet API(帶 JSP 的支持),支持 SPDY 和 WebSocket 協議。

2016年,Jetty 的代碼主倉庫已經遷移到了 Github ,但是其仍然處於 Eclipse IP Process 政策下開發。

Jetty 在嵌入式的 Java 應用程式中提供 Web 服務,其已經是 Eclipse IDE 中的一個組成部分。它支持 AJP、JASPI、JMX、JNDI、OSGi、WebSocket 和其他的 Java 技術。

Apache Hadoop 是 Jetty 應用在框架中的典型範例。 Hadoop 在幾個模塊中使用Jetty作為 Web 伺服器

總結一下:

Jetty 是一個 Java 實現的開源的 servlet 容器,它既可以像 Tomcat 一樣作為一個完整的 Web 伺服器和 Servlet 容器,同時也可以嵌入在 Java 應用程式中,在 Java 程式中調用 Jetty

因為它的“輕量級”,在不是很複雜的小項目中是個不錯的選擇,啟動(載入)也非常的快速

下麵主要看下 Jetty 在嵌入式的 Java 應用程式中的應用

載入靜態頁面

導入依賴就不說了,Jetty 本身就是通過 jar 包的方式分發,或者可以使用 Maven 來構建:

<dependency>
  <groupId>org.eclipse.jetty</groupId>
  <artifactId>jetty-servlet</artifactId>
  <version>9.2.1.v20140609</version>
</dependency>

當然 Servlet 相關的那些依賴不要忘了加入,然後是 Java 代碼入口:

public static void main(String[] args) throws Exception {
  Server server = new Server(8080);

  ResourceHandler resourceHandler = new ResourceHandler();
  resourceHandler.setResourceBase("D:/test");
  // 可顯示目錄結構,類似 FTP
  resourceHandler.setDirectoriesListed(true); 

  server.setHandler(resourceHandler);
  server.start();
} 

運行 Java 程式,Jetty 伺服器就會啟動了,在瀏覽器中就可以訪問了,但是這種方式只能訪問靜態頁面,不支持 Servlet/JSP

實現Servlet容器(外部)

Java 代碼主入口:

public static void main(String[] args) throws Exception {  
  Server server = new Server(8080);
  
  WebAppContext webapp = new WebAppContext();
  webapp.setResourceBase("E:/apache-tomcat-7.0.47/webapps/test");
  // 也可以通過設置 war 包的方式
  // webapp.setWar("C:/TVPlay.war");
  
  server.setHandler(webapp);
  server.start();
}

就是設置一個 Java Web 應用程式的目錄就可以了,這種是使用外部文件(地址)的方式

運行內部編寫的Servlet

很多時候是我們需要寫幾個 Servlet,犯不著建個 web 工程,這時候用 Jetty 來嵌入一個伺服器最合適不過了,主入口:

public static void main(String[] args) throws Exception {
  Server server = new Server(8080);

  ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
  // Or ServletContextHandler.NO_SESSIONS
  context.setContextPath("/");
  server.setHandler(context);

  // http://localhost:8080/hello
  context.addServlet(new ServletHolder(new HelloServlet()), "/hello");
  // http://localhost:8080/hello/Kerronex
  context.addServlet(new ServletHolder(new HelloServlet("Hello Kerronex!")), "/hello/Kerronex");

  server.start();
  server.join();
}

具體對應的 Servlet 我就不貼了,很簡單的 doGet 測試下就可以了~~

打包後直接用命令 java -jar xxx.jar 允許就可以啦

關於join

如果 server 沒有起來,這裡面 join() 函數起到的作用就是使線程阻塞, 這裡 join() 函數實質上調用的 jetty 的線程池( 這裡和 Thread 中的 join 函數相似 )

如果沒有 join 函數,jetty 伺服器也能正常啟動或運行正常,是因為 jetty 比較小,啟動速度非常快

然而如果你的 application 比較重的話, 調用 join 函數,能夠保證你的 server 真正的起來(也就是說在 jetty start 之前 join 方法都是阻塞狀態,避免 JVM 退出)

其他

TODO:使用 Jetty 構建 web 項目

需要使用插件及相關依賴:

<dependency>
  <groupId>org.eclipse.jetty</groupId>
  <artifactId>jetty-websocket</artifactId>
  <version>8.1.11.v20130520</version>
</dependency>
<dependency>
  <groupId>org.eclipse.jetty</groupId>
  <artifactId>jetty-webapp</artifactId>
  <version>8.1.11.v20130520</version>
</dependency>
<!-- jetty -->
<dependency>
  <groupId>org.eclipse.jetty</groupId>
  <artifactId>jetty-server</artifactId>
  <version>8.1.11.v20130520</version>
</dependency>


<build>
  <plugins>
    <plugin>
      <groupId>org.eclipse.jetty</groupId>
      <artifactId>jetty-maven-plugin</artifactId>
      <version>9.3.7.v20160115</version>
      <configuration>
        <webApp>
          <contextPath>/</contextPath>
        </webApp>
        <scanIntervalSeconds>3</scanIntervalSeconds>
        <scanTargetPatterns>
          <scanTargetPattern>
            <directory>src/main/webapp</directory> 
            <includes>
              <include>**/*.xml</include>
              <include>**/*.properties</include>
            </includes>
          </scanTargetPattern>
        </scanTargetPatterns>
        <webAppConfig>
          <defaultsDescriptor>src/main/resource/webdefault222.xml</defaultsDescriptor>
        </webAppConfig>
        <connectors>
          <connector implementation="org.eclipse.jetty.server.nio.SelectChannelConnector">
            <port>8010</port>
            <maxIdleTime>400000</maxIdleTime>
          </connector>
        </connectors>
      </configuration>
    </plugin>
    </plugins>
</build>

相關命令:

mvn jetty:run

mvn -Djetty.http.port=9999 jetty:run

參見:

https://www.zhihu.com/question/52433013

http://www.blogjava.net/fancydeepin/archive/2015/06/23/maven-jetty-plugin.html

http://blog.csdn.net/tomato__/article/details/37927813


單獨下載的 Jetty 的 jar 包就可以單獨運行,也是使用 Java -jar 命令


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、無所不在的連接 針對不通的使用場景,無線網路技術有很多種。 鑒於無線網路技術如此多樣,籠統地概括所有無線網路的性能優化手段是不可能的。好在大多數無線技術的原理都是相通的,衡量性能的指標和約束條件也具有普遍實用性。只要把影響無線性能的基本原理搞清楚,那其他問題自然也就迎刃而解了。 二、無線網路的性 ...
  • 1、安裝jdk 2、安裝解壓zookeeper 先創建文件夾 解壓zookeeper壓縮包 3、 創建配置文件zoo.cfg 4、運行測試 ...
  • JEEPlatform 一款企業信息化開發基礎平臺,可以用於快速構建企業後臺管理系統,集成了OA(辦公自動化)、SCM(供應鏈系統)、ERP(企業資源管理系統)、CMS(內容管理系統)、CRM(客戶關係管理系統)等企業系統的通用業務功能。Github鏈接:https://github.com/u01 ...
  • 咖啡店需要做一個訂單系統,以合乎飲料供應要求。 1.最初是這樣設計的: 每一種飲料都需要繼承該抽象類,並覆寫cost()方法。 2.但是購買咖啡時需要考慮到調料的部分,每種咖啡會加不同種的調料,比如蒸奶、豆漿、摩卡或者覆蓋奶泡,那麼訂單系統需要考慮加入不同調料後的價格。因此需要實現不同的子類來定義添 ...
  • In Campaign mode, you can check your strategies on already defeated bases. You will not lose your troops.在戰役模式中,你能查看已被打敗的玩家的塔防策略,而且你不會損失任何戰鬥單位。Let's w ...
  • JAVA中的異常類都繼承自Throwable類,也就是說,這是異常類的根。Throwable類擴展了兩個類Error類和Exception類,Exception類又擴展了一個RuntimeException類。如下圖: Error:稱為錯誤,由Java虛擬機生成並拋出,這類錯誤一般是運行時系統內部的 ...
  • 題目大意:每個人有兩種值Di和Pi,從n個人中選m個人組成集合J,D(J)和P(J)為這m個人的Di與Pi和,使|D(J) - P(J)|最小。若有多個集合J最小,則使D(J) + P(J) 最大。 1<=n<=200, 1<=m<=20 ,Di和Pi最大為20. 註意到Di和Pi的和很小,我們可以 ...
  • 章節:enote筆記法的思考 why enote筆記法: key1)大腦喜歡顏色。 我們的大腦天生就喜歡顏色、對顏色很敏感,這是由我們人類過去的演化歷程決定的。 你可以理解為,文字有了顏色,讓這個冰冷的黑白世界突然有了色彩,變得絢麗多彩、色彩斑斕,充滿溫暖的暖意了起來,這使得讓你能更容易專註起來&保 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...