目錄:
- 什麼是 servlet 容器?
- 如何使用 servlet 容器?
- 安裝和啟動 Tomcat
- 在 Tomcat 中部署應用程序
- 使用 HTTPS 而不是 HTTP
- 生成證書
- 配置服務器
- 動態生成 HTML 頁面
- Tomcat 的替代品
什麼是 servlet 容器?
它是一個在服務器上運行的程序,可以與我們創建的 servlet 進行交互。換句話說,如果我們要在服務器上運行我們的Web應用程序,我們首先部署一個servlet容器,然後將servlets放入其中。工作流程很簡單:當客戶端訪問服務器時,容器處理它的請求,確定應該由哪個 servlet 處理它,然後傳遞請求。如何使用 servlet 容器?
除了路由請求之外,servlet 容器還執行其他功能:- 它從 JSP 文件動態生成 HTML 頁面。
- 它加密/解密 HTTPS 消息。
- 它為 servlet 管理提供受限訪問。
安裝和啟動 Tomcat
-
要安裝 Tomcat,只需將下載的存檔文件解壓縮到所需目錄即可。
-
請注意,Tomcat 需要 Java 版本 8 或更高版本才能啟動和運行。驗證 JAVA_HOME 環境變量是否引用了 JDK 的當前版本。
-
接下來,您需要配置用戶對 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"/>
現在一切準備就緒!
-
在 bin 文件夾中,運行 startup.bat 文件(Linux 上為 startup.sh)。
-
幾秒鐘後,在瀏覽器中打開鏈接http://localhost:8080/ 。您將看到一個圖形儀表板:
如果您看到這樣的菜單,則說明 Tomcat 正在運行。
-
如果沒有運行,請手動檢查 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 文件 -> 選擇“包含在項目構建中”旁邊的複選框 -> 單擊“確定”。 讓我們使用 Ctrl+F9 組合鍵構建項目。現在我們的 WAR 文件在目標目錄中 該文件可以重命名為更簡單的名稱,例如 servlet.war,並移動到更方便的地方,例如 C:\\my\\。我們會把它放在一個容器裡。有兩種方法可以做到這一點。
-
使用圖形界面
為此,請點擊此鏈接:http://localhost:8080/manager/html。Tomcat 應該要求輸入用戶名和密碼。
如果你跟著我到這里為止,那麼用戶名是“user”,密碼是“password”。
成功登錄後,您將看到 Tomcat Web 應用程序管理器。“應用程序”部分已經包含 5 個應用程序 — 這些是 Tomcat 實用程序,它們使 Tomcat 更易於使用。將來可以刪除它們。
下面是“部署”部分。在這裡您可以選擇要部署的 WAR 存檔。讓我們手動輸入路徑和上下文:
點擊“部署”,我們看到我們的應用程序已經出現在“應用程序”部分:
使用 Tomcat 的圖形界面,我們可以停止、重新啟動和刪除會話,以及設置會話長度。部署時,我們指定了 /demo 上下文,這意味著我們的應用程序是使用http://localhost:8080/demo訪問的。核實。一切都應該工作。 -
通過文件系統
要以這種方式部署應用程序,您需要打開解壓Tomcat 的目錄。然後轉到“webapps”文件夾。在這裡您會找到我們已經遇到的實用程序:
我們所需要的只是將我們的 servlet.war 文件移到這裡。
我們等待幾秒鐘,然後看到一個新的“servlet”文件夾出現了。這意味著我們的應用程序已部署。轉到位於http://localhost:8080/manager/ 的應用程序管理器界面。在這裡我們看到我們的應用程序部署在 /servlet 上下文中:
以這種方式部署時,會根據部署的 WAR 文件的名稱自動分配上下文。要更改上下文,您可以重命名新創建的包含應用程序的文件夾,但在此之前您需要刪除 WAR 文件。否則,Tomcat 將使用存檔名稱重新部署應用程序。
如您所見,在 Tomcat 中部署應用程序比看起來容易得多。但它的其他功能也很容易使用。讓我們檢查。
使用 HTTPS 而不是 HTTP
如果您還記得,我們在另一篇文章中研究了 HTTP 和 HTTPS 之間的區別。HTTPS 是與 HTTP 相同的協議,但它對傳輸的數據進行加密。在客戶端,瀏覽器負責加密,但我們必須在服務器端提供加密。由於 Tomcat 接受並路由 HTTP 請求,因此將加密委託給它是有意義的。 為此,我們必須:- 生成自簽名證書
- 進行額外的服務器設置
生成證書
無論版本如何,JDK 都包含大量實用程序。其中之一是keytool。這是一個用於生成和使用加密密鑰的工具。要使用它,請在命令行上轉到C:\\Program Files\\Java\\jdk1.8.0_181\\bin目錄並運行命令keytool -genkey -alias tomcat -keyalg RSA。- keytool——我們使用命令行選項運行的實用程序的名稱
- -genkey — 表示我們要生成一個新密鑰
- -alias tomcat — 創建密鑰別名
- -keyalg RSA — 選擇 RSA 作為密鑰生成算法
配置服務器
現在證書已準備就緒,我們需要調整服務器設置,即 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 的替代品
-
GlassFish是一個開源容器,其開發由 Oracle 支持。
與 Tomcat 不同,它是一個成熟的 Web 服務器,除了 servlet 之外,它還可以與 JavaEE 框架中的其他組件一起運行。也就是說,它使用了更多的內存。微調服務器時具有更大的靈活性,這使它的使用變得複雜。在 JavaEE 框架上開發應用程序時應該使用它。
-
WildFly以前稱為JBoss。它也是開源的。它由紅帽開發。更改名稱是為了避免與公司的另一個產品——JBoss 企業應用程序平台混淆。
與 GlassFish 一樣,WildFly 是一個成熟的 Web 服務器。順便說一下,在幕後,WildFly 使用 Tomcat 作為 servlet 容器。與 GlassFish 不同,WildFly 更輕巧且易於配置。
-
Jetty和前面的一樣,是開源的。它由 Eclipse 開發。
與 Tomcat 一樣,它是一個簡單的 servlet 容器,不支持 JavaEE 框架的所有組件。同時,它更輕巧,甚至可以在手機上運行。它可以快速啟動和停止並且可以很好地擴展。與 Tomcat 不同,它具有較小的社區和知識庫。
-
WebLogic是許可軟件,必須在使用前購買。它屬於甲骨文。
它比 Tomcat 具有更廣泛的功能。它可以與 FTP 協議一起工作。但是在開發和測試應用程序時就沒有那麼靈活了。
-
WebSphere(準確的說是WebSphere Application Server)是付費軟件。它由 IBM 開發。類似於 WildFly 和 GlassFish,它是一個完整的應用服務器。但配置界面更友好,運行可靠性高。
它的缺點是資源佔用大,啟停時間長,開發小項目時不太方便。
GO TO FULL VERSION