Tomcat工作原理之运行机制

article/2025/9/14 0:54:30

一、Tomcat运行原理分析
1.Tomcat是运行在JVM中的一个进程。它定义为【中间件】,顾名思义,是一个在Java项目与JVM之间的中间容器。

2.Web项目的本质,是一大堆的资源文件和方法。Web项目没有入口方法(main方法),意味着Web项目中的方法不会自动运行起来。

3.Web项目部署进Tomcatwebapp中的目的是很明确的,那就是希望Tomcat去调用
写好的方法去为客户端返回需要的资源和数据。
4. Tomcat
可以运行起来,并调用写好的方法。那么,Tomcat一定有一个main方法。
5.
对于Tomcat而言,它并不知道我们会有什么样的方法,这些都只是在项目被部署进webapp下后才确定的,由此分析,必然用到了Java的反射来实现类的动态加载、实例化、获取方法、调用方法。但是我们部署到Tomcat的中的Web项目必须是按照规定好的接口来进行编写,以便进行调用

6.Tomcat如何确定调用什么方法呢。这取却于客户端的请求,http://127.0.0.1:8080/JayKing.Tomcat.Study/index.java?show这样的一个请求,通过http协议,在浏览器发往本机的8080端口,携带的参数show方法,包含此方法的路径为JayKing.Tomcat.Study,文件名为:index.java

二、模拟Tomcat运行

1.客户端类

