JavaWeb应用的生命周期由Servlet容器来控制,而Servlet作为JavaWeb应用的最核心的组件,其生命周期也由Servlet容器来控制。Servlet的生命周期可以分为3个阶段:初始化阶段、运行时阶段和销毁阶段。在javax.servlet.Servlet接口中定义了3个方法:init()、service()、destory(),它们将分别在Servlet的不同阶段被Servlet容器调用。

初始化阶段

Servlet的初始化包括4个步骤:

●  Servlet容器加载Servlet类,把它的.class文件中的数据读入到内存中。

●  Servlet容器创建ServletConfig对象。ServletConfig对象包含了特定Servlet的初始化配置信息,如Servlet的初始参数。此外,Servlet容器还会使得ServletConfig对象与当前Web应用的ServletContext对象关联。

●  Servlet容器创建Servlet对象。

●  Servlet容器调用Servlet对象的init(ServletConfig config)方法。在Servlet接口的GenericServlet实现类的init(ServletConfig config)方法中,会建立Servlet对象与ServletConfig对象的关联关系。

以上初始化步骤创建了Servlet对象和ServletConfig对象,并且Servlet对象与ServletConfig对象关联,而ServletConfig对象有与当前Web应用的ServletContext对象关联。当Servlet容器初始化完Servlet后,Servlet对象只要通过getServletContext()方法级就能得到当前Web应用的ServletContext对象。

在下列情况之一,Servlet会进入初始化阶段:

●  当前Web应用处于运行时阶段,特定Servlet被客户端首次请求访问。多数Servlet都会在这种情况下被Servlet容器初始化。

●  如果在web.xml文件中为一个Servlet设置了<load-on-startup>元素,那么当Servlet容器启动Servlet所属的Web应用是,就会初始化这个Servlet。以下代码配置了3个Servlet:Servlet1、Servlet2、Servlet3。

<servlet>

<servlet-name>servlet1</servlet-name>

<servlet-class>com.xdl.servlet.Servlet1</servlet-class>

</servlet>

<servlet>

<servlet-name>servlet2</servlet-name>

<servlet-class>com.xdl.servlet.Servlet2</servlet-class>

</servlet>

<servlet>

<servlet-name>servlet3</servlet-name>

<servlet-class>com.xdl.servlet.Servlet3</servlet-class>

</servlet>

其中Servlet1和Servlet2的<load-on-startup>的值分别为1和2,因此当Servlet容器启动当前Web应用是,Servlet1被第一个初始化,Servlet2被第二个初始化。而Servlet3没有配置<load-on-startup>元素,因此当Servlet容器启动当前Web应用时,Servlet3不会被初始化,只有当客户端首次请求访问Servlet3时,它才会被初始化。

从提高Servlet容器运行性能的角度出发,Servlet规范为Servlet规定了不同的初始化情形。如果有些Servlet专门负责在Web应用启动阶段为Web应用完成一些初始化操作,则可以让他们在Web应用启动时就被初始化。对于大多数Servlet,只需要当客户端首次请求访问时才被初始化。假设所有的Servlet都在Web应用启动时就被初始化,那么会大大增加Servlet容器启动Web应用的负担,而且Servlet容器有可能会加载一些永远不会被客户访问的Servlet,白白浪费容器的资源。

●  当Web应用被重新启动时,Web应用中的所有Servlet都会在特定的时刻被重新初始化。

运行阶段

这是Servlet的生命周期中最重要的阶段。在这个阶段,Servlet可以随时响应客户端的请求。当Servlet容器接收到要求访问特定Servlet的客户请求时,Servlet容器会创建针对这个请求的ServletRequest对象和ServletResponse对象,然后调用响应的Servlet对象的service()方法。service()方法从ServletRequest对象中获得客户请求信息并处理该请求,再通过ServletResponse对象生成响应结果。

当Servlet容器把Servlet生成的响应结果发送给了客户,Servlet容器就会销毁ServletRequest对象和ServletResponse对象。

销毁阶段

当Web应用被终止时,Servlet容器会先调用Web应用中所有Servlet对象的destory()方法,然后在销毁这个Servlet对象。在destory()方法的实现中,可以释放Servlet所占用的资源(例如关闭文件输入流和输出流,关闭与数据库的连接等)。

此外,容器还会销毁与Servlet对象关联的ServletConfig对象

在Servlet的生命周期中,Servlet的初始化和销毁只会发生一次,因此init()方法和destory()方法只会被Servlet容器调用一次,而service()方法可能会被Servlet容器调用多次,这取决于客户端请求访问Servlet的次数。

