Servlet在容器中的执行过程


1.浏览器向服务器发出GET请求

2.服务器上的Tomcat接收到该url,根据该url判断为Servlet请求,此时Tomcat将产生两个对象:请求对象(HttpServletRequest)和响应对象(HttpServletResponce)

3.Tomcat根据url找到目标Servlet,且创建一个线程

4.Tomcat将刚才创建的请求对象和响应对象传递给该线程

5.Tomcat调用Servlet的service()方法

6.service()方法根据请求类型(本示例为GET请求)调用doGet()(本示例调用doGet())或doPost()方法

7.doGet()执行完后,将结果返回给Tomcat

8.线程被销毁或被放在线程池中

注意:

1.在容器中的每个Servlet原则上只有一个实例

2.每个请求对应一个线程

3.多个线程可作用于同一个Servlet(这是造成Servlet线程不安全的根本原因)

4.每个线程一旦执行完任务,就被销毁或放在线程池中等待回收



Servlet生命周期

Servlet的生命周期是由Tomcat容器管理的

a) 客户发出请求—>Web 服务器转发到Web容器Tomcat;

b) Tomcat主线程对转发来用户的请求做出响应创建两个对象:HttpServletRequest和HttpServletResponse;

c) 从请求中的URL中找到正确Servlet,Tomcat为其创建或者分配一个线程,同时把2创建的两个对象传递给该线程;

d) Tomcat调用Servlet的servic()方法,根据请求参数的不同调用doGet()或者doPost()方法;

e) 假设是HTTP GET请求,doGet()方法生成静态页面,并组合到响应对象里;
Servlet线程结束,Tomcat将响应对象转换为HTTP响应发回给客户,同时删除请求和响应对象。
从该过程中,我们可以理解Servlet的生命周期:Servlet类加载(对应3步);Servlet实例化(对应3步);调用init方法(对应3步);调用service()方法(对应4、5步);;调用destroy()方法(对应6步)。


Servlet运行在Servlet容器中,其生命周期由容器来管理。Servlet的生命周期通过javax.servlet.Servlet接口中的init()、service()和destroy()方法来表示。

Servlet的生命周期包含了下面4个阶段:

(1)加载和实例化

Servlet容器负责加载和实例化Servlet。当Servlet容器启动时,或者在容器检测到需要这个Servlet来响应第一个请求时,创建Servlet实例。当Servlet容器启动后,它必须要知道所需的Servlet类在什么位置,Servlet容器可以从本地文件系统、远程文件系统或者其他的网络服务中通过类加载器加载Servlet类,成功加载后,容器创建Servlet的实例。因为容器是通过Java的反射API来创建Servlet实例,调用的是Servlet的默认构造方法(即不带参数的构造方法),所以我们在编写Servlet类的时候,不应该提供带参数的构造方法。

(2)初始化

在Servlet实例化之后,容器将调用Servlet的init()方法初始化这个对象。初始化的目的是为了让Servlet对象在处理客户端请求前完成一些初始化的工作,如建立数据库的连接,获取配置信息等。对于每一个Servlet实例,init()方法只被调用一次。在初始化期间,Servlet实例可以使用容器为它准备的ServletConfig对象从Web应用程序的配置信息(在web.xml中配置)中获取初始化的参数信息。在初始化期间,如果发生错误,Servlet实例可以抛出ServletException异常或者UnavailableException异常来通知容器。ServletException异常用于指明一般的初始化失败,例如没有找到初始化参数;而UnavailableException异常用于通知容器该Servlet实例不可用。例如,数据库服务器没有启动,数据库连接无法建立,Servlet就可以抛出UnavailableException异常向容器指出它暂时或永久不可用。

(3)请求处理

Servlet容器调用Servlet的service()方法对请求进行处理。要注意的是,在service()方法调用之前,init()方法必须成功执行。在service()方法中,Servlet实例通过ServletRequest对象得到客户端的相关信息和请求信息,在对请求进行处理后,调用ServletResponse对象的方法设置响应信息。在service()方法执行期间,如果发生错误,Servlet实例可以抛出ServletException异常或者UnavailableException异常。如果UnavailableException异常指示了该实例永久不可用,Servlet容器将调用实例的destroy()方法,释放该实例。此后对该实例的任何请求,都将收到容器发送的HTTP 404(请求的资源不可用)响应。如果UnavailableException异常指示了该实例暂时不可用,那么在暂时不可用的时间段内,对该实例的任何请求,都将收到容器发送的HTTP 503(服务器暂时忙,不能处理请求)响应。

(4)服务终止

