一、Servlet 概述

1.1 JavaWeb 三大核心组件

Servlet 是 JavaWeb 三大核心组件之首,是学习 JavaWeb 的基础,必须 100% 掌握:

  • Servlet:处理客户端请求(核心)
  • Filter(过滤器):拦截请求 / 响应(后续讲解)
  • Listener(监听器):监听 Web 容器事件(观察者模式,后续讲解)

1.2 Servlet 的核心作用

Servlet 翻译为「Server Let」(服务器小应用程序),核心作用是处理客户端 HTTP 请求

  • 客户端(浏览器)发送请求 → Tomcat 接收请求 → 匹配对应的 Servlet 处理请求 → Servlet 返回响应结果
  • 举例:登录请求由「登录 Servlet」处理,注册请求由「注册 Servlet」处理。

二、Servlet 初识(必须熟练)

2.1 第一个 Servlet 实现

2.1.1 Servlet 核心规则

Servlet 是运行在 Web 服务器(Tomcat)中的 Java 程序,需遵守两个核心规则:

  1. 必须实现 javax.servlet.Servlet 接口;
  2. 必须在 web.xml 中配置部署(Tomcat 才能找到自定义 Servlet)。
2.1.2 Servlet 接口核心方法

javax.servlet.Servlet 接口定义了 Servlet 的生命周期方法,核心方法如下:

2.1.3 手写第一个 Servlet(完整步骤)

package cn.tx.servlet;

import javax.servlet.*;
import java.io.IOException;

/**
 * 第一个Servlet实现类
 */
public class Servlet1 implements Servlet {
    // 初始化方法:仅调用1次
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("Servlet1 初始化完成!");
    }

    // 获取配置对象:需先保存init参数,此处简化返回null
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    // 核心处理方法:每次请求都会调用
    @Override
    public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
        // 设置响应编码,避免中文乱码
        response.setContentType("text/html;charset=UTF-8");
        // 向浏览器输出内容
        response.getWriter().write("Hello Servlet! 这是我的第一个Servlet程序");
        System.out.println("Servlet1 处理了一次请求!");
    }

    // 获取Servlet信息:基本不用
    @Override
    public String getServletInfo() {
        return "这是我的第一个Servlet,版本1.0";
    }

    // 销毁方法:仅Tomcat关闭时调用1次
    @Override
    public void destroy() {
        System.out.println("Servlet1 被销毁了!");
    }
}
步骤 2:配置 web.xml(核心)

WEB-INF/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_3_1.xsd"
         version="3.1">
    <!-- 注册Servlet -->
    <servlet>
        <!-- Servlet名称:自定义,需与mapping中一致 -->
        <servlet-name>hello</servlet-name>
        <!-- Servlet全类名:包名+类名 -->
        <servlet-class>cn.tx.servlet.Servlet1</servlet-class>
    </servlet>
    
    <!-- 映射访问路径 -->
    <servlet-mapping>
        <!-- 关联上面的Servlet名称 -->
        <servlet-name>hello</servlet-name>
        <!-- 访问路径:以/开头,自定义 -->
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
</web-app>
2.1.4 JavaWeb 请求响应流程(核心)

以请求 http://localhost:8080/servlet_pro/hello 为例:

  1. Tomcat 解析请求:找到 servlet_pro 项目 → 读取 web.xml
  2. 路径匹配:通过 /hello 找到对应的 <servlet-name>hello</servlet-name>
  3. 类名匹配:通过 hello 找到 <servlet-class>cn.tx.servlet.Servlet1</servlet-class>
  4. 实例化 Servlet:
    • 若内存中已有 Servlet 实例 → 直接调用 service() 处理请求;
    • 若没有 → 通过反射创建实例(存入 Servlet 池)→ 调用 init() 初始化 → 调用 service() 处理请求;
  5. 返回响应:Servlet 处理完成后,Tomcat 将结果返回给浏览器。

2.2 Servlet 生命周期(核心)

Servlet 的生命周期完全由 Tomcat 管理,核心阶段:

  1. 创建阶段:默认第一次访问 Servlet 时创建实例(可配置启动时创建),调用 init() 初始化(仅 1 次);
  2. 运行阶段:每次请求都调用 service() 处理(多次);
  3. 销毁阶段:Tomcat 关闭时调用 destroy() 销毁实例(仅 1 次)。

注意:自定义方法不会被 Tomcat 主动调用,需在生命周期方法(如 service)中手动调用。

三、HttpServlet(必须精通)

3.1 HttpServlet 介绍

实际开发中,我们几乎不会直接实现 Servlet 接口,而是继承 HttpServlet(专门处理 HTTP 请求),继承关系:Servlet(接口) → GenericServlet(抽象类) → HttpServlet(抽象类)

  • GenericServlet:实现了 Servlet 接口,简化了 init、destroy 等方法;
  • HttpServlet:继承 GenericServlet,封装了 HTTP 请求的处理逻辑(GET/POST 等)。

3.2 HTTP 请求方法

常用核心方法:

  • GET:查询数据(参数拼在 URL 后,长度有限,不安全);
  • POST:提交数据(参数在请求体中,长度无限制,更安全);其他方法(PUT/DELETE 等)几乎不用,了解即可。

3.3 实战:创建 HttpServlet

3.3.1 手动创建(推荐掌握)
步骤 1:编写 HttpServlet 子类
package cn.tx.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;

/**
 * 继承HttpServlet处理HTTP请求
 */
public class Servlet2 extends HttpServlet {
    // 处理GET请求
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        response.getWriter().write("这是GET请求的响应结果!");
    }

    // 处理POST请求
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // POST请求可复用GET逻辑,或单独编写
        doGet(request, response);
    }
}

步骤 2:配置 web.xml

<servlet>
    <servlet-name>hello2</servlet-name>
    <servlet-class>cn.tx.servlet.Servlet2</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>hello2</servlet-name>
    <url-pattern>/hello2</url-pattern>
</servlet-mapping>
3.3.2 IDEA 快捷创建(开发效率)
  1. 右键包名 → New → Servlet;
  2. 填写 Servlet 名称(如 Servlet2),自动生成类和基础方法;
  3. 补充 web.xml 映射路径(或使用注解 @WebServlet("/hello2") 替代配置)。
3.3.4 配置 Servlet 启动时创建

默认 Servlet 在第一次访问时创建,若需 Tomcat 启动时就创建,添加 <load-on-startup> 标签:

<servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>cn.tx.servlet.Servlet1</servlet-class>
    <!-- 启动时创建:值≥0即可,数字越小优先级越高 -->
    <load-on-startup>1</load-on-startup>
</servlet>
  • 取值规则:
    • ≥0:Tomcat 启动时创建,数字越小越先创建;
    • <0:默认值,第一次访问时创建。

四、核心总结

  1. Servlet 本质:运行在 Tomcat 中的 Java 程序,用于处理 HTTP 请求,生命周期完全由 Tomcat 管理;
  2. 核心流程:编写 Servlet 实现类 → 配置 web.xml(或注解)→ Tomcat 匹配路径 → 调用 service 方法处理请求;
  3. 开发规范:实际开发优先继承 HttpServlet,重写 doGet/doPost 方法,替代直接实现 Servlet 接口。

五、拓展提示

  1. Servlet3.0 + 支持注解配置(@WebServlet("/hello")),可替代 web.xml,简化开发;
  2. 处理请求时需注意中文乱码:GET 请求需配置 Tomcat 编码,POST 请求需设置 request.setCharacterEncoding("UTF-8")
  3. Servlet 是单例多线程,不要在 Servlet 中定义成员变量(线程不安全)。
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