Servlet的生命周期

  • 图解Servlet的生命周期

  • 生命周期的各个阶段

    • 实例化 :Servlet 容器创建 Servlet 的实例
    • 初始化 :该容器调用init() 方法
    • 请求处理 :如果请求Servlet,则容器调用 service()方法
    • 服务终止 :销毁实例之前调用destroy() 方法
  • Servlet生命周期详解

Servlet是运行在Servlet容器(有时候也叫Servlet引擎,是web服务器和应用程序服务器的一部分,用于在发送的请求和响应之上提供网络服务,解码基于MIME的请求,格式化基于MIME的响应。常用的tomcat、jboss、weblogic都是Servlet容器)中的,其生命周期是由容器来管理。Servlet的生命周期通过java.servlet.Servlet接口中的init()、service()、和destroy()方法表示。Servlet的生命周期有四个阶段:加载并实例化、初始化、请求处理、销毁。

  • 加载并实例化

​ Servlet容器负责加载和实例化Servelt。当Servlet容器启动时,或者在容器检测到需要这个Servlet来响应第一个请求时,创建Servlet实例。当Servlet容器启动后,Servlet通过类加载器来加载Servlet类,加载完成后再new一个Servlet对象来完成实例化。

  • 初始化

​ 在Servlet实例化之后,容器将调用init()方法,并传递实现ServletConfig接口的对象。在init()方法中,Servlet可以部署描述符中读取配置参数,或者执行任何其他一次性活动。在Servlet的整个生命周期类,init()方法只被调用一次。

  • 请求处理

​ 当Servlet初始化后,容器就可以准备处理客户机请求了。当容器收到对这一Servlet的请求,就调用Servlet的service()方法,并把请求和响应对象作为参数传递。当并行的请求到来时,多个service()方法能够同时运行在独立的线程中。通过分析ServletRequest或者HttpServletRequest对象,service()方法处理用户的请求,并调用ServletResponse或者HttpServletResponse对象来响应。

  • 销毁

​ 一旦Servlet容器检测到一个Servlet要被卸载,这可能是因为要回收资源或者因为它正在被关闭,容器会在所有Servlet的service()线程之后,调用Servlet的destroy()方法。然后,Servlet就可以进行无用存储单元收集清理。这样Servlet对象就被销毁了。这四个阶段共同决定了Servlet的生命周期。

Servlet生命周期,即阐述Servlet从产生到毁灭的整个过程。

在Servlet产生到消亡的过程中,有三个生命周期函数,初始化方法init(),处理客户请求的方法service(),终止方法destroy()。

init方法
        在一个Servlet的生命周期中,init方法只会被执行一次,之后无论用户执行多少次请求,都不会在调用该方法。 
        关于init方法的执行时机,有两种方式可选,一般的是在服务器启动后第一个用户请求改Servlet是调用,你也可以设置该Servlet在服务器启动后自动执行。 
init方法负责简单的创建或者加载一些数据,这些数据将用于该Servlet的整个生命周期中。

service方法
        当一个客户请求改Servlet时,实际的处理工作全部有service方法来完成,service方法用来处理客户端的请求,并生成格式化数据返回给客户端。 
        每一次请求服务器都会开启一个新的线程并执行一次service方法,service根据客户端的请求类型,调用doGet、doPost等方法。 
        service是由web容器来调用的,我们无需对service具体内容做任何处理,service会自动的根据客户端的请求类型去调用doGet、doPost等方法,所以我们只需要做好doGet、doPost方法的实现就可以了。

destroy方法
        该方法在整个生命周期中,也是只会被调用一次,在Servlet对象被销毁是调用,在servlet中,我们可以做一些资源的释放等操作,执行destory方法之后的servlet对象,会等待jvm虚拟机的垃圾回收机制择时回收。

doGet、doPost方法
        实际的业务处理流程,service根据客户端的请求类型来自动匹配需要执行那个方法。

1、什么是生命周期?

生命周期表示一个java对象从最初被创建到最终被销毁,经历的所有过程。

2、Servlet对象的生命周期是谁来管理的?程序员可以干涉吗?
Servlet对象的生命周期,javaweb程序员是无权干涉的,包括该Servlet对象的相关方法的调用,javaweb程序员也是无权干涉的。
Servlet对象从最初的创建,方法的调用,以及最后对象的销毁,这个过程,是由Web容器来管理的。
Web Container管理Servlet对象的生命周期。

3、“默认情况下”,Servlet对象在WEB服务器启动阶段不会被实例化。【若希望在Web服务器启动阶段实例化Servlet对象,需要进行特殊的设置】

4、描述Servlet对象的生命周期
1)用户在浏览器中输入Serlvet的URL
2)web容器截取请求链接
3)web容器在容器上下文中找请求路径对应的Servlet对象
4)若没有找到对应的Servlet对象
    4.1)通过web.xml文件中的相关配置信息,得到请求路径对应的Servlet对象
    4.2)通过反射机制,调用Servlet类的无参构造方法完成Servlet对象的实例化
    4.3)web容器调用Servlet对象的init方法完成实例化操作
    4.4)web容器调用Servlet对象的service方法提供服务
5)若找到对应的Servlet对象
    5.1)web容器直接调用Servlet对象的service方法提供服务
6)web容器关闭的时候/webapp重新部署的时候/该Servlet对象长时间没有用户再次访问的时候,web容器会将该Serlvet对象销毁,在销毁该对象之前,web容器会调用Servlet对象的destory方法,完成销毁之前的准备。