当容器检测到一个Servlet实例应该从服务中被移除的时候,容器就会调用实例的destroy()方法,以便让该实例可以释放它所使用的资源,保存数据到持久存储设备中。当需要释放内存或者容器关闭时,容器就会调用Servlet实例的destroy()方法。在destroy()方法调用之后,容器会释放这个Servlet实例,该实例随后会被Java的垃圾收集器所回收。如果再次需要这个Servlet处理请求,Servlet容器会创建一个新的Servlet实例。

在整个Servlet的生命周期过程中,创建Servlet实例、调用实例的init()和destroy()方法都只进行一次,当初始化完成后,Servlet容器会将该实例保存在内存中,通过调用它的service()方法,为接收到的请求服务。

Servlet运行原理相关推荐

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

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

  2. Servlet 运行原理

    文章目录 Servlet 如何运行 演示 Servlet 运行原理 Servlet 如何运行 用户向浏览器地址栏输入:http://ip:port/helloweb/sayHello?name=zs ...

  3. java启动servlet_Java Servlet 运行原理分析

    1 Servlet基本执行过程 Web容器(如Tomcat)判断当前请求是否第一次请求Servlet程序 . 如果是第一次,则Web容器执行以下任务: 加载Servlet类. 实例化Servlet类. ...

  4. Web开发基础_Servlet学习_0011_Servlet中的多线程安全问题与Servlet运行原理

    Servlet中的多线程安全问题 Servlet运行原理 Servlet中的多线程安全问题 演示 案例演示: 工程案例目录结构 pom.xml: <project xmlns="htt ...

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

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

  6. Servlet运行原理图解

  7. Servlet 的运行原理

    系列文章目录 如何创建一个Servlet项目(Maven)?_crazy_xieyi的博客-CSDN博客 Tomcat下载.安装及使用介绍_crazy_xieyi的博客-CSDN博客 文章目录 一.T ...

  8. web开发总结-Servlet与JSP(运行原理)

    文章结构:(1)剖析Servlet:(2)剖析JSP: 一.剖析Servlet: (1)概述: Servlet是一种独立于平台和协议的服务器端的Java应用程序,可以生成动态的web页面.它担当Web ...

  9. Servlet简介及其运行原理

    Servlet简介及其运行原理: 1.Servlet是什么?     Java Servlet是运行在Web服务器或应用服务器上的程序,它是作为来自Web浏览器或者其他HTTP客户端的请求和HTTP上 ...

  10. servlet的运行原理

    Servlet在容器中的执行过程 1.浏览器向服务器发出GET请求 2.服务器上的Tomcat接收到该url,根据该url判断为Servlet请求,此时Tomcat将产生两个对象:请求对象(HttpS ...

最新文章

  1. PHP 取302跳转后真实 URL 的两种方法
  2. SpringBoot-data-MongoDB 报错Please use ‘MongoMappingContext#setAutoIndexCreation(boolean)‘
  3. c语言实验11答案,c语言实验9-11参考答案
  4. warning: format not a string literal and no format arguments
  5. hashmap扩容线程安全问题_HashMap线程不安全的体现
  6. 旅游规划 (25 分)(Dijkstra)
  7. 遇到问题就请外援,汝作为高手的价值在哪里
  8. 垂直滤波和水平滤波的区别_无锡有源滤波器的功能是_灿勤科技
  9. Android JS交互-记录我所遇到的
  10. 盒式滤波器BoxFilter
  11. cesium 实现指南针及比例尺效果
  12. [RK3288][Android6.0] 调试笔记 --- 设置中文为默认输入法
  13. 知识图谱入门一:知识图谱介绍
  14. Vue 记账凭证模块组件
  15. Oracle 函数使用:CURSOR游标简单案例
  16. 纽曼平板 T9 ROOT过程
  17. ATFX:欧元兑土耳其里拉,历史最高价附近持续震荡
  18. 1.8 深入理解Surface系统
  19. 对kangle ep进行加固 安全防御 CC防御防注入防木马等操作
  20. javaWeb 使用线程池+队列解决订单并发问题

热门文章

  1. 车牌定位html5,车牌识别(一)——车牌定位(附详细代码及注释)
  2. Python算法学习教程
  3. JDK源码——JDK8源码编译全流程(linux)
  4. [转载]使用Java将Word转为Html或txt!
  5. JSON字符串和JSON对象的相互转换
  6. ArcPy常用函数梳理
  7. Excel可视化图表模板,图表控的你快收藏呀!!!
  8. linux sqluldr2命令,sqluldr2 linux64
  9. 联想教育应用使用说明(7.6版本)——第4章 网络控制工具的使用
  10. 套用这套模板,玩转周报、月报、年报更省事