zl程序教程

您现在的位置是:首页 >  后端

当前栏目

【java web篇】Servlet执行流程与生命周期

2023-09-27 14:26:52 时间

📋 个人简介

  • 💖 作者简介:大家好,我是阿牛,全栈领域优质创作者。😜
  • 📝 个人主页:馆主阿牛🔥
  • 🎉 支持我:点赞👍+收藏⭐️+留言📝
  • 📣 系列专栏:java 小白到高手的蜕变🍁
  • 💬格言:要成为光,因为有怕黑的人!🔥
    请添加图片描述

前言

上节总结了Servlet的快速入们,那么这节我们就来看看服务器是如何找到Servlet中的service方法的,也就是Servlet的执行流程,同时我们再看看他的生命周期!

Servlet 的执行流程

关于servlet的执行流程,看下面这张图:
请添加图片描述
同时还有两个问题需要我们理解:

1.Servlet 由谁创建? Servlet 方法由谁调用?

Servlet 由 web 服务器创建, Servlet 方法由 web 服务器调用。

2.服务器怎知道 Servlet 中一定有 service 方法?

因为我们自定义的 Servlet ,必须实现 Servlet 接口并复写其
方法,而 Servlet 接口中有 service 方法

Servlet 的生命周期

首先要知道什么是生命周期?

对象的生命周期指一个对象从被创建到被销毁的整个过程

Servlet 运行在 Servlet 容器( web 服务)中,其生命周期由容器来管理,分为4个阶段:

  1. 加载和实例化:默认情况下,当 Servlet 第一次被访问时,由容器创建 Servlet 对象。
  2. 初始化:在 Servlet 实例化之后,容器将调用 Servlet 的 init ()方法初始化这个对象,完成一些如加载配置文件、创建连接等初始化的工作,该方法只调用一次。
  3. 请求处理:每次请求 Servlet 时, Servlet 容器都会调用 Servlet 的 service()方法对请求进行处理。
  4. 服务终止:当需要释放内存或者容器关闭时,容器就会调用 Servlet 实例的 destroy ()方法完成资源的释放。在 destroy ()方法调用之后,容器会释放这个 Servlet 实例,该实例随后会被 java 的垃圾收集器所回收。

关于第一条加载和实例化,默认情况下,当 Servlet 第一次被访问时,由容器创建 Servlet 对象。
这其实是由注解中的参数loadOnStartup的值决定的:

@WebServlet(urlPatterns = "/demo1",loadOnStartup = 1)
  1. 负整数:Servlet 第一次被访问时创建Servlet对象。(loadOnStartup默认值为-1)

  2. 0或正整数:服务器启动时创建Servlet对象,数字越小优先级越高!这样的目的是在某种情况下我们的Servlet创建可能比较耗时,我们把它放到服务器启动时创建对象,可以加快请求速度!

@WebServlet(urlPatterns = "/demo1",loadOnStartup = 1)
public class ServletDemo1 implements Servlet{

    // 初始化的方法 :默认情况下,servlet第一次被访问时创建Servlet对象然后被调用,只调用一次!
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("init:我只有被调用一次!");
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("service:hello servlet!");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    // 销毁方法:内存释放或者服务器关闭时被调用,只调用一次!
    @Override
    public void destroy() {
        System.out.println("destroy:我被停止了!");
    }
}

在这里插入图片描述
当然这里我们还要验证destroy方法
在这里插入图片描述
如上图,你点击这个按钮关闭是不会调用destray这个方法的,这相当于强制关闭!,我们需要让tomcat插件正常关闭!

因此我们要在终端中以命令行的方式运行这个Maven项目,然后用Ctrl+c关闭!

在这里插入图片描述

在这里插入图片描述

结语

如果你觉得博主写的还不错的话,可以关注一下当前专栏,博主会更完这个系列的哦!也欢迎订阅博主的其他好的专栏。

🏰系列专栏
👉软磨 css
👉硬泡 javascript
👉flask框架快速入门