【仿写框架之仿写Tomact】一、详解Tomcat的工作流程

news2025/1/12 17:39:29

文章目录

  • 1、启动阶段
  • 2、监听阶段:
  • 3、请求处理阶段:
  • 4、发送请求处理后的响应

当涉及到Java Web应用程序的部署和运行,Apache Tomcat无疑是一个备受欢迎的选择。Tomcat作为一个开源的、轻量级的Java Servlet容器和JavaServer Pages (JSP) 容器,扮演着连接用户和应用程序的重要角色。本篇文将向大家阐述Tomcat的执行流程,从启动到请求处理再到关闭,帮助您更好地理解Tomcat在Java Web开发中的作用。

1、启动阶段

在启动阶段,他会扫描webapp目录下的所有子目录和子文件,然后把这个目录下的 .class 文件挑选出来,拿到每个java类的类路径(全限定名),然后for循环遍历这些类路径,通过反射,得到相应的类对象,然后从Class类信息里去获取注解信息,拿到注解信息之后看哪些java的类信息里面有@WebServlet注解,把这些java文件挑选出来。通过newInstance() 生成类的实例,它代替了new操作,为什么这些环节没办法使用直接new的方式而是要用newInstance() 呢,使用 new 的前提是要知道类的名字和它的包路径,很可惜tomcat的开发者事先不知道使用者创建的 servlet 叫什么名字以及所在包是什么,所以 new是不能使用的,才有了newInstance() 的方式生成实例。 生成servlet实例的时候,又进一步通过方法的实例拿到了它里面的 method实例,method实例里面挑选出 doGet 和 doPost实例,同时上面也拿到了注解里的路径值,然后把它们放到了 hashMap 中,其中 key值就是注解里的路径,value值就是对象实例信息。除了method实例,servlet实例也存在hashMap中,method实例和servlet实例对应的key值都是注解的路径。

2、监听阶段:

  • Tomcat根据配置的Connector信息创建并启动监听网络连接的组件,如HTTP Connector。
    Tomcat进入等待状态,开始监听来自客户端的HTTP请求。

3、请求处理阶段:

当有HTTP请求到达时并不是立即开启线程处理的,而是把它放入线程池中。每个线程在工作时,首先把通过端口传过来的 http字符信息封装成 httpRequest 对象和 httpResponce对象,同时提取出请求的 URL ,把URL中的 ip、端口、项目名字去掉剩下的就是要请求的servlet地址或前端地址。如果请求的是前端资源那么会根据请求路径去相应的目录下找前端文件,之后按照相应的编码读取里面的字符串返回给前端;如果请求的是servlet 那么会根据URL去之前启动阶段的 hashMap里匹配Class对象,提取出来之后执行代理。tomcat通过invoke()方法完成了 servlet的调用。

4、发送请求处理后的响应

在业务逻辑处理完成后,Servlet或JSP生成HTTP响应,包括状态码、响应头和响应体。这些内容被封装在HTTP响应对象中,返回给客户端。

Tomcat在启动时,
会先加载配置文件:
读取配置文件中的参数如服务器的端口、线程池核心线程数、最大线程数、非核心线程存活时间、存活时间单位、每个线程的前缀名等。我将这些参数以参数名为key,参数值为value,保存在一个 map集合中,用于创建连接器和线程池时做配置。

创建连接器:
根据配置文件中的连接器设置,Tomcat会创建连接器,这些连接器负责监听指定的端口,接收来自客户端的HTTP请求。

创建线程池:
线程池的参数我在手写时放在了一个单独的线程池工具类中,每个属性都初始了默认值,定义一个无参构造器,如果配置文件中声明了参数的值,那么对应属性就使用配置文件里参数的值,否则还使用默认值.

