CodeGym /Java Blog /Toto sisi /第 6 部分 Servlet 容器
John Squirrels
等級 41
San Francisco

第 6 部分 Servlet 容器

在 Toto sisi 群組發布
本資料是“企業發展概論”系列的一部分。往期文章: 第 6 部分。Servlet 容器 - 1在上一篇文章中,我們熟悉了 servlet 並了解瞭如何使用它們來創建 Web 應用程序。是時候仔細看看這個有趣的重要部分了:servlet 容器。

目錄:

什麼是 servlet 容器?

它是一個在服務器上運行的程序,可以與我們創建的 servlet 進行交互。換句話說,如果我們要在服務器上運行我們的Web應用程序,我們首先部署一個servlet容器,然後將servlets放入其中。工作流程很簡單:當客戶端訪問服務器時,容器處理它的請求,確定應該由哪個 servlet 處理它,然後傳遞請求。 第 6 部分。Servlet 容器 - 2

如何使用 servlet 容器?

除了路由請求之外,servlet 容器還執行其他功能:
  1. 它從 JSP 文件動態生成 HTML 頁面。
  2. 它加密/解密 HTTPS 消息。
  3. 它為 servlet 管理提供受限訪問。
總的來說,這一切聽起來都不錯。現在我們只需要弄清楚如何將其全部付諸實踐。好吧,要學習如何使用某些東西,只需潛入並嘗試使用它:) 所以,今天我們要練習!最流行的 servlet 容器是Apache Tomcat。它是開源的,可以免費使用。在此處下載適用於您的操作系統的 Tomcat ,我們將探索“實際”使用容器。

安裝和啟動 Tomcat

  1. 要安裝 Tomcat,只需將下載的存檔文件解壓縮到所需目錄即可。

  2. 請注意,Tomcat 需要 Java 版本 8 或更高版本才能啟動和運行。驗證 JAVA_HOME 環境變量是否引用了 JDK 的當前版本。

  3. 接下來,您需要配置用戶對 Tomcat 的訪問權限。這是在位於 conf 文件夾中的 tomcat-users.xml 文件中完成的。

    Tomcat中預設了四種角色:

    • manager-gui — 訪問圖形界面和狀態頁面
    • manager-script — 訪問文本界面和狀態頁面
    • manager-jmx — 訪問 JMX 和狀態頁面
    • manager-status — 僅訪問狀態頁面

    在 <tomcat-users> 標籤內,我們明確指定這些角色並將它們分配給我們的用戶:

    
    <role rolename="manager-gui"/>
    <role rolename="manager-script"/>
    <role rolename="manager-jmx"/>
    <role rolename="manager-status"/>
    <user username="user" password="password"
        roles="manager-gui, manager-script, manager-jmx, manager-status"/>
    

    現在一切準備就緒!

  4. 在 bin 文件夾中,運行 startup.bat 文件(Linux 上為 startup.sh)。

  5. 幾秒鐘後,在瀏覽器中打開鏈接http://localhost:8080/ 。您將看到一個圖形儀表板:

    第 6 部分。Servlet 容器 - 3

    如果您看到這樣的菜單,則說明 Tomcat 正在運行。

  6. 如果沒有運行,請手動檢查 JAVA_HOME 和 CATALINA_HOME 環境變量:

    • JAVA_HOME — 這必須引用當前版本的 Java 8+。
    • CATALINA_BASE — 這必須引用 Tomcat 或不存在(它不應引用另一個版本的 Tomcat)。

在 Tomcat 中部署應用程序

