tomcat知识点讲解

tomcat的请求处理流程:

tomcat就是servlet容器,tomcat只关心servlet。去将servlet和url-Pattern进行匹配。

项目打包war包,去tomcat中部署.去webapps文件夹下将war包解压。去找web.xml文件。

web.xml文件中,找到servlet标签,将servlet标签中的servlet-name和servlet-class进行匹配。

tomcat启动占用一个监听端口,在操作系统之上的字节流会从端口进入到tomcat中。

然后去匹配url,找到项目中的servlet。

tomcat四大容器:

1.Engine:直接理解为一个tomcat即可,一个tomcat一个engine

List<Host> hosts

defaultHost:指定默认主机

2.Host:一个Host表示一个虚拟服务器,可以给每个Host配置一个域名

List<Context> contexts

conf下的server.xml

Host下的属性:

name就是域名地址,appBase就是应用的目录,unpackWARs是否解压war包,

<Context>中的属性path就是路径,docBase就是找servlet的路径.

3.Context:一个Context就是一个应用,一个项目

List<Wrapper> wrappers.一个应用下有多个servlet.

去找webapps下的目录,一个目录一个应用

web.xml

4.Wrapper:一个wrapper表示一个Servlet的包装.

List<Servlet> servlets.该下存的servlet都是同一个类型的.

比如说:AServlet-->Wrapper对象-->4AServlet实例。将实例存到wrapper对象中去。

编写servlet部署到tomcat中去,该类产生请求肯定会产生具体的实例,通过实例对象调用方法

在编写一个servlet时继承HttpServlet,所有请求公用一个servlet实例-->线程不安全

这个时候添加一个属性i,每次使用方法让i++,称为状态。

可以通过实现implements SingleThreadModel.使得每个请求单独使用一个Servlet实例-->线程安全

四个容器有层次结构关系:一个Engine下有多个Host,一个Host可以有多个Context,

一个Context下可以有多个Wrapper,一个Wrapper可以有多个Servlet实例对象。

总而言之,一个servlet对应一个wrapper对象,创建多个servlet实例,将多个servlet实例存到

wrapper中List\ servlets。然后List\ wrappers

List\ contexts,ist\ hosts.

tomcat的四大容器中每个容器还有两个属性,每个容器下有pipeline管道属性,管道属性下有valve阀门属性。

tomcat容器请求处理流程:

首先发送一个请求,http/ip地址/端口号/...路径。请求包括请求方法,url,协议版本,servletName.发送

请求之后由Adapter接受请求,生成request对象,找到该请求所对应的host,context,wrapper,设值给request,

然后找到engine的Pipeline中的第一个valve并执行。依次执行valve后执行到StandardEngineValve,

StandardEngineValve的作用就是找到host的第一个valve。依次按照容器层级结构进行执行。直到最后的wrapper容器,

其中的StandardWrapperValve方法作用是找到对应的servlet实例并调用service方法。Servlet实例.service(request,response)

字节流-->HttpServletRequest req?

字节流怎么来的,浏览器发送的http请求,在浏览器虽然输入的只有路径字符串,

但是访问端口8080之后访问的数据不只路径字符串,而是http协议的数据格式,发送一个http请求,

浏览器将输入的路径字符串转换成字节流,将http协议的数据转换成字节,然后在通过网络发送出去。

tomcat所接收到的字节流其实就是http协议翻译过来的字节流。

tomcat接收到之后同样用http协议的格式去解析字节流。

通常进行socket长连接的时候,发送给tomcat多个请求,此时字节流中第一个请求的请求体和第二个请求的

请求行是连着的,我们通过Context-Length来判断哪一部分是请求体,哪一部分是请求行。

在第一个请求的请求头之中,附带上Context-Length来告诉请求体有多长,这样就能判断了。

除了这个方法还有一个方法使用分块传输。

IO模型 线程模型

BIO:

传统的IO模型,称为同步阻塞IO。服务器实现模式为一个连接一个线程,即客户端有请求的时候服务端就要启动一个线程进行处理。

NIO:

同步非阻塞IO,基于事件驱动处理IO操作,NIO主要组成部分为选择器,缓冲区,通道。通道是一个可以进行数据读写的对象,

所有数据通过缓存处理,使用选择器和通道可以在单个线程上执行多个连接。

AIO:

异步非阻塞IO模型。对于socket和IO操作都是异步的,不会阻塞任何线程。

JIO:除非在tomcat启动时找到了APR库,否则这是tomcat默认的连接方法。

APR?

相关推荐
腻害兔4 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统
java·大数据·vue.js·产品经理·ai编程
码智社5 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
萧瑟余晖6 小时前
JDK 26 新特性详解
java·开发语言
马优晨7 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
维天说9 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json
Zane199410 小时前
并发 vs 并行:别再傻傻分不清了,一文讲透 Java 并发编程的第一课
java·后端
噢,我明白了11 小时前
java中Excel的导入和导出(EasyExcel)
java·开发语言·excel
吠品11 小时前
Zabbix Web界面误报Server未运行的排查与解决
java·服务器·数据库
啊湘11 小时前
天气查询API接口 按月Token鉴权 实时天气 物联网可用 文档齐全
java·后端·struts
Java内核笔记11 小时前
告别十亿美元的错误 : Spring Boot 4 空安全 (JSpecify) 实战
java·spring boot·后端