JavaRush /Java 博客 /Random-ZH /第 5 部分:Servlet,Java servlet API。编写一个简单的 Web 应用程序

第 5 部分:Servlet,Java servlet API。编写一个简单的 Web 应用程序

已在 Random-ZH 群组中发布
本材料是“企业发展概论”系列的一部分。上一篇文章: 第 5 部分:Servlet,Java servlet API。 编写一个简单的 Web 应用程序 - 1您是否已经知道如何编写将文本输出到控制台的 Java 应用程序,但仍然不知道如何创建您的第一个 Web 应用程序?太好了,让自己舒服点。在本文中,我们将熟悉 servlet 并编写一个应用程序,您可以向您的朋友展示该应用程序,而无需向他们发送 jarnik 或强迫他们下载 Java。让我们编写一个 Web 应用程序。如果您还不熟悉 Web 编程中使用的方法,我建议您从“企业开发简介”系列的第一篇文章开始阅读。

什么是 servlet

首先,让我们弄清楚什么是 servlet 以及为什么您经常听到它。 Java Servlet API是一种标准化 API,设计用于在服务器上实现并使用请求-响应方案与客户端配合使用。 Servlet是一个可以接收来自客户端的请求并向其返回响应的类。是的,Java 中的 servlet 正是构建客户端-服务器架构的元素。如果您还记得,我们已经在该系列的一篇文章中讨论过它。我们不要拐弯抹角:让我们立即编写一些代码。

创建 Web 应用程序需要什么

为了在 Java 中轻松使用 servlet,您将需要 Intellij IDEA Ultimate Edition。它是付费的,但您可以激活 30 天的试用期或使用早期访问版本 - 它始终免费。还要安装我们的应用程序服务器 - Apache Tomcat。Tomcat 是一个 servlet 容器:它处理来自外部的传入请求并将它们传递到我们的应用程序。您可以从此链接下载 Tomcat 。

创建第一个 Web 应用程序

如果一切准备就绪,让我们创建一个 Maven 项目。如果你对Maven不熟悉,可以关注之前的文章。让我们开始吧!
  1. 在pom.xml中,添加javax.servlet-api依赖并设置打包war:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
       <modelVersion>4.0.0</modelVersion>
    
       <groupId>org.example</groupId>
       <artifactId>servlets</artifactId>
       <version>1.0-SNAPSHOT</version>
       <packaging>war</packaging>
    
       <dependencies>
           <dependency>
               <groupId>javax.servlet</groupId>
               <artifactId>javax.servlet-api</artifactId>
               <version>4.0.1</version>
           </dependency>
       </dependencies>
    </project>

    简单的servlet类:

    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;
    
    @WebServlet("/hello")
    public class MainServlet extends HttpServlet {
    
       @Override
       protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
           resp.setContentType("text/html");
           PrintWriter printWriter = resp.getWriter();
           printWriter.write("Hello!");
           printWriter.close();
       }
    }
  2. 要运行该应用程序,您需要创建 Tomcat 配置:

    第 5 部分:Servlet,Java servlet API。 编写一个简单的 Web 应用程序 - 2 第 5 部分:Servlet,Java servlet API。 编写一个简单的 Web 应用程序 - 3

  3. 接下来,我们指定要使用的 Tomcat 版本、访问服务器的 URL 以及端口。你应该得到这样的东西:

    第 5 部分:Servlet,Java servlet API。 编写一个简单的 Web 应用程序 - 4
  4. 剩下的就是指定将部署在容器中的工件(将项目组装到 jar 存档中)。您可以单击Fix按钮并选择warexploded:这意味着项目重建后,工件将自动放置在 servlet 容器中。 第 5 部分:Servlet,Java servlet API。 编写一个简单的 Web 应用程序 - 5

  5. 默认情况下,应用程序上下文设置为servlets_war_exploded,这意味着必须通过以下位置访问应用程序:http://localhost:8080/servlets_war_exploded

    为什么我们需要额外的文字?让我们删除不必要的东西。现在我们的应用程序地址是:http://localhost:8080

    第 5 部分:Servlet,Java servlet API。 编写一个简单的 Web 应用程序 - 6

  6. 单击“确定”。我们看到我们现在有机会启动该应用程序:

    第 5 部分:Servlet,Java servlet API。 编写一个简单的 Web 应用程序 - 7

    现在,当您启动应用程序时,浏览器应该打开并显示 404 错误。这是合乎逻辑的,因为在地址http://localhost:8080/处应该有一个具有“/”映射的 servlet,而我们唯一的 servlet 具有“/hello”映射。

  7. 我们通过http://localhost:8080/hello联系它并得到预期的响应 - 字符串“Hello”!

