首页 > 其他分享 >浅析 Servlet 执行原理

浅析 Servlet 执行原理

时间:2023-07-05 16:32:26浏览次数:39  
标签:容器 请求 doGet 线程 原理 执行 Servlet 浅析

在JavaWeb学习研究中,Servlet扮演重要的作用,学好它,是后续JavaWeb学习的良好基础。无论是SSH,还是SSM,微服务JavaWeb技术,都应先学好Servlet,从而达到事半功倍的效果,本篇将主要分析Servlet的运行原理。


一、UML


下图为Servlet UML关系图。

浅析 Servlet 执行原理_抽象类

从图中,可以看出:


1. 抽象类HttpServlet继承抽象类GenericServlet,其有两个比较关键的方法,doGet()和doPost()


2. GenericServlet实现接口Servlet,ServletConfig,Serializable


3. MyServlet(用户自定义Servlet类)继承HttpServlet,重写抽象类HttpServlet的doGet()和doPost()方法


注:任何一个用户自定义Servlet,只需重写抽象类HttpServlet的doPost()和doGet()即可,如上图的MyServlet


二、Servlet在容器中的执行过程

Servlet只有放在容器中,方可执行,且Servlet容器种类较多,如Tomcat,WebLogic等。下图为简单的 请求响应 模型。

浅析 Servlet 执行原理_生命周期_02

分析:


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


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


3. 容器逻辑根据url找到目标Servlet(本示例目标Servlet为ServletA),且创建一个线程A


4. 容器逻辑将刚才创建的请求对象和响应对象传递给线程A


5. 容器逻辑调用Servlet的service()方法


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


7. doGet()执行完后,将结果返回给容器逻辑


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


注意:


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


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


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


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


三、Servlet在JavaWeb中扮演的角色


Servlet在JavaWeb中,扮演两个角色:页面角色和控制器角色。


有了jsp等动态页面技术后,Servlet更侧重于控制器角色,jsp+servlert+model 形成基本的三层架构


(一)页面Page角色


protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out=response.getWriter();
        out.println("Hello!Servlet.");
    }


(二)控制器角色

jsp充当页面角色,Servlet扮演控制器角色,两者组合构建基本的MVC三层架构模式

浅析 Servlet 执行原理_生命周期_03

四、Servlet在容器中的生命周期


下图为Servlet生命周期简要概图

浅析 Servlet 执行原理_生命周期_04

分析:


第一步:容器先加载Servlet类


第二步:容器实例化Servlet(Servlet无参构造函数执行)


第三步:执行init()方法(在Servlet生命周期中,只执行一次,且在service()方法执行前执行)


第四步:执行service()方法,处理客户请求,doPost()或doGet()


第五步:执行destroy(),销毁线程

标签:容器,请求,doGet,线程,原理,执行,Servlet,浅析
From: https://blog.51cto.com/u_16173732/6632903

相关文章

  • Spring Loaded代码热更新实践和原理分析
    1、引言开发者在编码效率和快速迭代中的痛点场景包括:修改代码后,需要频繁重启应用,导致开发效率低下;实时调试时,不能立即看到代码修改的结果;大型项目中,重启的时间成本较高。针对这些问题,本文将深入探讨如何利用SpringLoaded热更新技术提高开发效率,减少编译和重启时间。......
  • prometheus描点原理
    大家好,我是蓝胖子,关于prometheus的入门教程有很多,拿我之前学prometheus的经历来讲,看了很多教程,还是会对prometheus的描点以及背后的统计原理感到迷惑,所以今天我们就来分析下这部分,来揭开其神秘的面纱。我们先来看看prometheus里的数据模型是怎么样的,只有知道了数据结构,才能理解......
  • vue渲染原理简单实现
    实现功能:1.渲染系统:·功能一:h函数,用于创建并返回一个VNode(虚拟对象);·功能二:mount函数,用于将VNode挂载到节点上;·功能三:patch函数,用于对比两个VNode,决定该如何处理新的VNode;1.新建一个index.html的页面其中有一个id为app的div元素,之后我们写的所有DOM都会挂载到此元素......
  • 浅析EasyCVR视频技术与AR实景智能管理平台在智慧厂区中的应用
    一、背景分析新型智慧厂区是运用人工智能、大数据、物联网和设备监控技术加强厂区安保和信息管理。通过先进技术,保障厂区生产运营安全,同时减少生产线上的人工干预、及时正确地采集各类生产数据,以及合理的生产计划编排与生产进度,并且整合各业务系统数据资源,构建一个高效智能、绿色......
  • 分布式数据库 Join 查询设计与实现浅析
    相对于单例数据库的查询操作,分布式数据查询会有很多技术难题。本文记录Mysql分库分表 和ElasticsearchJoin查询的实现思路,了解分布式场景数据处理的设计方案。文章从常用的关系型数据库MySQL的分库分表Join分析,再到非关系型ElasticSearch来分析Join实现策略。逐步......
  • jsp+servlet
    1.jsp的执行过程步骤一:翻译(jsp文件翻译成java文件)步骤二:编译(java文件编译成class文件)步骤三:执行(执行class(字节码)文件)2.在jsp中实现日期输出在网页上<%SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-ddhh:mm:ss");Stringdatenow=sdf.format(newDate())%><%=da......
  • Servlet 执行流程及文件配置。
    目录 1、基本介绍 2、执行流程 3、生命周期 4、Servlet的5个方法 5、体系结构 6、urlPattern配置 7、XML配置1、基本介绍▶简介 Servlet是JavaWeb最为核心的内容,它是Java提供的一门动态web资源开发技术。使用Servlet就可以实现,根据不同的登录用户在页面上动态显示不同内容......
  • mybatis的原理
    MyBatis是一个持久层框架,它的工作原理是:1.首先,MyBatis从XML映射文件中读取SQL语句,将其解析成SQL语句对象,并将SQL语句对象存储在内存中。2.然后,MyBatis将SQL语句对象与用户提供的参数绑定,生成完整的SQL语句。3.接着,MyBatis将SQL语句发送给数据库,并将查询结果映射到Jav......
  • KD树——k=1时就是BST,里面的数学原理还是有不明白的地方,为啥方差划分?
     Kd-Tree,即K-dimensionaltree,是一棵二叉树,树中存储的是一些K维数据。在一个K维数据集合上构建一棵Kd-Tree代表了对该K维数据集合构成的K维空间的一个划分,即树中的每个结点就对应了一个K维的超矩形区域(Hyperrectangle)。在介绍Kd-tree的相关算法前,我们先回顾一下二叉查找树(BinaryS......
  • ASL单芯片CS5366TypeC转HDMI4K60HZ加HUB多口方案|CS5366带PD拓展方案原理图
    CS5366芯片是ASL集睿致远最新推出的2Len带PD的扩展坞方案芯片,CS5366支持4K60HZ。在分辨率4K下,刷新率60HZ对于30HZ看似提升不多,但是对于应用在游戏主座的客户来说至关重要,现在年轻一代消费力强,也注重享受和体验,博主自己也打游戏,相信大家都知道流畅度的重要性。市面上TypeC扩展坞......