IT兄弟连 Java Web教程 Servlet的生命周期的更多相关文章

  1. IT兄弟连 Java Web教程 经典面试题2

    1.Servlet的工作流程? Servlet是运行在Servlet容器中的,由Servlet容器来负责Servlet实例的查找.创建以及整个生命周期的管理,Servlet整个生命周期可以分为四个阶段 ...

  2. java基础78 Servlet的生命周期

    1.Servlet的生命周期 简单的解析就是: 创建servlet实例(调用构造器)---->调用init()方法---->调用service()方法----->调用destroy( ...

  3. Java Web学习笔记-Servle生命周期

    Servlet会在服务器启动或第一次请求该Servlet的时候开始生命周期,在服务器停止的时候结束生命周期. 无论请求多少次Servlet,最多只有一个Servlet实例.多个客户端并发请求Servl ...

  4. IT兄弟连 Java Web教程 经典案例2

    案例需求:写一个用户登录的html页面有账号和密码,并在登录的Servlet中获取登录的账号和密码,如果账号是abc密码是123则向浏览器输出登录成功,否则向浏览器输出登录失败. 案例实现: ●  h ...

  5. IT兄弟连 Java Web教程 经典面试题

    1.什么是B/S结构?什么是C/S结构? B/S是Browser/Server的缩写客户机上只要安装—个浏览器(Browser)加Netscape Navigator或Internet Explore ...

  6. IT兄弟连 Java Web教程 Tomcat

    本文采用的Tomcat服务器版本是Tomcat8.5版本,Tomcat8.5支持Servlet3.1.JSP2.3以及EL3.0规范.并且Tomcat8.5版本对JDK8的支持比Tomcat8更加全面 ...

  7. IT兄弟连 Java Web教程 Web开发的相关知识

    Web基本概念 Web,是环球信息网的缩写,也称作“WWW.W3”,英文全称为World Wide Web,中文名成为万维网,常简称为Web.Web分为Web客户端和Web服务器程序.Web可以让We ...

  8. Java Web -- Servlet(5) 开发Servlet的三种方法、配置Servlet具体解释、Servlet的生命周期(2)

    三.Servlet的生命周期 一个Java servlet具有一个生命周期,这个生命周期定义了一个Servlet怎样被加载并被初始化,怎样接收请求并作出对请求的响应,怎样被从服务中清除.Servlet ...

  9. Java Web之Servlet技术

    1.Servlet基础 针对Servlet技术开发,Sun公司提供了一些列接口和类,其中最重要的是javax.servlet.Servlet接口,两个重要的包是javax.servlet和javax. ...

随机推荐

  1. java开始到熟悉70-71

    本次内容:file类 package array; /** * file类 */ import java.io.File; import java.io.IOException; public cla ...

  2. C语言连接MySQL(codeblocks)

    #include <stdio.h> #include <winsock2.h> #include <mysql.h> /*数据库连接用宏*/ #define HO ...

  3. php 0、null、empty和false之间的关系

    // 判断 0 与 ''.null.empty.false 之间的关系 $a = 0; echo "0 与 ''. empty.null.false 之间的关系:"; if($a ...

  4. php新版本号废弃 preg_replace /e 修饰符

    近期serverphp版本号升级到了 5.6  发现出了非常多警告 preg_replace(): The /e modifier is deprecated, use preg_replace_ca ...

  5. 我为什么不喜欢 CoreData

    我为什么不喜欢 CoreData   我一直不喜欢 Core Data,以前不太敢明目张胆地这么表达,现在收集到越来越多相关的信息,所以给大家分享一下,我为什么不喜欢 Core Data. Core ...

  6. 李洪强iOS开发之 - enum与typedef enum的用法

    李洪强iOS开发之 - enum与typedef enum的用法 01 - 定义枚举类型 上面我们就在ViewController.h定义了一个枚举类型,枚举类型的值默认是连续的自然数,例如例子中的T ...

  7. Redis java使用

    直接应用redis.clients:jedis的jar包到项目中,然后直接就可以使用,具体对五种类型的数据操作方法,可以翻代码找到. 连接到 redis 服务 实例 import redis.clie ...

  8. scrollTo(String text) and scrollToExact(String text) method of Android Driver not working

    Using the scrollTo(String text) and scrollToExact(String text) method of Android Driver. However the ...

  9. 设计模式学习笔记——Observer观察者模式

    观察者模式里面有两个东西:观察者(Observer)和目标(Subject).当目标发生变化的时候,观察者随之起舞,也作出相应的变化.此为观察者模式. 这是怎么做到的?主要是目标里面存有一份观察者的名 ...

  10. InspectIT_EUM 实现原理概述

    在Git上查看 InspectIT 实现原理概述: 实现原理详解:  1.jsAgent如何注入到浏览器 通过ASM框架修改HttpService.service()方法,加入相关逻辑,对每一个Htt ...