servlet生命周期和执行流程

一 、生命周期

servlet 声明周期可以分四个阶段:

  • 类装载过程
  • init() 初始化过程
  • service() 服务过程,选择doGet \ doPost
  • destroy() 销毁过程

servlet接口如下

public interface Servlet {void init(ServletConfig var1) throws ServletException;ServletConfig getServletConfig();void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;String getServletInfo();void destroy();
}

1、创建servlet实例

时期:默认是第一个请求该servlet的时候就初始化此servlet,该servlet实例便一直存在,直到长

​ 时间不调用、服务器关闭才销毁 或者 类文件更新后重新载入 。也可手动设置:在服务器

​ 启动时便加载此servlet 。

<servlet><servlet-name>Xxx</servlet-name><servlet-class>com.lingz.Xxx</servlet-class><load-on-startup>1</load-on-startup>
</servlet>

2、init()初始化

​ servlet实例一创建出来,便调用init(ServletConfig var1) 进行初始化, 其中的ServletConfig参数对象携带了该servlet的配置信息,比如初始化参数,此ServletConfig参数由服务器创建。

(1)那么,如何配置 servlet的初始化参数?

<servlet><servlet-name>Xxx</servlet-name><servlet-class>com.lingz.Xxx</servlet-class><!--两个自定义的初始化参数--><init-param><param-name>value1</param-name><param-value>key1</param-value></init-param><init-param><param-name>value2</param-name><param-value>key2</param-value></init-param>
</servlet>

​ 通过这种配置方式,就不需要在Servlet中添加、修改,直接修改xml文件即可。

(2)如何读取上面的参数呢?

​ 通过 ServletConfig类提供的 getInitParameter(String name) 获取初始化参数

public interface ServletConfig {String getServletName();ServletContext getServletContext();String getInitParameter(String var1);Enumeration<String> getInitParameterNames();
}

(3)init(ServletConfig var1) 在Servlet生命周期中,只执行一次。并且是单线程执行,不需要担心多线程安全。

3、service() 服务过程

(1)请求发到对应的Servlet,Servlet调用service(),service() 根据请求调用doGet \ doPost

​ service方法是处理业务的核心。

(2)service() 与多线程

​ servlet 是单例的,当多个请求请求同一个servlet时,需要主要注意线程安全,不过也存在可以不必考虑线程安全的情况。

①线程安全情况

  • 如果service()方法没有访问Servlet的成员变量也没有访问全局的资源比如静态变量、文件、数据库连接等,而是只使用了当前线程自己的资源,比如非指向全局资源的临时变量、request和response对象等。该方法本身就是线程安全的,不必进行任何的同步控制。
  • 如果service()方法访问了Servlet的成员变量,但是对该变量的操作是只读操作,该方法本身就是线程安全的,不必进行任何的同步控制。

②线程不安全情况

  • 如果service()方法访问了全局的静态变量,如果同一时刻系统中也可能有其它线程访问该静态变量,如果既有读也有写的操作,通常需要加上同步控制语句。
  • 如果service()方法访问了全局的资源,比如文件、数据库连接等,通常需要加上同步控制语句。

4 、destroy()销毁

​ 当web服务器认为此servlet没有存在的必要、类重新加载、服务器关闭、长时间未被访问,则可以从内存中销毁。而回收该Servlet内存前必须调用destroy(),web服务器保证该方法被调用时已经结束了请求调用的service()或等待剩余的请求执行完,并且不会再接收请求。当全部请求处理完并响应后,即可destroy() 并进行内存回收

二、执行流程

通过上面的描述,其实我们对执行流程已有了大体的认知:

1. 根据时机,Web容器加载对应的Servlet类,加载后进行init()初始化。- 设置了容器启动时初始化- 请求第一次请求此Servlet时初始化- Servlet类文件被更新后,重新装载Servlet
2. 接收到请求,容器根据配置将请求交给对应的Servlet,同时创建HttpServletRequest 和 HttpServletResponse 对象,一并交给Servlet。
3. 在service()中根据HttpServletRequest得请求类型等信息,调用doGet\doPost 进行业务处理。
4. 处理后通过HttpServletResponse获得相应信息,返回给Web容器。
5. Web容器再将响应返回给客户端。

