JavaRush /Java Blog /Random-TW /第 6 部分:Servlet 容器

第 6 部分:Servlet 容器

在 Random-TW 群組發布
本資料是「企業發展概論」系列的一部分。上一篇文章: 第 6 部分:Servlet 容器 - 1在上一篇文章中,我們熟悉了 servlet 並了解如何在它們的幫助下建立 Web 應用程式。現在是時候仔細看看如果沒有 Servlet 容器,這個假期就不可能實現。

內容:

什麼是servlet容器

這是一個在伺服器上運行的程序,可以與我們創建的 servlet 進行互動。換句話說,如果我們想在伺服器上運行 Web 應用程序,我們首先部署一個 servlet 容器,然後將 servlet 放入其中。它的工作方式很簡單:當客戶端聯繫伺服器時,容器處理他的請求,確定哪個 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 的存取。這是在 tomcat-users.xml 檔案中完成的,該檔案位於 conf 資料夾中。

    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_HOME - 必須引用 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(); } }
索引Servlet:
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 可以為我們做這些骯髒的工作,並將我們的專案單獨包裝在一個戰爭檔案中。為此,您需要開啟專案結構(Ctrl + Shift + Alt + S) - >工件 - >選擇所需的brew - >選取「包含在專案建置中」旁邊的方塊 - >按一下「確定」。 第 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 所需的實用程式應用程式。它們將來可以被刪除。

    第 6 部分:Servlet 容器 - 6

    下面是部署部分。使用它,您可以選擇要部署的戰爭檔案。讓我們手動輸入路徑和上下文:

    第 6 部分:Servlet 容器 - 7

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

    第 6 部分:Servlet 容器 - 8 使用 Tomcat GUI,我們可以停止它、重新啟動它、設定會話長度並刪除它。部署時,我們指定了上下文 /demo,這意味著必須透過連結http://localhost:8080/demo存取我們的應用程式。檢查一下,一切都應該正常。

  2. 透過檔案系統

    透過這種方式部署應用程序,需要開啟Tomcat解壓縮後的目錄,進入webapps。以下是我們熟悉的實用應用程式:

    第 6 部分:Servlet 容器 - 9

    我們需要做的就是將 servlet.war 移到這裡。

    我們等待幾秒鐘,我們看到出現了一個新的 servlet 資料夾,這意味著我們的應用程式已部署。讓我們轉到熟悉的應用程式管理員介面 - http://localhost:8080/manager/。在這裡我們看到我們的應用程式部署在 /servlet 上下文:

    第 6 部分.Servlet 容器 - 10

    以這種方式部署時,上下文會自動指派給已部署的 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\{使用者名稱}\.keystore),並在其中建立了一個 tomcat 金鑰。我們產生了一個大多數瀏覽器都會接受的簡單憑證。此證書不適合商業應用:它只能用於測試目的。在生產伺服器上,您必須使用憑證授權單位的憑證(例如https://letsencrypt.org/)。

設定伺服器

現在憑證已準備就緒,您需要調整伺服器設置,即 SSL 連接器。這是在 server.xml 檔案中完成的,該檔案位於apache-tomcat-9.0.30/conf/中。我們發現這樣的塊:
<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 程式碼。你想像過嗎?好消息是類似的東西存在,壞消息是它並不完全存在。如果你還沒猜到,我們正在談論JSP(Java Server Pages)技術。簡而言之,這是一種允許您將 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 的更多資訊。事實上...我們不是為了這個,而是為了 servlet 容器!JSP跟它有什麼關係呢?很簡單:JAVA 程式碼從 JSP 到 HTML 程式碼的轉換是由 servlet 容器執行的。當 servlet 即將返回 JSP 內容作為回應時,容器會注意到並先將其轉換為瀏覽器可讀的 HTML 頁面,然後再將該內容傳送到用戶端。如今,JSP 技術有許多類似的技術 - Thymeleaf、FreeMarket、Mustache 等。它們都遵循相似的原理。選擇哪一個來工作是品味問題。這也適用於選擇 servlet 容器。在範例中,我們使用最常見的容器 Tomcat,但有些項目使用其他容器。有必要簡單地熟悉一下最受歡迎的,並看看它們與 Tomcat 的區別。

Tomcat 的替代品

  1. GlassFish是 Oracle 支援的開源容器。

    與 Tomcat 不同,它是一個成熟的 Web 伺服器,除了 servlet 之外,還可以操作 JavaEE 框架中的其他元件。同時,它使用更多的記憶體。微調伺服器時更加靈活,這使得使用起來更加困難。使用 JavaEE 框架開發應用程式時值得使用。

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

    WildFly 與 GlassFish 一樣,都是成熟的 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容器或應用伺服器取決於特定的項目。在有些項目中,即使是一個明顯的局外人也能夠以最高的品質證明自己,但首先最好徹底理解一件事。Tomcat 可能是最理想的選擇。我們已經踏出了研究它的第一步,接下來就取決於你了!在「企業開發入門」系列的最後一篇文章中,我們將熟悉MVC模式。 第 7 部分. MVC 模式(模型-視圖-控制器)簡介 第 8 部分. 在 spring-boot 中編寫一個小應用程序
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION