tomcat原理、结构、设计模式

1 what

一种web服务器,运行java servlet、jsp技术,能为java web提供运行环境并通过http协议处理客户端请求。即tomcat = http服务器+ servlet容器。同类产品有jetty

  • Web应用:Web应用是指通过Web浏览器访问的应用程序,它使用Web技术和标准(如HTTP、HTML、CSS、JavaScript等)来提供用户界面和与用户的交互。Web应用可以包括前端和后端组件,前端负责用户界面和展示,后端负责业务逻辑和数据处理。
  • Servlet:Servlet是Java EE规范的一部分,它是一种运行在服务器端的Java程序,用于接收客户端(如Web浏览器)的请求、处理这些请求(包括访问数据库、调用业务逻辑等),并返回响应给客户端。Servlet是构建动态Web内容的核心技术之一

2 结构

连接器connector+容器container

容器就是engine、host、context、servlet/wrapper

所以架构就是service(8080端口)、connector、engine、host(http:localhost.com)、context(/mvc,一个web应用程序)、servlet/wrapper(/add,一个servlet)

f090bd57045f4088948e1e7da63585ca.png

 

3 关键组件

3.1 connector

3.1.1 Endpoint

用于:网络层通信tcp/ip,如NIO\NIO2

3.1.2 Processor

用于:应用层协议解析,如http

3.1.3 Adapter

用于:统一转换。tomcat request/response 转为servlet request/response,从而传给容器container。

  • servlet request是Java Servlet API 中的一个关键接口。
  • Java Servlet API是Java EE(现称为Jakarta EE)中用于开发服务器端Java应用程序的一套接口和类。Servlet是JavaWeb的三大组件之一(Servlet、Filter、Listener),它主要用于处理客户端的请求并生成响应。

3.2 设计模式

3.2.1 变动点和不变点的设计思路

不变点用抽象类、接口(如ProtocoHanlder、AbstrctProtocol),变点用具体类实现(如Http11NioProtocol、Http11Nio2Protocol)

47fd583736914b5e9911f0e38c739565.png

27e141a1618a4d7b8977cd9fc5a4f24a.png

f646124c6f57416c8648621ea75dbfa3.png

2357e1b0231e4de2b32e8c70f79b00b6.png

6fc9747fa2b14a649d16a3e70e00650d.png

d81414cef6f5481a87660f58599c0e96.png

3.2.2 适配器模式

Adapter,tomcat用CoyoteAdapter。


3.2 container

3.2.1 如何管理engine、host、context、servlet,用组合模式,让他们都实现Container

  • 组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构以表示“部分-整体”的层次结构。在这种模式中,客户端对单个对象和复合对象的使用具有一致性,即客户端能够以相同的方式处理单个对象和它们的组合。

说白了就是,用一个类/接口组装成树结构(有父子关系),这就是组合了,然后因为都是实现同一个接口,所以对每个部分的调用都是一样的。如下图

d785e0ea64ad4fb6952f9460fcbef154.png

3.2.2 engine、host、context、servlet是顺序调用,用的是责任链模式Pipeline-Valve

pipeline是责任链,是队列,队列中的元素是valve。valve能执行处理逻辑,并转给下一个value。

valve和filter的区别:valve是tomcat的,filter是java servlet api的。valve工作再web容器级别,拦截所有应用请求,filter工作在应用级别,拦截某个web应用请求

08b1200a4585496e98a08c964952573a.png

3635bb9b0a7c46a1997621631c00212c.png

acb7a18568bd41c1b4ded295aeee2060.png

d28296d8ebba41d5acc6c209df8c0538.png

3.2.3 engine管生命周期和分配请求

分配请求:映射mapper组件。根据url一层层找到对应的wrapper。

生命周期:负责容器创建、初始化、启动、销毁等。每个Container都继承了LifeCycle。所以也是个组合模式。

还用到了观察者模式(监听变更生命周期状态)、

组合模式(树结构即有父子关系)、

模板设计模式(写通用模板(通用逻辑),模板里面调用新方法,新方法走具体实现)

 

4 架构设计

  1. 罗列需求
  2. 面向对象设计类
  3. 找出需求中的变动点和不变点
  4. 变动点用抽象类,不变点用具体类实现

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/782758.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

c#类型转换和常见集合类型

目录 1. 整数转换,整数和字符串,字符串和整数之间的转换怎么实现? 2. 日期转换,获取当前日期,字符串转日期,日期转字符串怎么实现? 3. 举例一维、二维、三维数组 4. 需求:有个88…

【嵌入式单片机】之RS-232、RS-485、RS-422比较

1. RS422是什么 RS422,正式名称为TIA/EIA-422,是一种串行通信标准,专为实现长距离、高可靠性的数据传输而设计。它采用差分信号传输技术,通过两对双绞线实现全双工通信,即发送和接收可以同时进行。RS422在工业自动化和远程监控系统中曾经扮演着重要角色,以其出色的抗干扰…

p标签文本段落中因编辑器换行引起的空格问题完美解决方案

目录 1.修改前的代码:2.修改后的代码3.总结 在HTML文档中,如何要在(p标签)内写一段很长的文本段落,并且没有 换行。由于IDE或者编辑器界面大小有限或需要在vue中逻辑处理动态显示文本,一行写完太长&#x…

14-46 剑和诗人20 – 减少幻觉的提示词工程

​​​​​ 概述 幻觉或“编造”是大型语言模型 (LLM) 的常见故障模式,它们会产生事实上不正确或无意义的内容。幻觉背后的一些主要原因是: 当模型不确定真正的答案时,它会试图通过捏造信息来提供过度的帮助。该模型缺乏适当的基础、背景和…

