JavaRush /Java 博客 /Random-ZH /第 6 部分:Servlet 容器

第 6 部分:Servlet 容器

已在 Random-ZH 群组中发布
本材料是“企业发展概论”系列的一部分。上一篇文章: 第 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) -> Artifacts -> 选择所需的构建 -> 选中“包含在项目构建中”旁边的框 -> 单击“确定”。 第 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