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

Tomcat结构及处理请求过程

        Tomcat是一个基于组件形式的的Web容器,由Server(服务器)、Service(服务)、Connector(连接器)、Engine(引擎)、Host(主机)、Context(应用服务)组成,它们在server.xml里都有配置。

 Tomcat的请求过程如图:


Server:代表整个Tomcat,它包含所有的容器;

Service:相当于一个集合,包含多个Connector(连接)、一个Engine(引擎),它还负责处理所有Connector(连接)获取的客户请求;

Connector:一个Connector(连接)在指定的接口上侦听客户的请求,并将客户的请求交给Engine(引擎)来进行处理并获得回应返回给客户请求;

Engine:一个Engine(引擎)下可以配置多个虚拟主机Host,每个主机都有一个域名,当Engine获得一个请求时,会把这个请求发送的相应的Host上,Engine有一个默认的虚拟主机,如果没有虚拟主机能够匹配这个请求,那就由这个默认的虚拟主机来进行处理请求;

Host:代表一个Virtual host,每个虚拟主机都和某个网络域名想匹配,每个虚拟主机下面可以部署一个或者多个web app,每个web对应一个context,有一个context path,当一个host获取请求时,就把该请求匹配到某个context上;

Context:一个context对应一个web aplication,一个web由一个或多个servlet组成,Context在创建的时候将根据配置文件CATALINA_HOME/conf/web.xml和WEBAPP_HOME/WEB-INF/web.xml载入servlet类,当context获取请求时,讲在自己的映射表中需找相匹配的servlet类,如果找到,则执行该类,获得请求的回应,并返回。

处理请求过程

现在我来模拟Tomcat处理一个Http请求的过程:

设置一个来自客户端URL:http://localhost:8080/webgateway/index

  1. 服务器8080端口接收到客户发来的请求,被一个在那里监听的叫HTTP1.1的Connector获取了这个链接请求;
  2. Connector把请求交给同在Service下的Engine去处理,并等待Engine的响应;
  3. Engine把url解析,并把请求传给相对应的Host处理,如果没有相对应的Host,则用默认名叫localhost的Host来处理;
  4. Host再把url解析为/webgateway/index.html,匹配context-path为/webgateway的Context去处理(如果匹配不到就把该请求交给路径名为””的Context去处理);
  5. context-path为/webgateway的Context会匹配Servlet Mapping为/index的Servlet处理;
  6. 构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用Servlet的doGet或doPost方法;
  7. Context把处理完的HttpServletResponse对象返回给Host;
  8. Host把HttpServletResponse对象返回给Engine;
  9. Engine把HttpServletResponse对象返回给Connector;
  10. Connector把HttpServletResponse对象返回给客户browser。


转载自:http://objcoding.com/2017/06/12/Tomcat-structure-and-processing-request-process/

相关文章:

  • Spark Rdd coalesce()方法和repartition()方法
  • 基于Oracle的SQL优化--学习(一)
  • 基于Oracle的SQL优化--学习(二)
  • MySQL案例-show fileds from 提示无权限
  • B+树的数据结构理解
  • 基于Oracle的SQL优化--学习(三)
  • 打 spice 的 deb 格式安装包的时遇到的问题和解决方法
  • 基于Oracle的SQL优化--学习(四)
  • 基于Oracle的SQL优化--学习(五)
  • 基于Oracle的SQL优化--学习(六)
  • (转载)hibernate缓存
  • 基于Oracle的SQL优化--学习(七)
  • 基于Oracle的SQL优化--学习(八)
  • MySQL数字类型中的三种常用种类【转】
  • linux mmap 内存映射【转】
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • 2019年如何成为全栈工程师?
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • FastReport在线报表设计器工作原理
  • Flex布局到底解决了什么问题
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • nodejs:开发并发布一个nodejs包
  • SpingCloudBus整合RabbitMQ
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 免费小说阅读小程序
  • 我与Jetbrains的这些年
  • 最近的计划
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (1)常见O(n^2)排序算法解析
  • (13)Hive调优——动态分区导致的小文件问题
  • (52)只出现一次的数字III
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (第一天)包装对象、作用域、创建对象
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • .“空心村”成因分析及解决对策122344
  • .net core webapi 大文件上传到wwwroot文件夹
  • .NET Core 通过 Ef Core 操作 Mysql
  • .Net Core和.Net Standard直观理解
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .NET 的程序集加载上下文
  • .NET 设计模式初探
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .net反混淆脱壳工具de4dot的使用
  • .NET中的十进制浮点类型,徐汇区网站设计
  • .net中我喜欢的两种验证码