YOLOv5、v7、v8如何修改检测框文字颜色和大小

YOLOv5和YOLOv8默认的标签文字颜色为白色,但是在亮度较大的图片中文字不明显,就需要对标签文字的颜色进行修改 一、YOLOv5 打开X:\Anaconda\envs\your-env\Lib\site-packages\ultralytics\utils\plotting.py X代表你的anaconda安装的盘,yo…

格蠹汇编阅读理解

一、调试工具使用方式 WinDbg常用命令: 执行 lm 命令,可以看到进程中有几个模块。执行~命令列一下线程。用!heap 命令列一下堆。执行!address 命令可以列出用户态空间中的所有区域。搜索吧!就从当前进程用户态空间的较低地址开始搜&#xf…

基于大数据技术Hadoop的气象分析可视化大屏设计和实现

博主介绍:硕士研究生,专注于信息化技术领域开发与管理,会使用java、标准c/c等开发语言,以及毕业项目实战✌ 从事基于java BS架构、CS架构、c/c 编程工作近16年,拥有近12年的管理工作经验,拥有较丰富的技术架…

Android - 手势

Android 提供特殊类型的触摸屏事件,例如捏合、双击、滚动、长按和退缩。 这些都被称为手势。 Android 提供了 GestureDetector 类来接收运动事件并告诉我们这些事件是否对应手势。 要使用它,您需要创建一个 GestureDetector 对象,然后使用 Ge…

SpringBoot源码阅读(1)——环境搭建

SpringBoot官网 官网 https://spring.io/projects/spring-boot 代码仓库 github:https://github.com/spring-projects/spring-boot gitee: https://gitee.com/mirrors/spring-boot 下载代码 git clone https://gitee.com/mirrors/spring-boot.git下载的代码中有些…

如何看自己电脑的ip地址?这些方法教你搞定

在数字化时代,网络已经成为我们生活中不可或缺的一部分。对于每一个接入网络的设备来说,IP地址就像是一个独特的身份证,它标识着设备在网络中的位置。对于电脑用户而言,了解如何查看自己电脑的IP地址,不仅有助于我们更…

满足信创环境运行的国产FTP服务器是什么样的?

2018 年以来,受“华为、中兴事件”影响,我国科技尤其是上游核心技术受制于人的现状对我 国经济发展提出了严峻考验。在全球产业从工业经济向数字经济升级的关键时期,中国明确 “数字中国”建设战略, 抢占数字经济产业链制高点。 在…

【Python】已解决:(paddleocr导包报错)ModuleNotFoundError: No module named ‘paddle’

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决:(paddleocr导包报错)ModuleNotFoundError: No module named ‘paddle’ 一、分析问题背景 近日,一些使用PaddleOCR库进行文字…

西安电子科技大学833、834学长经验分享(初复试总成绩第一、机试第二)

考研经验分享 首先自我介绍。2024考研上岸西安电子科技大学计算机学硕,初试成绩 390 分,复试成绩第一,初复试总成绩第一,机试第二,跟着研梦全程班上岸。 成绩单: 本文主要分为以下几个部分:【…

可视化作品集(09):可视化运维大屏不可或缺。

可视化大屏在可视化运维上有很多价值,而且应用十分普遍,本文给老铁们分享一下。 1. 实时监控:可视化大屏可以实时展示系统运行状态、设备状态、生产数据等信息,使运维人员能够及时发现问题并做出相应的处理。 2. 数据分析&#x…

资源分享—2021版三调符号库

汇总整理平台软件支持过程中客户项目提供的各类资源(包括但不限于符号库、地图模板等),在客户允许情况下进行集团内分享。 本次分享新版国土空间规划【三调符号库(2021版)】,提供SuperMap格式符号库下载。 …

2 ECMAScript

JavaScript 概述 JavaScript 编程语言允许你在 Web 页面上实现复杂的功能;如果你看到一个网页不仅仅显示静态的信息,而是显示依时间更新的内容,或者交互式地图,或者 2D/3D 动画图像,或者滚动的视频播放器,等等——你基本可以确定,这需要 JavaScript 的参与 JavaScript 编程语言…

GraalVM上的多语言混合开发

上篇文件我们介绍了GraalVM强大的静态编译功能,能够让Java应用程序摆脱虚拟机的束缚,像其它本地编译的应用一样直接运行。那么GraalVM的神奇之处仅限于此吗?今天我们再来看看它的另一个重要特性—多语言混合开发 多语言平台 Java并不是唯一运行在JVM上的语言,这个我们都应…

仿qq音乐播放微信小程序模板源码

手机qq音乐应用小程序,在线音乐播放器微信小程序网页模板。包含:音乐歌曲主页、推荐、排行榜、搜索、音乐播放器、歌单详情等。 仿qq音乐播放微信小程序模板源码

【前端界面分享】

实现效果:html源码来自b站up主:【CSSJS】甲方:啊?没叫你做那么超前啊_哔哩哔哩_bilibili 本人仅实现了将html格式改为vue3 html版: 对于前端连入门可能都没摸到,学了半天也就改成vue3了,对于输…

PCB阻抗控制为何如此重要?

或许你在各个厂商打PCB板的时候,会遇到询问你是否需要阻抗的的下单需求? 在当今的应用中,设计通常变得越来越快,控制布局参数比以往任何时候都更加重要。 在PCB设计和生产过程中,有几种方法可以进行阻抗控制。最常见的…