Servlet生命周期详解

Servlet生命周期详解Servlet 生命周期概述 servlet 生命周期的四个过程 1 实例化 servlet 对象我们的 OOP 面向对象 思想中 总是先创建对象 通过对象调用成员 那么 servlet 如何实例化呢 设置对应 servlet 的优先级 loadOnStartu 2 初始化参数配置 3 就绪状态 4 销毁状态 servlet 生命周期简易总结概述 servlet 的生命周期 servlet 在容器中开始实例化到实例销毁的整个过程 servlet 生命周期的四个过程 1 实例化 servlet 对象我们的 OOP 面向对象 思想中 总是先创

概述

 servlet的生命周期:servlet在容器中开始实例化到实例销毁的整个过程 

servlet生命周期的四个过程

1、实例化servlet对象

我们的OOP(面向对象)思想中,总是先创建对象,通过对象调用成员,那么servlet如何实例化呢?

  • 第一种方式:通过配置文件web.xml进行实例化
public class ActionServlet extends HttpServlet { 
    //1、构造器 public ActionServlet(){ 
    System.out.println("servlet对象实例化中....."); } } 
 
    <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_4_0.xsd" version="4.0">  
    <servlet> <servlet-name>testServlet 
     servlet-name> <servlet-class>org.softeem.controller.ActionServlet 
      servlet-class>  
       servlet> <servlet-mapping> <servlet-name>testServlet 
        servlet-name> <url-pattern>/friend_demo/action 
         url-pattern>  
          servlet-mapping>  
           web-app> 
  • 第二种方式:注解
//注解方式,效果等同于web.xml中的配置 @WebServlet("/friend_demo/action") public class ActionServlet extends HttpServlet { 
    //1、构造器 public ActionServlet(){ 
    System.out.println("servlet对象实例化中....."); } } 
  • 通过以上两种方式中的一种,此时运行tomcat会出现如下结果
23-Jan-2021 21:52:28.552 信息 [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["ajp-nio-8009"] 23-Jan-2021 21:52:28.554 信息 [main] org.apache.catalina.startup.Catalina.start Server startup in 39 ms Connected to server [2021-01-23 09:52:29,482] Artifact ZhenaiDemo:war exploded: Artifact is being deployed, please wait... 23-Jan-2021 21:52:29.779 警告 [RMI TCP Connection(3)-127.0.0.1] org.apache.tomcat.util.descriptor.web.WebXml.setVersion Unknown version string [4.0]. Default version will be used. 23-Jan-2021 21:52:30.540 信息 [RMI TCP Connection(3)-127.0.0.1] org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time. servlet对象实例化中..... 
  • 通过上面的运行结果可以发现,确实调用了ActionServlet 类中的无参构造器。但是,出现该结果是在我们在浏览器客户端中输入了当前servlet对应的 /friend_demo/action 请求后才在控制台中输出 “servlet对象实例化中…”,由此可以发现只有当我们在使用对应的servlet时才会进行对象的创建。有时我们需要某个servlet随着容器加载时就创建servlet对象,而不是在使用时才创建。这是就可以通过设定servlet对应的优先级来决定servlet实例化的时机
设置对应servlet的优先级(loadOnStartup)

设定servlet优先级可以使用loadOnStartup属性,对应的属性值越小优先级别越高。当我们需要servlet与tomcat容器一起加载时而被实例化,即将loadOnStartup属性值设定为1,设定的方式有两种

  • 配置文件方式
 
    <servlet> <servlet-name>testServlet 
     servlet-name> <servlet-class>org.softeem.controller.ActionServlet 
      servlet-class>  
      <load-on-startup>1 
       load-on-startup>  
        servlet> <servlet-mapping> <servlet-name>testServlet 
         servlet-name> <url-pattern>/friend_demo/action 
          url-pattern>  
           servlet-mapping> 
  • 注解方式
    注意:若同时设定请求协议与优先级时,需要将协议赋值给value属性,且中间使用逗号隔开,如下

@WebServlet(value="/friend_demo/action",loadOnStartup = 1) public class ActionServlet extends HttpServlet { 
    //1、构造器 public ActionServlet(){ 
    System.out.println("servlet对象实例化中....."); } } 

2、初始化参数配置

servlet实例化后就会调用init方法,被设计为只能调用一次,且是在进行第一次实例化servlet对象时调用。当用户在调用servlet时,就会创建一个servlet实例,每一次在客户端发送的请求servlet就会产生一个新的线程,从而调用对应的doGet 或 doPost 方法。init方法的作用在于初始化一些配置参数(比如编码设置),并写这些参数将被贯穿整个servlet生命周期。配置参数的参数有两种,如下

  • 通过配置文件web.xml方式配置
 
    <servlet> <servlet-name>testServlet 
     servlet-name> <servlet-class>org.softeem.controller.ActionServlet 
      servlet-class>  
      <load-on-startup>1 
       load-on-startup>  
        
       <init-param> <param-name>encoding 
        param-name> <param-value>utf-8 
         param-value>  
          init-param>  
          <init-param> <param-name>userName 
           param-name> <param-value>上进的小仓鼠 
            param-value>  
             init-param>  
              servlet> <servlet-mapping> <servlet-name>testServlet 
               servlet-name> <url-pattern>/friend_demo/action 
                url-pattern>  
                 servlet-mapping> 