package JayKing.Tomcat.Study;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class Client {private static int port = 5228;private static String host = "127.0.0.1";//http://127.0.0.1:8080/JayKing.Tomcat.Study/index.java?showpublic static void main(String[] args) {try {Socket con=new Socket(host,port);System.out.println("请输入URL地址:");Scanner scanner=new Scanner(System.in);String info=scanner.nextLine().trim();Writer writer = new OutputStreamWriter(con.getOutputStream());writer.write(info);writer.flush();writer.close();} catch (UnknownHostException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}


2.服务器类

package JayKing.Tomcat.Study;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.ServerSocket;
import java.net.Socket;public class TomcatTest {private static int post = 5228;private static UrlUtil urlutil = new UrlUtil();public static void main(String[] args) {System.out.println(" My Tomcat is Running");try {ServerSocket server = new ServerSocket(post);while (true) {Socket socket = server.accept();// 服务器每接受一次请求,就创建一个socket对象InputStream in = socket.getInputStream();BufferedReader br = new BufferedReader(new InputStreamReader(in));String info = null;String infoline = br.readLine();while (infoline != null) {info =info+infoline;infoline = br.readLine();}UrlBean url = urlutil.readString(info);if (url != null) {String path=url.getPath();String className = url.getFileName();String methodName = url.getParameter().trim();ClassLoader classloader=ClassLoader.getSystemClassLoader();	try {classloader.loadClass(path+"."+className);Class<?> getclass=Class.forName(path+"."+className);Method method=getclass.getMethod(methodName, null);method.invoke(getclass.newInstance(), null);} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (NoSuchMethodException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (SecurityException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalArgumentException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (InvocationTargetException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (InstantiationException e) {// TODO Auto-generated catch blocke.printStackTrace();}		} else {}}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}

3.工具类

package JayKing.Tomcat.Study;//格式:协议://主机号:端口号/目录路径/文件名
//例如: http://127.0.0.1:8080/Test/Manage/index.jsp
public class UrlUtil {public UrlBean readString(String info) {UrlBean url = null;int tag1 = info.indexOf(":");int tag2 = info.lastIndexOf(":");int tag3 = info.indexOf("/", tag2);int tag4 = info.lastIndexOf("/");int tag5 = info.indexOf("?");int tag6=info.lastIndexOf(".");String Protocol = info.substring(0, tag1);String Host = info.substring(tag1 + 3, tag2);String Port = info.substring(tag2 + 1, tag3);String Path = info.substring(tag3 + 1, tag4);String FileName = info.substring(tag4 + 1, tag6);String Parameter = info.substring(tag5 + 1, info.trim().length());if (Host != null && Path != null && FileName != null) {if (Protocol == null) {Protocol = "http";}if (Port == null) {Port = "8080";}url = new UrlBean(Protocol, Host, Port, Path, FileName, Parameter);return url;}return url;}
}
4.Model类
package JayKing.Tomcat.Study;//格式:协议://主机号:端口号/目录路径/文件名
//例如: http://127.0.0.1:8080/Test/Manage/index.jsp?a=1&b=2
public class UrlBean {private String Protocol;private String Host;private String Port;private String Path;private String FileName;private String Parameter;public UrlBean(String protocol, String host, String port, String path,String fileName, String parameter) {super();Protocol = protocol;Host = host;Port = port;Path = path;FileName = fileName;Parameter = parameter;}public UrlBean() {}public String getProtocol() {return Protocol;}public void setProtocol(String protocol) {Protocol = protocol;}public String getHost() {return Host;}public void setHost(String host) {Host = host;}public String getPort() {return Port;}public void setPort(String port) {Port = port;}public String getPath() {return Path;}public void setPath(String path) {Path = path;}public String getFileName() {return FileName;}public void setFileName(String fileName) {FileName = fileName;}public String getParameter() {return Parameter;}public void setParameter(String parameter) {Parameter = parameter;}
}
5.测试方法类
package JayKing.Tomcat.Study;
public class index {public void show() {System.out.println("方法已经被执行!");}
}

6.运行结果

 

 

三、Tomcat原理总结

1. Tomcat需要main方法启动。
2. Tomcat需要监听本机上的某个端口。
3. Tomcat需要抓取此端口上来自客户端的链接并获得请求调用的方法与参数。

4. Tomcat需要根据请求调用的方法,动态地加载方法所在的类,完成累的实例化并通过该实例获得需要的方法最终将请求传入方法执行。

5. 将结果返回给客户端(jsp/html页面、json/xml字符串)


 




http://chatgpt.dhexx.cn/article/UQNWKsjF.shtml

相关文章

tomcat 工作原理

大致的架构是 jsptomcatmysql&#xff0c;记录tomcat学习一点笔记。 Tomcat是Servlet运行环境&#xff08;容器&#xff09;&#xff0c;每个servlet执行init(),service(),destory() 以下是servlet的作用 Servlet的调用 Tomcat的工作模式3种&#xff1a;独立Servlet&#xff0c…

Tomcat的原理及架构

转自&#xff1a;https://zhuanlan.zhihu.com/p/35398064 俗话说&#xff0c;站在巨人的肩膀上看世界&#xff0c;一般学习的时候也是先总览一下整体&#xff0c;然后逐个部分个个击破&#xff0c;最后形成思路&#xff0c;了解具体细节&#xff0c;Tomcat的结构很复杂&#xf…

Tomcat基本原理

1.Tomcat核心&#xff1a; Http服务器Servlet容器 组件分工&#xff1a; 连接器Connector&#xff1a;处理 Socket 连接&#xff0c;负责网络字节流与 Request 和 Response 对象的转化。容器Container&#xff1a;加载和管理 Servlet&#xff0c;以及具体处理 Request 请求。 …

tomcat的工作原理

本文源自转载&#xff1a;你还记得 Tomcat 的工作原理么 一、Tomcat 整体架构 Tomcat 是一个免费的、开源的、轻量级的 Web 应用服务器。适合在并发量不是很高的中小企业项目中使用。 二、文件目录结构 以下是 Tomcat 8 主要目录结构 三、功能组件结构 Tomcat 的核心功能有…

Tomcat原理整理

目录接口 功能组件 Tomcat 的核心功能有两个&#xff0c;分别是负责接收和反馈外部请求的连接器 Connector&#xff0c;和负责处理请求的容器 Container。其中连接器和容器相辅相成&#xff0c;多个 Connector 和一个 Container 一起构成了基本的 web 服务 Service。每个 Serve…

Tomcat工作原理详细介绍

大部分企业的 Web 应用都运行在它上面&#xff0c;Tomcat 对于程序员来说算是老朋友了&#xff0c;那么今天带大家走近这位老朋友&#xff0c;看看它是如何处理 Web 请求&#xff0c;以及它内部的体系结构&#xff0c;这对帮助我们理解 Tomcat 的使用大有益处。 本文你将会学会…

Tomcat原理

Tomcat顶层架构 Tomcat的顶层结构图&#xff1a; 1、Tomcat中最顶层的容器是Server&#xff0c;代表着整个服务器&#xff0c;一个Server可以包含至少一个Service&#xff0c;用于具体提供服务。 2、Service主要包含两个部分&#xff1a;Connector和Container。 Tomcat 的心脏…

javascript 文本框限制输入1到10位数字正则表达式

<meta http-equiv"Content-Type" content"text/html; charsetUTF-8"> <!DOCTYPE html> <html> <head><title>DOM 教程</title><style></style><!--不需要再次引用jquery--><script type"te…

js数字正则

js正则表达式 1.了解什么是正则表达式&#xff1f; 正则表达式&#xff08;Regular Expression&#xff09;又称规则表达式&#xff0c;简单来说它就是一个概念&#xff0c;用事先声明好的字符和字符的组合&#xff0c;来组成一个“规则字符串”&#xff0c;用来检测我们书写…

卷积神经网络降维方法,深度神经网络降维方法

1、卷积神经网络中用1*1 卷积有什么作用或者好处 1*1卷积的主要作用有以下几点&#xff1a; 1、降维&#xff08; dimension reductionality &#xff09;。比如&#xff0c;一张500 * 500且厚度depth为100 的图片在20个filter上做1*1的卷积&#xff0c;那么结果的大小为500*5…

常用降维方法

降维方法分为线性核非线性降维&#xff0c;非线性降维又分为基于核函数和基于特征值的方法。 线性降维方法&#xff1a;PCA ICA LDA LFA LPP(LE的线性表示) 基于核函数的非线性降维方法&#xff1a;KPCA KICA KDA 基于特征值的非线性降维方法&#xff08;流型学习&#x…

机器学习四大数据降维方法详解

引言&#xff1a; 机器学习领域中所谓的降维就是指采用某种映射方法&#xff0c;将原高维空间中的数据点映射到低维度的空间中。降维的本质是学习一个映射函数 f : x->y&#xff0c;其中x是原始数据点的表达&#xff0c;目前最多使用向量表达形式。 y是数据点映射后的低维向…

机器学习 | 降维问题

目录 一、主成分分析 二、奇异值分解 2.1 奇异值分解原理 2.2 奇异值分解实践 三、特征值与特征向量 一、主成分分析 主成分有如下特征&#xff1a; 每个主成分是原变量的线性组合&#xff1b;各个主成分之间互不相关&#xff1b;主成分按照方差贡献率从大到小依次排列&…

数据降维方法总结

Introduce 经过这几天面试后&#xff0c;我发现数据降维这一块在工业界用的很多或者说必不可少&#xff0c;因此&#xff0c;这方面需要重点关注。今天&#xff0c;我将数据降维总结于此&#xff0c;包括他人成果&#xff0c;这里对他们的内容表示感谢。 Method 对数据降维作…

机器学习四大降维方法

引言&#xff1a; 机器学习领域中所谓的降维就是指采用某种映射方法&#xff0c;将原高维空间中的数据点映射到低维度的空间中。降维的本质是学习一个映射函数 f : x->y&#xff0c;其中x是原始数据点的表达&#xff0c;目前最多使用向量表达形式。 y是数据点映射后的低维向…

机器学习降维方法概括

最近刷题看到特征降维相关试题&#xff0c;发现自己了解的真是太少啦&#xff0c;只知道最简单的降维方法&#xff0c;这里列出了常见的降维方法&#xff0c;有些算法并没有详细推导。特征降维方法包括&#xff1a;Lasso&#xff0c;PCA&#xff0c;小波分析&#xff0c;LDA&am…

详解机器学习高维数据降维方法

当特征选择完成后&#xff0c;可以直接训练模型了&#xff0c;但是可能由于特征矩阵过大&#xff0c;导致计算量大&#xff0c;训练时间长的问题&#xff0c;因此降低维度也是必不可少的。 常见的降维方法除了以上提到的基于 L1 惩罚项的模型以外&#xff0c;另外还有主成分分…

机器学习之降维

本周关于降维的学习主要分为五类&#xff1a;PCA、LDA、LLE、tSNE、ISOMAP 来进行学习 首先自己的任务是&#xff1a;tSNE的学习 &#xff08;一&#xff09;降维的基本知识点总结 1、降维方法分为线性和非线性降维&#xff0c;非线性降维又分为基于核函数和基于特征值的方…

四大机器学习降维方法

引言&#xff1a; 机器学习领域中所谓的降维就是指采用某种映射方法&#xff0c;将原高维空间中的数据点映射到低维度的空间中。降维的本质是学习一个映射函数 f : x->y&#xff0c;其中x是原始数据点的表达&#xff0c;目前最多使用向量表达形式。 y是数据点映射后的低维向…

降维方法总结

目录 数据降维方法: 降维&#xff1a; 降维的用处&#xff1a; 降维方法思想分类&#xff1a; 降维方法总览 降维方法详细说明 1. 缺失值比率&#xff08;Missing Value Ratio&#xff09; 2. 低方差滤波&#xff08;Low Variance Filter&#xff09; 3. 高相关…