# Servlet 类与接口

Servlet 类图

servlet-diagram

用户请求时序图

servlet-sequence

# Servlet 接口

定义了 Servlet 的生命周期方法:

  1. init(config: ServletConfig) : 初始化
    • 调用:第一个用户第一次访问
    • 目的是为了在处理客户端请求前完成一些初始化的工作,如建立数据库连接、读取资源文件信息等;
  2. service(req: ServletRequest, resp: ServletResponse) : 服务
    • 调用:每一个用户每一次访问 ++
    • 用于处理客户端的请求并返回响应对象
  3. destroy() : 销毁
    • 调用:最后一个用户最后一次访问
    • 当 Web 容器关闭或者检测到一个 Servlet 要从容器中被删除时,会自动调用 destroy () 方法,以便让该实例释放掉所占用的资源

# ServletRequest 请求接口

  1. attribute 相关
    getAttribute(name: String) -> Object
    获取请求域中的属性值。通常用于在请求转发(RequestDispatcher)时传递数据。
    setAttribute(name: String, obj: Object)
    在请求域中存储属性值。

  2. parameter 相关
    getParameter(name: String) -> String
    获取客户端发送的请求参数值(如表单数据或 URL 查询参数)。

# ServletResponse 响应接口

  1. getWriter() -> PrintWriter
    获取一个字符输出流 PrintWriter ,用于向客户端发送文本响应内容。
  2. setContentType(type: String)
    设置响应的内容类型(MIME Type)及字符编码,如 text/html;charset=UTF-8 。让浏览器知道如何解析响应数据。

# GenericServlet 抽象类

实现自 Servlet

定义了一个通用的、不依赖于具体协议的 Servlet,它给出了除 service () 方法外的其他四个方法的简单实现;

用户要编写一个通用的 Servlet (TCP/IP),只需要从 GenericServlet 类中继承,并实现 service() ;

  • init()
    不同于 Servlet 的 init,这里的 init 是无参的,因为 GenericServlet 实现了 ServletConfig 的传入;

# HttpServlet 抽象类

继承自 GenericServlet

HttpServlet 提供了重载的 service(req: HttpServletRequest, resp: HttpServletResponse) 方法,并定义了七个 do* 方法。

为什么定义了七个 `do*` 方法

**RESTful 编程: **

HTTP 协议支持的方法有 GET、POST、PUT、PATCH、DELETE,以及 OPTIONS 和 TRACE。

在 RESTful 架构中,使用这些方法来操作资源。

在编程中,需要根据应用程序的需求选择合适的 HTTP 方法来操作资源。

  1. doGet : 获取资源
    用于处理 GET 请求,一般用于读取数据。
  2. doPost : 创建资源
    用于处理 POST 请求,一般用于提交表单或上传文件。
  3. doPut : 修改资源
    用于处理 PUT 请求,通常用于更新资源。
  4. doPatch : 修改部分资源
    用于处理 PATCH 请求,对资源进行部分更新。
  5. doDelete : 删除资源
    用于处理 DELETE 请求,删除指定的资源。
  6. doOptions : 获取支持的方法
    用于获取服务器支持的 HTTP 请求方法。
  7. doTrace : 追踪路径
    用于回显服务器收到的请求,主要用于测试或诊断。

# HttpServletRequest 请求接口

继承自 ServletRequest

  1. getSession() -> HttpSession
    获取当前请求关联的 Session 对象。如果不存在,默认会创建一个新的。
  2. getContextPath() -> String
    获取当前 Web 应用的上下文路径(Context Path),即项目部署名。

# HttpServletResponse 响应接口

继承自 ServletResponse

  1. addCookie(cookie: Cookie)
    向响应中添加一个 Cookie,浏览器接收到后会保存该 Cookie。
  2. sendRedirect(location: String)
    发送一个重定向响应,通知浏览器访问新的 URL 地址(状态码 302)。

# ServletConfig 配置接口

  1. getInitParameter(name: String) -> String
    根据参数名获取 Servlet 的初始化参数值(在 web.xml 或注解中配置)。
  2. getServletName() -> String
    获取当前 Servlet 的名称。
  3. getServletContext() -> ServletContext
    获取当前 Web 应用的 ServletContext 对象(应用上下文)。

# ServletContext 上下文接口

  1. attribute 相关
    getAttribute(name: String)
    获取应用域(全局)中的属性值。
    setAttribute(name: String, obj: Object)
    在应用域中存储属性值,所有 Servlet 共享。
  2. resource 相关
    getResourcePaths(path: String) -> Set<String>
    获取指定路径下的所有资源路径列表。
    getResourceStream(path: String) -> InputStream
    获取指定路径资源的输入流,用于读取资源文件内容。

# 代码示例

# HelloServlet

下面的代码实现了一个简单的 Servlet 来展示基本的生命周期,输出 Hello, world!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

import jakarta.servlet.http.*;
import jakarta.servlet.annotation.*;

import java.io.IOException;
import java.io.PrintWriter;

@WebServlet(name = "helloServlet", value = "/hello-servlet")
public class HelloServlet extends HttpServlet {
private String message;

// Servlet 初始化
public void init() {
System.out.println("HelloServlet.init");
message = "Hello World!";
}

// service 的实现 - 处理 GET 请求
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("<h1>" + message + "</h1>");
out.println("</body></html>");
}

// Servlet 销毁
public void destroy() {
System.out.println("HelloServlet.destroy");
}
}

#

更新于

请我喝[茶]~( ̄▽ ̄)~*

梦前辈 微信支付

微信支付

梦前辈 支付宝

支付宝