@WebServlet(value="/friend_demo/action",loadOnStartup = 1) public class ActionServlet extends HttpServlet { 
    //1、构造器 public ActionServlet(){ 
    System.out.println("servlet对象实例化中....."); } //2、初始化 @Override public void init(ServletConfig config) throws ServletException { 
    System.out.println("servlet初始化中......"); //获取配置的参数值 String encoding = config.getInitParameter("encoding"); String userName = config.getInitParameter("userName"); System.out.println(encoding + "," + userName); } 
  • 通过注解方式配
@WebServlet(value="/friend_demo/action",loadOnStartup = 1, initParams = { 
    @WebInitParam(name="encoding",value = "utf-8"), @WebInitParam(name="userName",value = "上进的小仓鼠") } ) public class ActionServlet extends HttpServlet { 
    //1、构造器 public ActionServlet(){ 
    System.out.println("servlet对象实例化中....."); } //2、初始化 @Override public void init(ServletConfig config) throws ServletException { 
    System.out.println("servlet初始化中......"); //获取配置的参数值 String encoding = config.getInitParameter("encoding"); String userName = config.getInitParameter("userName"); System.out.println(encoding + "," + userName); } } 

配置完参数运行结果如下:

23-Jan-2021 22:42:05.584 信息 [main] org.apache.catalina.startup.Catalina.start Server startup in 29 ms Connected to server [2021-01-23 10:42:05,899] Artifact ZhenaiDemo:war exploded: Artifact is being deployed, please wait... 23-Jan-2021 22:42:06.062 警告 [RMI TCP Connection(3)-127.0.0.1] org.apache.tomcat.util.descriptor.web.WebXml.setVersion Unknown version string [4.0]. Default version will be used. 23-Jan-2021 22:42:06.657 信息 [RMI TCP Connection(3)-127.0.0.1] org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time. servlet对象实例化中..... servlet初始化中...... utf-8,上进的小仓鼠 

3、就绪状态

  • 案例代码如下
@WebServlet(value="/friend_demo/action",loadOnStartup = 1, initParams = { 
    @WebInitParam(name="encoding",value = "utf-8"), @WebInitParam(name="userName",value = "上进的小仓鼠") } ) public class ActionServlet extends HttpServlet { 
    //1、构造器 public ActionServlet(){ 
    System.out.println("servlet对象实例化中....."); } //2、初始化 @Override public void init(ServletConfig config) throws ServletException { 
    System.out.println("servlet初始化中......"); //获取配置的参数值 String encoding = config.getInitParameter("encoding"); String userName = config.getInitParameter("userName"); System.out.println(encoding + "," + userName); } //3、就绪状态 @Override public void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { 
    System.out.println("servlet:service()就绪中..."); } } 

程序运行结果如下

23-Jan-2021 22:42:15.575 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory D:\apache\apache-tomcat-8.0.45\webapps\manager 23-Jan-2021 22:42:15.594 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory D:\apache\apache-tomcat-8.0.45\webapps\manager has finished in 18 ms [2021-01-23 10:54:32,996] Artifact ZhenaiDemo:war exploded: Artifact is being deployed, please wait... servlet实例销毁中.... servlet对象实例化中..... servlet初始化中...... utf-8,小仓鼠 [2021-01-23 10:54:34,124] Artifact ZhenaiDemo:war exploded: Artifact is deployed successfully [2021-01-23 10:54:34,124] Artifact ZhenaiDemo:war exploded: Deploy took 1,128 milliseconds servlet:service()就绪中... 

4、销毁状态

servlet生命周期结束时将会调用destroy()方法,并且只会调用一次。destroy方法可以让我们的servlet关闭数据库连接,把后台线程关闭,清楚Cookie数据等。当调用了destroy()方法后,当前servlet实例将会被标记为回收垃圾,会对servlet实例进行清除,案例代码如下

@WebServlet(value="/friend_demo/action",loadOnStartup = 1, initParams = { 
    @WebInitParam(name="encoding",value = "utf-8"), @WebInitParam(name="userName",value = "上进小仓鼠") } ) public class ActionServlet extends HttpServlet { 
    //1、构造器 public ActionServlet(){ 
    System.out.println("servlet对象实例化中....."); } //2、初始化 @Override public void init(ServletConfig config) throws ServletException { 
    System.out.println("servlet初始化中......"); //获取配置的参数值 String encoding = config.getInitParameter("encoding"); String userName= config.getInitParameter("userName"); System.out.println(encoding + "," + userName); } //3、就绪状态 @Override public void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { 
    System.out.println("servlet:service()就绪中..."); } //4、销毁状态 @Override public void destroy() { 
    System.out.println("servlet实例销毁中...."); } } 

执行程序后的运行效果

