手写一个 servlet 并运行

如果大家觉得文章有错误内容,欢迎留言或者私信讨论~

  今天我们的任务就是会到当初初学 Web 容器的时候,编写简单的 servlet,并在 tomcat 中运行起来。
  主要的步骤有:

  1. 下载并安装 Tomcat
  2. 编写一个继承 HttpServlet 的 Java 类
  3. 将 Java 类文件编译成 Class 文件
  4. 建立 Web 应用的目录结构,并配置web.xml
  5. 部署 Web 应用
  6. 启动 Tomcat
  7. 浏览器访问验证结果
  8. 查看 Tomcat 日志

  下面让我们一步步来完成整个过程。

1. 下载并安装 Tomcat

  最新版本的 Tomcat 可以直接在官网上下载,根据你的操作系统下载相应的版本,这里我使用的是 Mac 系统,下载完成后直接解压,解压后的目录结构如下。
在这里插入图片描述

  下面简单介绍一下这些目录:

/bin:存放 Windows 或 Linux 平台上启动和关闭 Tomcat 的脚本文件。

/conf:存放 Tomcat 的各种全局配置文件,其中最重要的是server.xml。

/lib:存放 Tomcat 以及所有 Web 应用都可以访问的 JAR 文件。

/logs:存放 Tomcat 执行时产生的日志文件。

/work:存放 JSP 编译后产生的 Class 文件。

/webapps:Tomcat 的 Web 应用目录,默认情况下把 Web 应用放在这个目录下。

2. 编写一个继承 HTTPServlet 的 Java 类

  javax.servlet包提供了实现 Servlet 接口的 GenericServlet 抽象类。这是一个比较方便的类,可以通过扩展它来创建 Servlet。但是大多数的 Servlet 都在 HTTP 环境中处理请求,因此 Servlet 规范还提供了 HttpServlet 来扩展 GenericServlet 并且加入了 HTTP 特性。我们通过继承 HttpServlet 类来实现自己的 Servlet 只需要重写两个方法:doGet 和 doPost。

  因此今天我们创建一个 Java 类去继承 HttpServlet 类,并重写 doGet 和 doPost 方法。首先新建一个名为MyServlet.java的文件,敲入下面这些代码:

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * o(* ̄▽ ̄*)ブ)
 * Created by 小林 on 2022/9/28
 *
 * @Description:
 **/
public class MyServlet extends HttpServlet {
    
    

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        System.out.println("MyServlet 在处理get()请求...");
        PrintWriter out = resp.getWriter();
        resp.setContentType("text/html;charset=utf-8");
        out.println("My Servlet! ");
    }


    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        System.out.println("MyServlet 在处理post()请求...");
        PrintWriter out = resp.getWriter();
        resp.setContentType("text/html;charset=utf-8");
        out.println("My Servlet! ");
    }
    
}

  如果此时你发现没有引入 HttpServlet 等类,可以手动添加 Tomcat 的 servlet-api.jar 包,需要把 Tomcat lib 目录下的servlet-api.jar拷贝到当前目录下,或者像我一样直接在 pom.xml 文件中添加:

<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>

  这个 Servlet 完成的功能很简单,分别在 doGet 和 doPost 方法体里返回一段简单的 HTML。

3. 将 Java 文件编译成 Class 文件

  接着我们执行编译命令:

javac -cp ./servlet-api.jar MyServlet.java

  编译成功后你就可以得到一个叫 MyServlet.class 的文件了

4. 建立 Web 应用的目录结构

  之前我们提到 web 应用具有一定的目录结构,所以我们按照规定建立 web 应用文件夹,名字就叫 MyWebApp,就像下面这样:


MyWebApp/WEB-INF/web.xml
MyWebApp/WEB-INF/classes/MyServlet.class

  然后在web.xml中配置 Servlet,内容如下:


<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
  http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
  version="4.0"
  metadata-complete="true">

    <description> Servlet Example. </description>
    <display-name> MyServlet Example </display-name>
    <request-character-encoding>UTF-8</request-character-encoding>

    <servlet>
      <servlet-name>myServlet</servlet-name>
      <servlet-class>MyServlet</servlet-class>
    </servlet>

    <servlet-mapping>
      <servlet-name>myServlet</servlet-name>
      <url-pattern>/myservlet</url-pattern>
    </servlet-mapping>

</web-app>

  你可以看到在web.xml配置了 Servlet 的名字和具体的类,以及这个 Servlet 对应的 URL 路径。请你注意,servlet 和 servlet-mapping 这两个标签里的 servlet-name 要保持一致。

5. 部署 Web 应用

  Tomcat 应用的部署非常简单,将这个目录 MyWebApp 拷贝到 Tomcat 的安装目录下的 webapps 目录即可。

6. 启动 tomcat

  找到 Tomcat 安装目录下的 bin 目录,根据操作系统的不同,执行相应的启动脚本。如果是 Windows 系统,执行startup.bat.;如果是 Linux 系统,则执行startup.sh。

7.访问浏览器

  在浏览器里访问这个 URL:http://localhost:8080/MyWebApp/myservlet,你会看到:

My Servlet!

  这里需要注意,访问 URL 路径中的 MyWebApp 是 Web 应用的名字,myservlet是在web.xml里配置的 Servlet 的路径。

猜你喜欢

转载自blog.csdn.net/qq_43654226/article/details/127097061