Servlet的四个生命周期相关推荐

  1. 深刻理解Servlet运行机制和生命周期

    servlet 运行在servlet 容器中,其生命周期由容器来管理.servlet 的生命周期通过 javax.servlet.Servlet接口中的init(),servce(),和destory ...

  2. 【Kevin聊敏捷】02 项目管理的四种生命周期

    文章目录 四种生命周期的定义 # 迭代vs 增量 参考 四种生命周期的定义 预测性生命周期:这是一种传统的生命周期,前提是进行了大量的计划工作,然后一次性执行,执行的过程是连续的. 例如:建筑.航空航 ...

  3. JavaEE基础(01):Servlet实现方式,生命周期执行过程

    本文源码:GitHub·点这里 || GitEE·点这里 一.Servlet简介 Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容.使用S ...

  4. 小汤学编程之JavaEE学习day02——Servlet使用步骤、生命周期、接收与返回数据、GET与POST、转发与重定向

    一.Servlet使用步骤 二.Servlet生命周期 三.Servlet接收与返回数据 四.GET请求与POST请求的区别 五.转发与重定向 一.Servlet使用步骤 servlet是运行在服务器 ...

  5. Servlet系列学习笔记1 --- Servlet工作原理和生命周期

    目录 一.Servlet API概述 二.Servlet工作原理 三.Servlet接口 四.Servlet的生命周期 五.ServletRequest 六.ServletResponse Servl ...

  6. Servlet运行原理以及生命周期

    Servlet运行原理 Servlet生命周期定义了一个Servlet如何被加载.初始化,以及它怎样接收请求.响应请求,提供服务.在讨论Servlet生命周期之前,先让我们来看一下这几个方法: 1. ...

  7. servlet工作原理_Servlet 生命周期、工作原理

    Servlet 生命周期:Servlet 加载--->实例化--->服务--->销毁. init():在Servlet的生命周期中,仅执行一次init()方法.它是在服务器装入Ser ...

  8. Servlet 和Filter的生命周期

    Servlet的生命周期 1.客户端请求该 Servlet; 2.加载 Servlet 类到内存; 3.实例化并调用init()方法初始化该 Servlet; 4.service()(根据请求方法不同 ...

  9. servlet运行原理和生命周期

    servlet的生命周期分为3个阶段: 1初始化阶段:调用init方法 2响应客户请求阶段:调用service()方法 3终止阶段:调用destroy方法 servlet初始化阶段: 在下列时刻ser ...

最新文章

  1. 【大型网站技术实践】初级篇:借助LVS+Keepalived实现负载均衡
  2. sklearn的简单使用
  3. python清洗完数据做什么_Python 数据的清洗和准备
  4. 412. Fizz Buzz
  5. A8U公司的老程序猿的悲惨下场
  6. vue项目调用通用组件_详细解析:uniapp项目|vue组件形式实现的科技感loading纯CSS动效...
  7. AI + 3D!英伟达开源3D深度学习框架Kaolin
  8. PS抠图神器: KnockOut 2.0安装汉化和使用教程
  9. 公司打印机的安装和使用
  10. HOWTO:FirePHP乱码问题解决
  11. linux下查看vnc端口_linux vnc的默认端口修改
  12. 数据分析--优化模型
  13. MkDocs项目文档生成器(一)
  14. APP 基本框架设计
  15. Word中插入图片只显示一部分
  16. 19c(19.3) 单机数据库静默安装
  17. java计算机毕业设计雁门关风景区宣传网站源码+系统+mysql数据库+lw文档
  18. circos 可视化手册-links 篇
  19. 程序员工作9年月薪从1.5K到24K,网友:不如刚毕业985
  20. 子网划分及NAT技术总结

热门文章

  1. 服务器统一计算系统,思科统一计算系统(UCS)
  2. 都吃移动营销饭,四大门户有什么不同姿势?
  3. [转]“子不语怪力乱神”新解
  4. 中国非定向信标市场市场趋势研究与竞争策略分析报告2022-2028年
  5. 智慧经营系统有什么功能?数字会员了解一下
  6. EasyRecovery15数据恢复软件相关使用教程
  7. 阿翔编程学-XFire
  8. 微信小程序:CheckBox与CheckBox-Group
  9. Sass快速入门笔记(将主要知识点截取出来,参考官方文档和一些网络教学视频)
  10. 数学建模--数学规划模型Python实现