[2021-01-23 10:54:32,996] Artifact ZhenaiDemo:war exploded: Artifact is being deployed, please wait... servlet实例销毁中.... servlet对象实例化中..... servlet初始化中...... utf-8,小仓鼠 [2021-01-23 10:54:34,124] Artifact ZhenaiDemo:war exploded: Artifact is deployed successfully [2021-01-23 10:54:34,124] Artifact ZhenaiDemo:war exploded: Deploy took 1,128 milliseconds servlet:service()就绪中... [2021-01-23 11:06:03,372] Artifact ZhenaiDemo:war exploded: Artifact is being deployed, please wait... servlet实例销毁中.... 

servlet生命周期总结

  • 实例化:servlet容器创建servlet对象。默认创建servlet实例的时机:当我们发送servlet对应的请求时(在使用时创建)。类似单例模式中的懒加载方式。希望容器一旦启动,就自动创建servlet实例通过load-on-startup=1设置,正数数值越低优先级别越高,优先实例化
  • 初始化:servlet实例一旦创建,就开始初始化一些参数配置,我们可以做一些参数配置,比如编码,可以在web.xml或注解中配置
  • 就绪状态:当发送对应的servlet请求时,会调用service()方法,注意此时不会重新创建servlet实例,也不会调用init()方法
  • 销毁状态:调用了destroy()方法后,当前servlet实例将会被标记为回收垃圾,会对servlet实例进行清除处理
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/216530.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 上午11:38
下一篇 2026年3月18日 上午11:39


相关推荐

  • 利用公网Msf+MS17010跨网段攻击内网(不详细立马关站)「建议收藏」

    利用公网Msf+MS17010跨网段攻击内网(不详细立马关站)「建议收藏」前言其实很多小白在对利用msf进行ms17010攻击的时候总是不成功,其实这都是因为网上大部分的文章都是写的内网对内网(192.168.1.2–&gt;192.168.1.3)这样的案例,今天写了一下利用公网的MSF直接攻击其他服务器内网的案例。准备工作1.安装了Msf的公网主机+Ubuntu系统2.一台其他服务器内网存在445漏洞3.细心,细心,细心,钻研,钻研!!!…

    2022年5月31日
    136
  • 【Markdown笔记】设置字体颜色

    【Markdown笔记】设置字体颜色Markdown 笔记 设置字体颜色在 Markdown 下设置字体颜色和给字体背景设置颜色 主要使用 HTML 和 LaTeX HTML 字体颜色 Fontcolors 修改字体颜色 选择颜色名称 例如 fontcolor Blue Test 效果为 Test 或者是 fontcolor Blue Test 效果为 Test 修改字体颜色 选择 16 进制颜色值 例如 fontcolor 0000FF T fontcolor 0000FF fontcolor Blue fontcolor Blue

    2026年3月19日
    4
  • STEAM账号被盗(绑定QQ邮箱)的找回方法以及背后操作原理解析「建议收藏」

    STEAM账号被盗(绑定QQ邮箱)的找回方法以及背后操作原理解析「建议收藏」看到这篇博客的,想必十有八九都是刚刚发现STEAM账号被盗的!针对STEAM密码被修改、绑定邮箱被修改、申诉“此客服案件已关闭”、STEAM申诉超过2天没有结果、当天打开杀毒软件警告过的高危软件后被盗号的我觉得会有用!(我是Murphyer今天是19年4月20日,从上次被盗号到现在已经半年多了,没有出现再被盗号的情况。我在这儿提供一个QQ群:866986904(目前已有270人…

    2022年7月25日
    130
  • pycharm添加快捷按钮

    pycharm添加快捷按钮welcometomyb 使用 pycharm 远程调试的时候 总想着点一下上传按钮再开始运行 虽然开启了自动上传 但怕有延迟 感觉运行前会先自动同步 再执行程序 所以我这纯属多虑 上传文件的快捷键是 CTRL ALT SHIFT X 按起来太麻烦了 我也不想改快捷键 于是就想着直接点击上传按钮我是增加了下图右上角黄框左边的四个按钮 具体操作流程跟着下图的红色数字一步一

    2026年3月27日
    2
  • javascript和java哪个快_Javascript与Java相比有多快?

    javascript和java哪个快_Javascript与Java相比有多快?Java 和 JavaScript 都是编程语言 编程语言只是一堆抽象的数学规则 编程语言不快 或慢 他们只是 应用程序的性能与语言无关 最重要的因素是应用程序架构 然后是算法效率 然后微优化 然后是编译器 解释器的质量 然后是 CPU 也许两个之间的其他几个步骤 然而 语言不直接起作用 当然 如果你在谈论基准测试 那么特定的基准测试也会发挥作用 基准测试的执行情况 运行得如何好 执行基准测试的人是否

    2025年10月19日
    2
  • WCF使用

    WCF使用一 概述 WindowsCommu WCF 是由微软发展的一组数据通信的应用程序开发接口 可以翻译为 Windows 通讯接口 它是 NET 框架的一部分 由 NETFramework 0 开始引入 WCF 的最终目标是通过进程或不同的系统 通过本地网络或是通过 Internet 收发客户和服务之间的消息 WCF 合并了 Web 服务 net

    2025年10月28日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号