然后初始化servlet容器:
先将项目中所有以.java结尾的文件扫描出来,保存每个java文件的全限定名。然后遍历这些全限定名,每遍历一个全类名,先通过Class.forName(“全限定名”)反射获得类对象,得到类对象我们就可以获得该类的所有类信息,然后判断这个类是否标记了@WebServlet注解,如果标记了这个注解,通过newInstance() 生成servlet实例(因为事先不知道开发人员创建的servlet叫什么以及所在包是什么)
以@WebServlet注解中路径为Key,servlet实例为value put进一个装路径和servlet实例的hashMap中
生成servlet实例的时候,又进一步通过方法的实例拿到了它里面的 method实例,method实例里面挑选出 doGet 和 doPost实例,同时上面也拿到了注解里的路径值,然后把它们放到了装方法实例的 hashMap 中,其中 key值就是注解里的路径,value值就是对象实例信息。
遍历完成后,servlet容器初始化完成。

接下来是请求转发阶段:
tomcat负责接收来自网络的请求,通过socket监听端口.当接收到HTTP请求后,并不是立即开启线程去处理请求,而是把请求放入线程池中.由里面的线程去处理.

每个线程的工作是,首先把通过端口传过来的 http字符信息封装成 httpRequest 对象和 httpResponse对象,同时提取出请求的 URL ,把URL中的 ip、端口、项目名字去掉剩下的就是要请求的servlet地址或前端地址。如果请求的是前端资源那么会根据请求路径去相应的目录下找前端文件,之后按照相应的编码读取里面的字符串返回给前端;如果请求的是servlet 那么会根据URL去之前启动阶段的 hashMap里匹配 servlet实例和 method对象,提取出来之后执行代理, method.invoke(obj,HttpServletRequest, HttpServletResponse)
tomcat通过invoke()方法完成了 servlet的调用。doGet() 和doPost() 方法都是void方法没有返回值,统一将返回内容写入httpResponse对象中,然后返回给浏览器.

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

排兵布阵很重要

以正合,以奇胜,排兵布阵很重要 【安志强趣讲《孙子兵法》第17讲】 第五章:势篇 【全文趣讲大白话】 善于打仗,能恰当的分兵,能借势。 【原文】 孙子曰:凡治众如治寡,分数是也;斗众如…

SFL214-100-21-10喷嘴挡板伺服阀

SFL214-100-21-10、SFL214-150-21-15、SFL214-100-32-40、SFL214-100-21-40、SFL216-230-21-40、SFL216-230-32-40采用千式力马达和两级液压放大器结构前置级为无摩撩副的双喷嘴挡板阀性能优良,动态响应高适用于对位置,力和速度进行闭环控制可用作三通阀…

函数的使用-1函数默认参数

在C中,函数的形参列表中的形参是可以有默认值的。 语法: 返回值类型 函数名 (参数 默认值){} 1. 如果某个位置参数有默认值,那么从这个位置往后,从左向右,必须都要有默认值 2. 如果函数声明有默…

FPGA实现10G万兆网TCP/IP 协议栈,纯VHDL代码编写,提供服务器和客户端2套工程源码和技术支持

目录 1、前言免责声明 2、我这里已有的以太网方案3、该TCP/IP协议栈性能常规性能支持多节点FPGA资源占用少数据吞吐率高低延时性能 4、TCP/IP 协议栈代码详解代码架构用户接口代码模块级细讲顶层模块PACKET_PARSING_10G模块ARP_10G模块DHCP_SERVER_10G和 DHCP_CLIENT_10G模块IG…

c语言实现双向链表

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、链表的分类1、 单向或者双向链表2、带头结点或者不带头结点的链表3、循环或者非循环链表 二、带头双向循环链表1、链表结点的结构体定义2、链表的初始化3、…

交换机的基本原理与配置(三)

目录 3. 交换机基本配置 3.1 交换机配置前的连接 3.2 Cisco交换机的命令行模式 3.3 交换机的常见命令 3. 交换机基本配置 交换机的基本配置介绍如下。 3.1 交换机配置前的连接 配置一台Cisco交换机的方法有多种,本节介绍通过Console(控制台)接口讲行配置的方式这…

PCIE超高速实时运动控制卡在六面外观视觉检测上的应用

市场应用背景 XPCIE1028超高速实时运动控制卡在六面外观检测高速视觉筛选中的应用,结合正运动技术提供的专用筛选机调试软件,可实现15000pcs/分钟的IO触发检测速度,只需简单参数设置,搭配图像采集硬件和视觉处理软件,…

交换机的基本原理与配置(一)

目录 简介 1. 数据链路层 1.1 数据链路层的功能 1.2 以太网的由来 1.3 以太网帧格式 简介 在讲解OSI参考模型的章节中,我们已经对以太网数据单元有了初步的认识,本章将在此基础 上进一步学习数据链路层的主要内容,并首次接触网络中的一个…

电商平台按关键字搜索商品淘宝京东拼多多api接口PHP示例

关键词搜索商品接口的作用是通过调用接口来实现在电商平台中进行商品搜索。具体而言,该接口可以提供以下功能和作用: 商品搜索:用户可以通过输入关键词,在电商平台上进行商品搜索。接口可以根据关键词对商品的名称、描述、标签等…

Mybatis动态之灵活使用

目录 ​编辑 1.MyBatis中的动态SQL是什么? 2.MyBatis中的动态SQL作用 3.代码演示 4. #和 $使用 2.1 #使用 ( 1 ) #占位符语法 ( 2 ) #优点#占位符语法在使用动态SQL时具有以下优点: 2.2 $使用 ( 1 ) $占位符语法 ( 2 ) $优点$占位符语法在使用动…

RabbitMQ 消费者

RabbitMQ的消费模式分两种:推模式和拉模式,推模式采用Basic.Consume进行消费,拉模式则是调用Basic.Get进行消费。   消费者通过订阅队列从RabbitMQ中获取消息进行消费,为避免消息丢失可采用消费确认机制 消费者 拉模式拉模式的实…

ChatGPT应用于高职教育的四大潜在风险

目前,ChatGPT还是一种仍未成熟的技术,当其介入高职教育生态后,高职院校师生在享受ChatGPT带来的便利的同时,也应该明白ChatGPT引发的风险也会随之进入高职教育领域,如存在知识信息、伦理意识与学生主体方面的风险与挑战…

轻松正确使用代理IP

Hey,亲爱的程序员小伙伴们!在进行爬虫时,你是否曾使用过别人的代理IP?是否因此慌乱,担心涉及违法问题?不要惊慌!今天我将和你一起揭开法律迷雾,为你的爬虫之路保驾护航。快跟上我的节…

C++核心编程——类和对象(二)、友元、多态、文件操作

C对象模型和this指针 4.3.1 成员变量和成员函数分开存储 在C中,类内的成员变量和成员函数分开存储 只有非静态成员变量才属于类的对象上 空类(类里面是空的),空对象占用内存空间为:1字节。 静态成员变量&#xff0…

简单屏幕共享 通过web screego windows 生成证书

生成证书用 linux 生成,在 windows 下使用 windows 生成证书 https://juejin.cn/post/6925006735933440014 下载地址 https://github.com/screego/server/releases 修改完配置后,运行 screego serve 需要修改的几个地方 # 局域网 ip 或公网 ip&…

PHP请求API接口对接电商平台亚马逊国际站按关键字搜索商品案例

关键词搜索商品API接口的用途主要包括以下几个方面: 实现商品搜索:通过关键词搜索商品API接口,电商平台可以为消费者提供一个简单、快捷的商品搜索功能。用户只需输入关键词,就可以得到与该关键词相关的商品列表。 提供便捷的商…

vue 转盘抽奖功能,可控制抽奖概率

实现逻辑: 思路:首先需要一个转盘,然后需要一个抽奖按钮定位在中间,图片提前设计或者用背景颜色代替(这里用的是图片,然后计算概率),使用css完成转动效果,每次转动完成之…

谈谈收音机的发展

目录 1.什么是收音机 2.收音机的工作原理 3.收音机的发展历史 4.收音机的历史作用 1.什么是收音机 收音机是一种电子设备,用于接收和播放广播电台的无线电信号。它是人们获取各种音乐、新闻、娱乐和其他广播节目的常用设备。 收音机通常由以下几个部分组成&…

无涯教程-PHP - 简介

PHP 7是最期待的&#xff0c;它是PHP编程语言的主要功能版本。 PHP 7于2015年12月3日发布。本教程将以简单直观的方式教您PHP 7的新功能及其用法。 无涯教程假设您已经了解旧版本的PHP&#xff0c;现在就可以开始学习PHP 7的新功能。 使用下面的示例- <html><head&…