CodeGym /Java 博客 /随机的 /第 6 部分 Servlet 容器
John Squirrels
第 41 级
San Francisco

第 6 部分 Servlet 容器

已在 随机的 群组中发布
本资料是“企业发展概论”系列的一部分。往期文章: 第 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