窥探Tomcat整体架构,server.xml常用配置解析( 三 )


org.apache.catalina.core.StandardHost 。它的主要职责就是管理和部署子容器Context,比如,Host启动前,预先创建好部署web应用的目录;Host启动时,部署web应用;Host运行过程中,周期性检查web应用是否需要自动部署,这些监听工作都是在HostConfig中做的 。
如下是Host的一些常用配置:

窥探Tomcat整体架构,server.xml常用配置解析

文章插图
 
4.1 Host部署web应用Host部署web应用(Context)的三种方式:
  • Context描述文件部署,默认是%CATALINA_BASE%/conf/[EngineName]/[HostName]/目录下,可以有多个Context配置,后缀必须为.xml 。可以通过xmlBase指定Context配置文件存放目录 。
  • WAR包部署,即将web应用打包成一个.war部署,默认放在%CATALINA_BASE%/webapps目录下,可以通过appBase指定一个绝对路径 。
  • 目录部署,默认也是放在%CATALINA_HOME%/webapps目录下 。
三种部署的过程都是解析实例化Context,而后两者web应用可能有自己的META-INF/context.xml,则通过解析它来组装生成Context,否则就解析全局的
%CATALINA_BASE%/conf/context.xml 。
五、Web应用ContextContext是对Web应用的抽象,相对其他容器有很多组件,且结构上复杂很多 。默认标准实现是
org.apache.catalina.core.StandardContext,其主要的职责有:
  • Wrapper管理,Context下有很多Wrapper,Wrapper是对Servlet的包装抽象,是最小的容器 。
  • 错误页面ErrorPage管理,在web.xml里可以配置请求处理过程中发生异常重定向的页面路由 。
  • 会话Session管理 。
  • Jar包扫描和加载,一个Context有一个自定义类加载,扫描和加载/WEB-INF/lib下的jar包 。
  • 热加载,定期检查/WEB-INF/lib和/WEB-INF/classes目录下的.jar和.class文件是否更新,更新了就重新加载 。热加载过程较消耗资源,仅适用于开发环境,不可用于生产环境 。
  • ServletContainerInitializer的初始化 。
  • 除了生命周期监听器外,还有很多其他监听器 。
  • 实例管理 。
  • 静态资源缓存管理 。
Context常用配置如下
窥探Tomcat整体架构,server.xml常用配置解析

文章插图
 
5.1 Resources配置Resources是对静态资源的抽象,可以设置缓存以提高响应性能 。默认标准实现是
org.apache.catalina.webresources.StandardRoot 。
窥探Tomcat整体架构,server.xml常用配置解析

文章插图
 
StandardRoot中有五种WebResourceSet:preResources、mainResources、classResources、jarResources、postResources,支持的配置如下:
窥探Tomcat整体架构,server.xml常用配置解析

文章插图
 
六、Servlet包装器WrapperWrapper相对于Engine、Host、Context是最小的容器,其父容器必须是Context,没有其他子容器 。默认标准实现是
org.apache.catalina.core.StandardWrapper 。一般情况一个Servlet对应一个Wrapper,这就是为什么Servlet不是线程安全的了,Servlet以单例的实现存在,多个线程访问肯定不是线程安全的,虽然有Servlet对象池的选择,但是Tomcat10.0.6已经不建议这样做 。
七、要点总结本篇只对server.xml常用的配置进行解释,并通过配置文件节点关系,大概梳理了Tomcat整体架构 。
Tomcat是一个非常优秀的开源项目,值得揉碎了仔细研究的细节实在太多,比如:
  • 线程池定制化改造;
  • 连接Connector的设计以及如何连接到容器Engine的;
  • Mapper组件如何解析映射URI;
  • 一个请求的处理和响应过程;
  • 生命周期框架的设计;
  • 自定义类加载器加载机制,如何做到隔离和共享,如何打破双亲委派;
  • 热部署,热加载的实现细节;
  • 如何解析server.xml配置;
  • 部署web应用的细节;
  • 容器之间如何做到有序连接,Pipeline和Valve的实现细节;
  • Servlet如何实现双向过滤;
  • 各种监听器
  • 等等
作者:徐同学呀
原文链接:
https://blog.csdn.net/weixin_36586120/article/details/118281370




推荐阅读