我們成功地啟動了 Tomcat,所以現在是時候在其中部署一些項目了。讓我們使用上一篇文章中的 servlet 。主服務小程序:

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/hello")
public class MainServlet extends HttpServlet {

   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
       HttpSession session = req.getSession();
       Integer visitCounter = (Integer) session.getAttribute("visitCounter");
       if (visitCounter == null) {
           visitCounter = 1;
       } else {
           visitCounter++;
       }
       session.setAttribute("visitCounter", visitCounter);
       String username = req.getParameter("username");
       resp.setContentType("text/html");
       PrintWriter printWriter = resp.getWriter();
       if (username == null) {
           printWriter.write("Hello, Anonymous" + "
"); } else { printWriter.write("Hello, " + username + "
"); } printWriter.write("Page was visited " + visitCounter + " times."); printWriter.close(); } }
索引服務小程序:

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/")
public class IndexServlet extends HttpServlet {

   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
       resp.sendRedirect(req.getContextPath() + "/hello");
   }
}
在部署之前,我們需要將我們的 servlet 打包到一個 WAR 文件中。Maven 通常用於執行此操作,但為了創建 WAR 文件,您需要一個包含所有 servlet 映射的 web.xml 文件。我們使用新的@WebServlet 註釋來編寫 servlet,因此我們沒有 web.xml 文件。幸運的是,IDEA 可以為我們做一些骯髒的工作,將我們的項目包裝在一個 WAR 文件中。為此,打開項目結構 (Ctrl+Shift+Alt+S) -> 工件 -> 選擇所需的 WAR 文件 -> 選擇“包含在項目構建中”旁邊的複選框 -> 單擊“確定”。 第 6 部分。Servlet 容器 - 4讓我們使用 Ctrl+F9 組合鍵構建項目。現在我們的 WAR 文件在目標目錄中 第 6 部分。Servlet 容器 - 5該文件可以重命名為更簡單的名稱,例如 servlet.war,並移動到更方便的地方,例如 C:\\my\\。我們會把它放在一個容器裡。有兩種方法可以做到這一點。
  1. 使用圖形界面

    為此,請點擊此鏈接:http://localhost:8080/manager/html。Tomcat 應該要求輸入用戶名和密碼。

    如果你跟著我到這里為止,那麼用戶名是“user”,密碼是“password”

    成功登錄後,您將看到 Tomcat Web 應用程序管理器。“應用程序”部分已經包含 5 個應用程序 — 這些是 Tomcat 實用程序,它們使 Tomcat 更易於使用。將來可以刪除它們。

    第 6 部分。Servlet 容器 - 6

    下面是“部署”部分。在這裡您可以選擇要部署的 WAR 存檔。讓我們手動輸入路徑和上下文:

    第 6 部分。Servlet 容器 - 7

    點擊“部署”,我們看到我們的應用程序已經出現在“應用程序”部分:

    第 6 部分。Servlet 容器 - 8使用 Tomcat 的圖形界面,我們可以停止、重新啟動和刪除會話,以及設置會話長度。部署時,我們指定了 /demo 上下文,這意味著我們的應用程序是使用http://localhost:8080/demo訪問的。核實。一切都應該工作。

  2. 通過文件系統

    要以這種方式部署應用程序,您需要打開解壓Tomcat 的目錄。然後轉到“webapps”文件夾。在這裡您會找到我們已經遇到的實用程序:

    第 6 部分。Servlet 容器 - 9

    我們所需要的只是將我們的 servlet.war 文件移到這裡。

    我們等待幾秒鐘,然後看到一個新的“servlet”文件夾出現了。這意味著我們的應用程序已部署。轉到位於http://localhost:8080/manager/ 的應用程序管理器界面。在這裡我們看到我們的應用程序部署在 /servlet 上下文中:

    第 6 部分。Servlet 容器 - 10

    以這種方式部署時,會根據部署的 WAR 文件的名稱自動分配上下文。要更改上下文,您可以重命名新創建的包含應用程序的文件夾,但在此之前您需要刪除 WAR 文件。否則,Tomcat 將使用存檔名稱重新部署應用程序。

    如您所見,在 Tomcat 中部署應用程序比看起來容易得多。但它的其他功能也很容易使用。讓我們檢查。

使用 HTTPS 而不是 HTTP

如果您還記得,我們​​在另一篇文章中研究了 HTTP 和 HTTPS 之間的區別。HTTPS 是與 HTTP 相同的協議,但它對傳輸的數據進行加密。在客戶端,瀏覽器負責加密,但我們必須在服務器端提供加密。由於 Tomcat 接受並路由 HTTP 請求,因此將加密委託給它是有意義的。 為此,我們必須:
  1. 生成自簽名證書
  2. 進行額外的服務器設置
讓我們練習這樣做。

生成證書

無論版本如何,JDK 都包含大量實用程序。其中之一是keytool。這是一個用於生成和使用加密密鑰的工具。要使用它,請在命令行上轉到C:\\Program Files\\Java\\jdk1.8.0_181\\bin目錄並運行命令keytool -genkey -alias tomcat -keyalg RSA
  • keytool——我們使用命令行選項運行的實用程序的名稱
  • -genkey — 表示我們要生成一個新密鑰
  • -alias tomcat — 創建密鑰別名
  • -keyalg RSA — 選擇 RSA 作為密鑰生成算法
執行命令後,該實用程序開始與我們對話: 第 6 部分。Servlet 容器 - 11輸入必要的信息。現在我們已經在我們的主目錄中創建了一個密鑰庫(對於 Windows,這是 C:\\Users\\{username}\\.keystore)和一個 tomcat 密鑰。我們生成了一個大多數瀏覽器都會抱怨的簡單證書。這樣的證書不適合商業應用:它只能用於測試目的。在生產服務器上,您需要使用證書頒發機構頒發的證書(例如https://letsencrypt.org/)。

配置服務器

現在證書已準備就緒,我們需要調整服務器設置,即 SSL 連接器。這是在位於apache-tomcat-9.0.30/conf/ 的server.xml 文件中完成的。在其中,我們找到這樣的塊:

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxThreads="150" SSLEnabled="true">
        <SSLHostConfig>
            <Certificate certificateKeystoreFile="conf/localhost-rsa.jks"
                         type="RSA" />
        </SSLHostConfig>
 </Connector>
我們將配置放在它們旁邊:

    <Connector
           protocol="org.apache.coyote.http11.Http11NioProtocol"
           port="8443" maxThreads="200"
           scheme="https" secure="true" SSLEnabled="true"
           keystoreFile="C:\Users\user\.keystore" keystorePass="mypass"
           clientAuth="false" sslProtocol="TLS"/>
我們將最新的值分配給 keystoreFile 和 keystorePass 參數,保存文件,然後使用 shutdown.bat 和 startup.bat 文件重新啟動 Tomcat。現在服務器已準備好處理 HTTPS 請求。地址略有變化:https://localhost:8443/demo/hello。當您單擊該鏈接時,您將收到有關證書可信度的警告,這並不奇怪。正如我們之前所說,您需要使用其中一個證書頒發機構的服務才能獲得普通證書。但是現在,我們已經實現了我們的目標:應用程序使用 HTTPS 協議運行,這很重要!

動態生成 HTML 頁面

現在我們將通過考慮另一個特性來繼續我們對 servlet 容器的概述:HTML 頁面的動態生成。想像一個完美的世界,您可以使用變量、循環、數組和其他語言結構編寫 Java 代碼,而不是枯燥的靜態 HTML 代碼。你能想像得到嗎?好消息是存在類似的東西。壞消息是它並沒有完全實現這種幻想。如果您沒有猜到,我們正在談論 JavaServer Pages (JSP)。簡而言之,這是一種允許您將 Java 代碼片段插入 HTML 頁面的技術。誠然,這段 Java 代碼在發送給客戶端之前仍會轉換為 HTML,但考慮到各種因素,該 HTML 將是動態生成的。例如,您可以使用條件語句並根據某些條件返回不同的內容。示例 JSP 頁面:

<%@ page language="java"" %>
<html>
<head>
<title>JSP</title>
</head>

<body>
<%
String firstName="name";
String secondName="surname";
    
    if (firstName.equals("name")){
      out.print("Hello: "+firstName+"<br>");
    }

    if (firstName.equals("name") && secondName.equals("surname"))
    {
      out.print("Hello, my dear friend! <br>");
    }
    else
    {
      out.print("I don't know you. Go away! <br>");
    }
%>
</body>
</html>
您可以在此處閱讀有關 JSP 的更多信息. 歸根結底,本文不是關於 JSP — 我們是來討論 servlet 容器的!那麼我們為什麼提到JSP呢?很簡單:servlet 容器將 Java 代碼從 JSP 轉換為 HTML。當 servlet 將返回 JSP 內容作為響應時,容器會注意到並首先將其轉換為瀏覽器友好的 HTML 頁面,然後再將此類內容髮送給客戶端。今天,有許多 JSP 技術的類似物——Thymeleaf、FreeMarket、Mustache 等。它們都以相似的方式工作。選擇哪一個用於您的工作是一個品味問題。這也適用於選擇 servlet 容器。在這些示例中,我們使用了最常見的容器 Tomcat,但有些項目使用其他容器。有必要簡要回顧一下最流行的並考慮它們與 Tomcat 的不同之處。

Tomcat 的替代品

  1. GlassFish是一個開源容器,其開發由 Oracle 支持。

    與 Tomcat 不同,它是一個成熟的 Web 服務器,除了 servlet 之外,它還可以與 JavaEE 框架中的其他組件一起運行。也就是說,它使用了更多的內存。微調服務器時具有更大的靈活性,這使它的使用變得複雜。在 JavaEE 框架上開發應用程序時應該使用它。

  2. WildFly以前稱為JBoss。它也是開源的。它由紅帽開發。更改名稱是為了避免與公司的另一個產品——JBoss 企業應用程序平台混淆。

    與 GlassFish 一樣,WildFly 是一個成熟的 Web 服務器。順便說一下,在幕後,WildFly 使用 Tomcat 作為 servlet 容器。與 GlassFish 不同,WildFly 更輕巧且易於配置。

  3. Jetty和前面的一樣,是開源的。它由 Eclipse 開發。

    與 Tomcat 一樣,它是一個簡單的 servlet 容器,不支持 JavaEE 框架的所有組件。同時,它更輕巧,甚至可以在手機上運行。它可以快速啟動和停止並且可以很好地擴展。與 Tomcat 不同,它具有較小的社區和知識庫。

  4. WebLogic是許可軟件,必須在使用前購買。它屬於甲骨文。

    它比 Tomcat 具有更廣泛的功能。它可以與 FTP 協議一起工作。但是在開發和測試應用程序時就沒有那麼靈活了。

  5. WebSphere(準確的說是WebSphere Application Server)是付費軟件。它由 IBM 開發。類似於 WildFly 和 GlassFish,它是一個完整的應用服務器。但配置界面更友好,運行可靠性高。

    它的缺點是資源佔用大,啟停時間長,開發小項目時不太方便。

正確的 servlet 容器或應用程序服務器的選擇取決於特定的項目。有些項目即使是一個明顯的失敗者也可能被證明是一個很好的選擇,但首先最好對一個 servlet 容器進行深入研究。Tomcat 可能是這項研究的完美候選者。我們已經邁出了研究它的第一步,但從這裡開始就取決於你了!在“企業開發入門”系列的最後幾篇文章中,我們將了解 MVC 模式。 第 7 部分。介紹 MVC(模型-視圖-控制器)模式
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION