
目录:
- 什么是 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 文件 -> 选择“包含在项目构建中”旁边的复选框 -> 单击“确定”。 

-
使用图形界面
为此,请点击此链接: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