如果一切正常,让我们看一下代码。 要从常规类创建 http servlet,您需要从 HttpServlet 类继承它。在类上方,我们指定了 @WebServlet() 注释,在该注释中我们将 servlet 绑定(映射)到特定路径(“/hello”)。该注释仅出现在 Java Servlet API 3.0 中,因此 Internet 上有很多通过 XML 文件进行 Servlet 映射的示例。现在这没有必要了。为了处理 GET 请求,我们重写 doGet() 方法。请注意方法参数 - HttpServletRequest 和 HttpServletResponse。从 HttpServletRequest 对象中,我们可以获取有关请求的所有必要信息,在 HttpServletResponse 中,我们可以记录响应并设置必要的标头。

使用参数和会话

让我们改进 servlet,使其能够处理请求参数并使用会话:
import javax.servlet.ServletException;
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 ServletException, 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" + "<br>");
       } else {
           printWriter.write("Hello, " + username + "<br>");
       }
       printWriter.write("Page was visited " + visitCounter + " times.");
       printWriter.close();
   }
}
servlet 当前正在运行会话,每次访问页面时都会增加访问计数器。如果visitCounter属性尚未创建(第一次访问页面时),getAttribute()方法将返回null,因此您需要检查是否为null。请求参数也是如此。如果用户没有传递 username 参数,则其值为 null。在这种情况下,我们将以匿名方式问候该用户。GET 请求中传递参数需要使用路径变量,即需要访问http://localhost:8080/hello?username=Pavel链接。您可以在本系列的上一篇文章中阅读有关 http 请求的更多信息。现在我们的应用程序已经有了最少的逻辑,但是根路径中的 404 错误有点烦人。为了解决这个问题,我们创建另一个 servlet 并将其映射到初始页面 @WebServlet("/")。该 servlet 的工作是将请求重定向到“/hello”路径。有两种方法可以做到这一点:使用转发或重定向。也许值得了解它们之间的区别。 转发- 将请求处理委托给服务器上的另一个 servlet,客户端不参与。为此,您需要将以下代码添加到新 servlet 的 doGet() 方法中:
getServletContext().getRequestDispatcher("/hello").forward(req, resp);
在此代码中,我们访问 servlet 上下文,从中获取所需 servlet 的请求管理器,并要求它使用指定参数(req、resp)处理特定请求。 重定向-向客户端返回他需要联系以处理其请求的地址。大多数浏览器会自动转到传输的链接。要实现重定向,您需要添加以下代码:
resp.sendRedirect(req.getContextPath() + "/hello");
在HttpServletResponse中,我们调用redirect()方法并向其传递客户端需要联系的地址。一个重要的细节:http参数还必须添加在完整重定向路径的末尾,这不是很方便。在我们的情况下,最好使用转发,但碰巧使用重定向更好。如果您了解他们工作的差异,您的选择就不会出错。新 servlet 的代码如下所示:
import javax.servlet.ServletException;
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 ServletException, IOException {
//        getServletContext().getRequestDispatcher("/hello").forward(req, resp);
       resp.sendRedirect(req.getContextPath() + "/hello");
   }
}

底线

您的第一个 Web 应用程序已准备就绪。在下一篇文章中,您将学习如何在不使用 Intellij IDEA 的情况下部署它。我们编写了一个仅处理 GET 请求的应用程序。其余http方法的处理方式相同——重写父类相应的方法。使用此类简单的 servlet,您可以构建复杂、丰富的 Web 应用程序。当然,使用像Spring这样的大型框架,这更容易做到。但如果你确实想更详细地深入研究 servlet 的所有功能,你可以阅读官方规范第 6 部分. Servlet 容器 第 7 部分. MVC(模型-视图-控制器)模式简介 第 8 部分. 在 spring-boot 中编写一个小应用程序
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION