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

文章目录

  • 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.rhkb.cn/news/101673.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[保研/考研机试] KY124 二叉搜索树 浙江大学复试上机题 C++实现

题目链接&#xff1a; 二叉搜索树_牛客题霸_牛客网判断两序列是否为同一二叉搜索树序列。题目来自【牛客题霸】https://www.nowcoder.com/share/jump/437195121692722892652 描述 判断两序列是否为同一二叉搜索树序列 输入描述&#xff1a; 开始一个数n&#xff0c;(1<…

Sectigo EV代码签名申请步骤

一、EV代码签名申请前提 1、单位成立时间不低于&#xff1a;3个月 2、单位工商及企查查可查 3、单位经营正常 4、注册地址真实存在&#xff0c;禁止使用集中注册地址 5、企查查登记电话和邮箱&#xff0c;确定查询结果的电话可以接听、邮箱可以接收邮件&#xff0c;如果信…

行业追踪,2023-08-22

自动复盘 2023-08-22 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…

v8引擎编译全过程

环境vs2019 cmd 命令行需要设置成为代理模式 set http_proxyhttp://127.0.0.1:10809 set https_proxyhttp://127.0.0.1:10809 这个必须带上&#xff0c;不然报错&#xff0c;告诉编译器win系统的模式 set DEPOT_TOOLS_WIN_TOOLCHAIN0 源码 GitHub: GitHub - v8/v8: The…

SpringBoot复习:(53)TransactionInterceptor是在哪里配置的?

我们知道SpringBoot的事务(Transactional)最终是通过TransactionInterceptor的invoke方法调用invokeWithinTransaction方法来开启事务控制的。 TransactionInterceptor bean在哪里配置的呢&#xff1f;在ProxyTransactionManagementConfiguration: 可以看到这里创建了一个Tra…

SpringBoot 跨域问题和解决方法

Spring Boot 是一种用于构建独立的、生产级别的Java应用程序的框架。在开发Web应用程序时&#xff0c;经常会遇到跨域资源共享&#xff08;CORS&#xff09;问题。本文将详细介绍Spring Boot中的跨域问题以及相应的解决方法。 目录 什么是跨域&#xff1f;1. 使用Spring Boot…

常见前端面试之VUE面试题汇总二

4. slot 是什么&#xff1f;有什么作用&#xff1f;原理是什么&#xff1f; slot 又名插槽&#xff0c;是 Vue 的内容分发机制&#xff0c;组件内部的模板引擎使用 slot 元素作为承载分发内容的出口。插槽 slot 是子组件的一个模板 标签元素&#xff0c;而这一个标签元素是否显…

分类预测 | MATLAB实现DBN-SVM深度置信网络结合支持向量机多输入分类预测

分类预测 | MATLAB实现DBN-SVM深度置信网络结合支持向量机多输入分类预测 目录 分类预测 | MATLAB实现DBN-SVM深度置信网络结合支持向量机多输入分类预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.分类预测 | MATLAB实现DBN-SVM深度置信网络结合支持向量机多输入分…

LLaMA-7B微调记录

Alpaca&#xff08;https://github.com/tatsu-lab/stanford_alpaca&#xff09;在70亿参数的LLaMA-7B上进行微调&#xff0c;通过52k指令数据&#xff08;https://github.com/tatsu-lab/stanford_alpaca/blob/main/alpaca_data.json&#xff09;&#xff0c;在8个80GB A100上训…

【仿写tomcat】一、tomcat工作流程

仿写tomcat 简介tomcat简介流程分析tomcat是怎么和访问者交互的&#xff1f;流程图 简介 作者前不久刚仿写了一个简易的tomcat&#xff0c;在此分享给各位&#xff0c;此篇为对tomcat的简介和流程分析&#xff0c;具体仿写内容后续会贴在这里 扫描java文件&#xff0c;获取带…

常量变量习题答案

基础题目: 第一题 按步骤编写代码&#xff0c;效果如图所示&#xff1a; 编写步骤&#xff1a; 定义类 Test1定义 main方法控制台输出5行字符串类型常量值控制台输出5行字符类型常量值 参考答案&#xff1a; public class Test1 {public static void main(String[] args) {/…

TheGem主题 - 创意多用途和高性能WooCommerce WordPress主题/网站

TheGem主题概述 – 适合所有人的TheGem 作为设计元素、样式和功能的终极 Web 构建工具箱而设计和开发&#xff0c;TheGem主题将帮助您在几分钟内构建一个令人印象深刻的高性能网站&#xff0c;而无需触及一行代码。不要在编码上浪费时间&#xff0c;探索你的创造力&#xff01…

【Visual Studio】生成.i文件

环境 VS版本&#xff1a;VS2013 问题 如何生成.i预编译文件&#xff1f; 步骤 1、打开VS项目属性&#xff0c;打开C/C\预处理器页面&#xff0c;【预处理到文件】选择是&#xff0c;开启。 2、生成文件如下。 3、正常编译需要关闭此选项。

Azure VM上意外禁用NIC如何还原恢复

创建一个windows虚拟机&#xff0c;并远程连接管理员的方式打开powershell 首先查看虚拟网卡&#xff0c;netsh interface show interface 然后禁用虚拟网卡 ,netsh interface set interface Ethernet disable 去Azure虚拟机控制台&#xff0c;打开串行控制台 控制台中键入cmd,…

JAVA开发环境接口swagger-ui使用总结

一、前言 swagger-ui是java开发中生产api说明文档的插件&#xff0c;这是后端工程师和前端工程师联调接口的桥梁。生成的文档就减少了很多没必要的沟通提高开发和测试效率。 二、 swagger-ui的使用 1、引入maven依赖 <dependency><groupId>io.springfox</grou…

开源语音聊天软件Mumble

网友 大气 告诉我&#xff0c;Openblocks在国内还有个版本叫 码匠&#xff0c;更贴合国内软件开发的需求&#xff0c;如接入了国内常用的身份认证&#xff0c;接入了国内的数据库和云服务&#xff0c;也对小程序、企微 sdk 等场景做了适配。 在 https://majiang.co/docs/docke…

ubuntu 搜狗输入法安装 和 无法输入中文

一、下载搜狗输入法Linux版本。 搜狗输入法linux-首页 二、安装fcitx输入框架&#xff0c;及相关的依赖库 sudo apt install fcitx-bin sudo apt-get install fcitx-table sudo apt --fix-broken install 三、安装搜狗输入法 sudo dpkg -i sougou....deb 四、通过 设置&…

NPM 管理组织成员

目录 1、向组织添加成员 1.1 邀请成员加入您的组织 1.2 撤销组织邀请 2、接收或拒接组织邀请 2.1 接收组织邀请 2.2 拒绝组织邀请 3、组织角色和权限 4、管理组织权限 5、从组织中删除成员 1、向组织添加成员 作为组织所有者&#xff0c;您可以将其他npm用户添加到…

vim 配置环境变量与 JDK 编译器异常

vim 配置环境变量 使用 vim 打开系统中的配置信息&#xff08;不存在将会创建&#xff09;&#xff1a; vim ~/.bash_profile 以配置两个版本 JDK 为例&#xff08;前提是已安装 JDK&#xff09;,使用上述命令打开配置信息&#xff1a; 输入法调成英文&#xff0c;输入 i&…