5、总结:
5.1)Servlet类的构造方法只执行一次
5.2)Servlet对象的init方法只执行一次
5.3)Servlet对象的service方法,只要用户请求一次,则执行一次
5.4)Servlet对象的destory方法,只执行一次

6、注意
init方法执行的时候,Servlet对象已经被创建好了。
destory方法执行的时候,Servlet对象还没有被销毁,即将被销毁

7、Servlet对象是单例,但是不符合单例测试,只能称为伪单例。真单例的构造方法是私有化的,Tomcat服务器是支持多线程的。所以Servlet对象在单实例多线程的环境下运行的。那么Servelet对象中若有示例变量,并且示例变量涉及到修改操作,那么这个Servlet对象一定会存在线程安全问题,不建议在Servlet对象中使用实例变量,尽量使用局部变量。

Servlet 的生命周期 及 注意事项 总结的更多相关文章

  1. Servlet的生命周期以及线程安全问题

    一:Servlet生命周期图,以及注意事项 二:代码演示 LifeCycleServlet.java package cn.woo.servlet; import java.io.IOExceptio ...

  2. Servlet的生命周期及工作原理

    Servlet生命周期分为三个阶段: 1,初始化阶段  调用init()方法 2,响应客户请求阶段 调用service()方法 3,终止阶段 调用destroy()方法 Servlet初始化阶段: 在 ...

  3. Servlet的生命周期

    Servlet的生命周期 Servlet的生命周期是由tomcat服务器来控制的. 1 构造方法: 创建servlet对象的时候调用.默认情况下,第一访问servlet就会创建servlet对象只创建 ...

  4. Servlet的生命周期+实现方式

    1.Servlet的生命周期:        (1)被创建:            默认情况下,Servlet第一次被访问时,被服务器创建.会调用init()方法.                一个 ...

  5. Servlet基础(二) Servlet的生命周期

    Servlet基础(二) Servlet的生命周期 Servlet的生命周期可以分为三个阶段: 1.初始化阶段 2.响应客户请求阶段 3.终止阶段 Servlet的初始化阶段 在下列时刻Servlet ...

  6. JSP Servlet WEB生命周期

    [转载] JavaWeb的生命周期是由Servlet容器来控制的总的来说分为三个阶段1.启动阶段:加载web应用相关数据,创建ServletContext对象,对Filter和servlet进行初始化 ...

  7. servlet的生命周期与运行时的线程模型

    第 14 章 生命周期 注意 讲一下servlet的生命周期与运行时的线程模型,对了解servlet的运行原理有所帮助,这样才能避免一些有冲突的设计. 如果你不满足以下任一条件,请继续阅读,否则请跳过 ...

  8. Servlet/JSP-01 Servlet及其生命周期

    一.起步 1.新建一个类继承Servlet接口 public class HelloServlet implements Servlet { @Override public void destroy ...

  9. JavaWeb学习之Servlet(二)----Servlet的生命周期、继承结构、修改Servlet模板

    [声明] 欢迎转载,但请保留文章原始出处→_→ 文章来源:http://www.cnblogs.com/smyhvae/p/4140466.html 一.http协议回顾: 在上一篇文章中:JavaW ...

随机推荐

  1. es6的箭头函数转换为普通函数,以及将await/async函数转为普通函数

    箭头函数转为普通函数: 1. 安装babel-preset-es2015  npm install babel-preset-es2015 --save-dev 2.在.babelrc文件夹中:  & ...

  2. iOS无线真机调试

    打开xcode,选择Window > Devices and Simulators 用数据线连接设备 选择 Connect via network

  3. Mediator模式(仲裁者设计模式)

    Mediator ? Mediator的意思是"仲裁者""中介者".一方面,当发生麻烦事情的时候,通知仲裁者:当发生涉及全体组员的事情时,也通知仲裁者.当仲裁者 ...

  4. Sharepoint 根据文件相对路径获取、操作SPFolder

    public AjaxResult LoadDocInfo(HttpContext httpContext) { var result = new ArrayList(); try { var org ...

  5. 使用open live writer客户端写博客(亲测有效)

    博客都开了这么久了,才开始将资料上传,但是每次都要登录网页确实很麻烦,所以就用open live writer,使用起来真的是挺方便的,所以将我在安装配置时,发现的问题汇总起来以便日后再次碰到忘记怎么 ...

  6. vs2017通过snippet代码片断进行标准化注释

    我们在进行团队开发时,类的注释已经可以做到自定义了,详细看上篇文章<vs2017通过模块文件添加自定义注释>,而对于方法的注释,我们也需要完善一下,这里我们用到了“代码片断”插件,VS里有 ...

  7. 【JavaEE】tomcat部署项目的几种方式 .

    一.静态部署1.直接将web项目文件件拷贝到webapps 目录中     Tomcat的Webapps目录是Tomcat默认的应用目录,当服务器启动时,会加载所有这个目录下的应用.所以可以将JSP程 ...

  8. ASP编码规范

    ASP编码规范(--::) 第一章 ASP编码规范通述 ASP编码分为两大部分,一部分为静态文件编码,一部分为包含服务器端脚本的动态文件编码. 静态文件编码分script编码和HTML编码两部分. 服 ...

  9. 固定ip地址

    IP.  配置文件写数据库文件连接时,之前一直是就写个.  ; 毕竟之前就自己本地用.现在需要,写ip地址,但是公司点的ip的都是自动获得的.并且过一段时间还会改变. 所以,需要固定一下啊. 首先cm ...

  10. selenium+phantomjs报错:Unable to find a free port的分析和解决

    selenium+phantomjs报错:Unable to find a free port的分析和解决 Table of Contents 1. 现象 2. 分析 3. 解决办法 1 现象 在做项 ...