当前位置: 首页 > news >正文

Tomcat组件概念和请求流程

        Tomcat:是一个Servlet容器(实现了Container接口),容器分层架构从上到下分为。Engine(List<Host>)->Host(List<Context>)->Context(List<Wrapper>)->Wrapper(List<Servlet>);

        Engine:引擎,Servlet 的顶层容器,用来管理多个虚拟主机。只会存在一个。

        Host:虚拟主机,负责 web 应用的部署和 Context 的创建,一个虚拟主机下可以部署多个Web应用,不同的虚拟主机的访问日志可以放在不同的文件夹下。

        Context:Web应用,负责Web配置的解析,管理所有的Web资源。一个Context对应一个Web应用,为特定的Web应用处理所有的客户请求,管理Wrapper。

        Wrapper:某一种实例的Servlet,每一个Wrapper下面可能会有多个Servlet,每一个线程打进来都是一个Servlet。

        Servlet:java的服务端程序,用于编写程序员的业务逻辑。

5fef4ae196d24737831917b4edc8806a.jpeg

        Tomcat的使用:一般我们在使用Tomcat的时候,都会将一个war包放在Tomcat中的webApps目录下,然后去启动Tomcat(它会自动帮我们解压war包生成一个web应用),war包和jar包的区别在于:jar包大多数情况下被理解为一种依赖,但是也可以是一个web项目,但是如果你讲jarbao放在了Tomcat下,那么它是无法识别你到底是依赖还是web项目,所以Tomcat只能去解压war包/描述符/文件夹部署的这些情况从而生成web项目。

        Tomcat请求交互流程:

        客户端和服务端之间的数据交互本质上就是两个操作系统之间的交互,操作系统本身提供了socket接口(用于实现Tcp协议)用于建立连接保证两个操作系统之间的通信和数据交互。然后Http连接必须承载与socket连接之上,你必须在建立socket连接之后才可以实现Http连接,Http协议本身分为三块(请求行,请求头,请求体),Tomcat建立socket连接之后会将socket连接扔到线程池中去处理http请求,进行数据的解析(就是Http协议的解析),所以Http协议可以理解成一种数据格式,只有遵守这种数据格式的情况下,才能被Tomcat正常解析。

         Tomcat通过Endpoints从操作系统的缓存中读取数据(复制数据)至InputBuffer(Tomcat的缓存)中,然后基于InputBuffer将里面的数据进行解析,先解析请求行,然后将请求头中的请求方法,url,协议等信息解析完之后生成一个Request对象(Tomcat内部用到了门面模式)。将Request对象交给容器处理,容器最终甩到servlet中,servlet可以使用response对客户进行响应,然后重置处理InputBuffer中的pos和lastValid,这样方便处理下一个请求

       

 

 

相关文章:

  • 【Redis】初识 Redis
  • [JS]认识feach
  • 设计模式的七大原则
  • (图文详解)小程序AppID申请以及在Hbuilderx中运行
  • 【Linux】进程间通信——命名管道和共享内存
  • 2024年公共文化与社会服务国际会议(ICPCSS 2024)
  • 事务的学习
  • C#小结:未能找到类型或命名空间名“xxx”(是否缺少 using 指令或程序集引用?)
  • 容器docker 架构命令案例
  • 文心快码——百度研发编码助手
  • 大模型/NLP/算法面试题总结3——BERT和T5的区别?
  • WindowsMac共享文件夹设置
  • MSPM0G3507(三十六)——超声波PID控制小车固定距离
  • 景联文科技以高质量多模态数据集赋能AI大模型,精准匹配提升模型性能
  • 通用型I2C接口的应用之综合应用(N32G45XVL-STB)
  • 230. Kth Smallest Element in a BST
  • Angular4 模板式表单用法以及验证
  • IndexedDB
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • Js基础知识(四) - js运行原理与机制
  • Js基础知识(一) - 变量
  • mysql_config not found
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • PHP的Ev教程三(Periodic watcher)
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • win10下安装mysql5.7
  • yii2权限控制rbac之rule详细讲解
  • Zsh 开发指南(第十四篇 文件读写)
  • 分享一份非常强势的Android面试题
  • 高性能JavaScript阅读简记(三)
  • 关于使用markdown的方法(引自CSDN教程)
  • 诡异!React stopPropagation失灵
  • 简单基于spring的redis配置(单机和集群模式)
  • 开源地图数据可视化库——mapnik
  • 前端代码风格自动化系列(二)之Commitlint
  • 使用 @font-face
  • 赢得Docker挑战最佳实践
  • puppet连载22:define用法
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • $L^p$ 调和函数恒为零
  • (02)vite环境变量配置
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (day 12)JavaScript学习笔记(数组3)
  • (纯JS)图片裁剪
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (转)Oracle存储过程编写经验和优化措施
  • (转)大道至简,职场上做人做事做管理
  • .bat文件调用java类的main方法