Context Config
-
AFTER_INIT_EVENT 主要负责加载config,加载顺序是
META-INF/configFile
,conf/<Engine名称>/<Host名称>/congfig.xml.default
,conf/context.xml
-
BEFORE_START_EVENT 主要是用来更新docBase属性及是否对原资源目录进行copy避免加锁
-
CONFIGURE_START_EVENT 主要用来加载Web Context,读取
web.xml
形成WebXml对象,并根据这个配置进行加载Web Context
StandardWrapper
这个维护了具体的servlet实例,在StandardContext启动过程中,StandardWrapper处理分成两个部分
- 当ContextConfig完成web容器初始化后,先调用
StandardWrapper.start
,此时StandardWrapper组件状态变为STARTED,发送启动广播 - 对于启动时加载的Servlet(即load-on-startup > 0),调用
StandardWrapper.load
方法,完成servlet的加载
具体过程如下:
- 创建servlet实例,注入所依赖的JNDI资源
- 读取
javax.servlet.annotation.MutipartConfig
配置。这个配置是用来multipart/form-data
请求处理,包括临时文件存储路径、上传文件最大字数、请求最大字数、文件大小阈值。 - 根据
javax.servlet.annotation.ServletSecurity()
配置添加servlet安全 - 调用
javax.servlet.Servlet.init()
进行servlet初始化
请求处理过程
首先要讲到的是tomcat通过org.apache.tomcat.util.http.mapper.Mapper
维护请求连接与Host、Context、Wrapper等Container的映射。通过通过org.apache.catalina.connector.MapperListener
监听器监听所有的Host、Context、Wrapper组件,在相关组件启动、停止时注册或者移除
其次要讲到的是如何将Connector与Mapper连接起来,这里用到的就是org.apache.catalina.connector.CoyoteAdapter
,当Connector收到请求时,调用CoyoteAdapter.service()
方法完成请求处理
具体过程如下:
- 根据Connector的请求(org.apache.coyote.Request)和响应(org.apache.coyote.Response)对象转化为Servlet请求(org.apache.catalina.connector.Request)和响应(org.apache.catalina.connector.Response)
- 转换请求参数并完成请求映射。
- 请求URI解码,初始化请求路径的参数
- 请求映射,得到请求结果
org.apache.tomcat.util.http.mapper.mapper.MappingData
, 然后最终映射为一个有效的Wrapper - 如果当前Connector不允许跟踪,那么就设置allowTrace为false。如果当前请求的方法是trace,那么就返回405响应码。
- 执行连接器的认证及授权。
- 得到Engine的第一个value并执行完成客户端的处理。
- 如果为异步请求,获取请求事件监听器ReadListener,如果数据返回,则触发ReadListener.onAllDataRead方法。如果是同步请求,直接Flush并关闭请求输入流,flush关闭响应输出流
MapperWrapper映射
映射顺序为exactWrappers
> wildcardWrappers
> extendsionWrappers
> 欢迎文件
exact > wildcard > extendsion)
默认的servlet
在${catalina_home}/conf/web.xml自带了两个默认的servlet,分别是defaultServlet和jspServlet
defaultServlet主要用于处理静态资源,例如js,html等
这里记得比较乱,是因为在读tomcat这本书的时候。书里在介绍的时候,写的像阅读代码一样没有太多总结,而太多的具体详细过程对我没有一个直接的印象,所以只记录我觉得涉及到的。