前端视角 Java Web 入门手册 4.2:Web 开发基础——Servlet API 与生命周期

Servlet 接口

Servlet 根接口定义了五个方法

java 复制代码
public interface Servlet {
    // 初始化 Servlet
    void init(ServletConfig config) throws ServletException;

    // 返回包含 Servlet 组件的初始化参数、ServletContext 等信息的 ServletConfig 对象
    ServletConfig getServletConfig();

    // 请求处理 & 响应
    void Service(ServletRequest req, ServletResponse res)
        throws ServletException, IOException;

    // 返回一个字符串,描述该组件的作用、用途等信息
    String getServletInfo();

    // Servlet 生命周期结束时调用
    void destroy();
}

Servlet 接口定义了一个最基本的 Servlet 组件,包括 init()、service()、destroy() 三个重要方法。尽管 Servlets 提供了在服务器端处理请求和生成响应的机制,但 Servlet API 是通用的,缺乏针对 HTTP 协议的优化和简化。这意味着开发者需要手动处理复杂的协议细节,例如解析请求方法、管理会话、处理 MIME 类型等。

HttpServlet

为了应对早期 Servlets 的局限性,HttpServlet 被引入作为 Servlet API 的一个子类,专门针对 HTTP 协议进行了优化和扩展。HttpServlet 提供了一系列简化开发 HTTP 基础 Web 应用的工具和方法,它抽象和封装了 HTTP 请求和响应的细节,使开发者能够更专注于业务逻辑,而无需关心协议的底层实现。

HttpServlet 提供了多个方法(如 doGetdoPostdoPutdoDelete 等),对应不同的 HTTP 请求方法。开发者只需重写这些方法来处理特定类型的请求,无需手动解析请求方法。

java 复制代码
public abstract class HttpServlet extends GenericServlet {
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) {}
    protected void doHead(HttpServletRequest req, HttpServletResponse resp) {}
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) {}
    protected void doPut(HttpServletRequest req, HttpServletResponse resp) {}
    protected void doDelete(HttpServletRequest req, HttpServletResponse resp) {}
    protected void doOptions(HttpServletRequest req, HttpServletResponse resp) {}
    protected void doTrace(HttpServletRequest req, HttpServletResponse resp) {}

    // 根据请求 HTTP method 类型调用对应的处理方法(doGet、doPost等)
    public void service(ServletRequest req, ServletResponse res) {}
}

HTTPServlet service 方法会根据请求 method 类型自动调用对应的处理方法,同时封装了 HTTP 请求(HTTPServletRequest)、响应(HTTPServletResponse)和会话(HTTPSession)对象

HTTPServletRequest

HTTPServletRequest 对象拓展了 ServletRequest 接口,封装了客户端 HTTP 请求的所有信息,提供了一系列方法来获取请求的相关信息

  • getMethod():获取 HTTP 请求方法(GET、POST 等)
  • getRequestURI() 和 getRequestURL():获取请求的 URI 和 URL
  • getParameter() 和 getParameterValues():获取请求参数和参数值
  • getHeader() 和 getHeaders():获取请求头信息
  • getInputStream() 和 getReader():获取请求主体的输入流和字符流
  • getRemoteAddr() 和 getRemotePort():获取客户端的 IP 地址和端口号
  • getSession() 和 getSession(boolean create):获取会话对象
  • getCookies():获取客户端发送的 Cookie
  • isSecure():判断请求是否使用 SSL 协议

HTTPServletResponse

HTTPServletResponse 对象拓展了 ServletResponse 对象,用于封装 HTTP 响应信息。它提供了一系列方法来设置 HTTP 响应的状态码、响应头、响应体等信息

  • setContentType(String type):设置响应体的 MIME 类型
  • setStatus(int sc):设置响应的状态码
  • addHeader(String name, String value) 和 setHeader(String name, String value):添加或设置响应头信息
  • getOutputStream() 和 getWriter():获取响应主体的输出流和字符流
  • sendRedirect(String location):重定向到指定的 URL
  • sendError(int sc) 和 sendError(int sc, String msg):发送一个错误响应
  • setBufferSize(int size):设置响应缓冲区大小
  • setCharacterEncoding(String charset):设置响应体的字符编码
  • addCookie(Cookie cookie):添加一个 Cookie

HttpSession

同时HttpServlet 提供了内置的会话管理机制,通过 HttpSession 对象,开发者可以轻松跟踪和维护用户的会话状态,如登录状态、购物车内容等。

java 复制代码
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
    HttpSession session = request.getSession();
    Integer count = (Integer) session.getAttribute("count");
    if (count == null) {
        count = 0;
    }
    count++;
    session.setAttribute("count", count);
    response.getWriter().println("Visit count: " + count);
}

HTTPServlet 生命周期

在 Servlet 容器启动时,容器会创建 Servlet 实例并调用其 init() 方法进行初始化,在容器关闭时,容器会调用其 destroy() 方法进行销毁。在 Servlet 实例创建之后,容器会调用其 service() 方法来处理客户端的每一个 HTTP 请求

  1. 容器检查 Servlet 是否已经加载,如果没有则加载 Servlet 类并创建其实例
  2. 容器调用 Servlet 的 init() 方法,进行初始化
  3. 容器调用 Servlet 的 service() 方法,处理客户端的 HTTP 请求
  4. Servlet 可能会多次调用其 doGet()、doPost()、doPut() 等方法,来处理不同类型的 HTTP 请求
  5. 当容器关闭时,容器会调用 Servlet 的 destroy() 方法,进行销毁

在 Servlet 的生命周期中,init() 和 destroy() 方法只会被调用一次,而 service() 方法会被多次调用,每次调用都会处理一个请求

HTTPServlet 版本 Hello World

创建一个简单的 Servlet,当访问 /hello 路径时,返回"Hello, World"页面

java 复制代码
package org.example;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 设置响应内容类型为 HTML
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            // 生成 HTML 响应
            out.println("<!DOCTYPE html>");
            out.println("<html>");
            out.println("<head><title>Hello World</title></head>");
            out.println("<body>");
            out.println("<h1>Hello, World!</h1>");
            out.println("</body>");
            out.println("</html>");
        } finally {
            out.close();
        }
    }
}
相关推荐
欢乐少年19045 分钟前
SpringBoot集成Sentry日志收集-3 (Spring Boot集成)
spring boot·后端·sentry
夏天的味道٥1 小时前
使用 Java 执行 SQL 语句和存储过程
java·开发语言·sql
冰糖码奇朵3 小时前
大数据表高效导入导出解决方案,mysql数据库LOAD DATA命令和INTO OUTFILE命令详解
java·数据库·sql·mysql
好教员好3 小时前
【Spring】整合【SpringMVC】
java·spring
浪九天4 小时前
Java直通车系列13【Spring MVC】(Spring MVC常用注解)
java·后端·spring
堕落年代4 小时前
Maven匹配机制和仓库库设置
java·maven
功德+n4 小时前
Maven 使用指南:基础 + 进阶 + 高级用法
java·开发语言·maven
uhakadotcom5 小时前
Apache CXF 中的拒绝服务漏洞 CVE-2025-23184 详解
后端·面试·github
uhakadotcom5 小时前
CVE-2025-25012:Kibana 原型污染漏洞解析与防护
后端·面试·github
uhakadotcom5 小时前
揭秘ESP32芯片的隐藏命令:潜在安全风险
后端·面试·github