Servlet 的生命周期

本文详细介绍了Servlet的生命周期,包括初始化、运行和销毁三个阶段,重点阐述了init(), service()和destroy()方法的作用。在Servlet的生命周期中,init()方法只在创建时调用,service()方法每次请求都会调用,destroy()方法在Servlet销毁前调用。同时,给出了Servlet生命周期的代码示例,帮助理解其工作原理。
摘要由CSDN通过智能技术生成

一、Servlet 生命周期

Servlet 生命周期流程如下图所示:
在这里插入图片描述

在 Servlet 的整个生命周期中,创建 Servlet 实例、init() 方法和 destory()方法都只执行一次。当初始化完成后,Servlet 容器会将该实例保存在内存中,通过调用它的 service() 方法,为接收到的请求服务。

二、与 Servlet 生命周期有关的方法

与 Servlet 生命周期有关的方法一般有以下三个:

  1. init() 方法 init() 方法是在创建 Servlet 对象时被调用,而且只能被调用一次,用于 Servlet
    对象在整个生命周期内的唯一一次初始化。只有在 init() 方法调用成功后,Servlet 才会处于服务状态,才能够去处理客户端的请求。

  2. service() 方法 service() 方法是 Servlet 工作的核心方法。当客户端请求访问 Servlet
    时,Servlet 容器就会调用 service() 方法去处理来自客户端的请求,并把处理后的响应返回给客户端。

  3. destroy() 方法 destory() 方法是 Servlet 容器回收 Servlet
    对象之前调用的,且只会调用一次,而此时的服务器处于停止状态或者访问资源已经被移除。

上图描述了 Servlet 的完整生命周期,按照功能的不同,大致可以将 Servlet 的生命周期分为三个阶段:

1. 初始化阶段
2. 运行阶段
3. 销毁阶段

1) 初始化阶段
当用户第一次向 Servlet 容器发出 HTTP 请求要求访问某个 Servlet 时,Servlet 容器会在整个容器中搜索该 Servlet 对象,发现这个 Servlet 对象没有被实例化,于是创建这个 Servlet 对象,然后调用该对象的 init() 方法完成初始化。

当用户第二次访问这个 Servlet 时,Servlet 容器仍然在容器中搜索该 Servlet 对象,结果找到了该对象的实例,则不去创建而直接使用该对象。

找到了对应的 Servlet 对象,随后 Servlet 进入到运行阶段。

需要注意的是,在 Servlet 的整个生命周期内,它的 init() 方法只被调用一次。

2) 运行阶段
这是 Servlet 生命周期中最核心的阶段。在该阶段中,Servlet 容器会为当前的请求创建一个 ServletRequest 对象和一个 ServletResponse 对象(它们分别代表 HTTP 请求和 HTTP 响应),并将这两个对象作为参数传递给 Servlet 的 service() 方法。

service() 方法从 ServletRequest 对象中获得用户的详细请求信息并处理该请求,通过 ServletResponse 对象生成响应结果。

需要强调的是,在 Servlet 的整个生命周期内,用户每次请求访问 Servlet 时,Servlet 容器都会调用一次 Servlet
的 service() 方法,并且创建新的 ServletRequest 和 ServletResponse 对象。

3) 销毁阶段
当服务器停止时,Servlet 容器需要回收 Servlet 对象所占用的内存,在回收之前,会自动调用该对象的 destroy() 方法做好回收内存前的准备,辟如关闭后台线程。

和 init() 方法类似,destroy() 方法也只会被调用一次。

注意:Servlet 对象一旦创建就会驻留在内存中一直等待客户端的访问,直到服务器关闭或项目被移除出容器时,Servlet 对象才会被销毁。

三、示例

代码示例:

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
 
@WebServlet("/test")
public class TestServlet extends HttpServlet {
    @Override
    public void init() throws ServletException {
        System.out.println("调用了init方法");
    }
 
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("调用了service方法");
    }
 
    @Override
    public void destroy() {
        System.out.println("调用了destroy方法");
    }
}

四、总结

在这里插入图片描述

对 Servlet 声明周期的几点汇总:

1.Servlet 对象被创建之后执行 init() 方法,并且 init() 方法只执行一次,其主要目的是完成 Servlet对象的初始化工作。
2.对于 Servlet 对象的 service() 方法,只要用户请求一次,那么 service() 方法就执行一次。
3.Servlet 对象被回收之前,destroy() 方法会被调用,该方法只执行一次,执行的时候 Servlet 对象还在。

Servlet 对象的创建、对象提供服务、对象的销毁等操作皆由 Servlet 容器来管理,Java 程序员的任务只是负责编写 Servlet 类,无法干涉 Servlet 对象的生命周期。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值