首页 > 编程语言 >tomcat 源码概念及解析

tomcat 源码概念及解析

时间:2024-09-01 14:47:24浏览次数:14  
标签:Engine ... tomcat Host 源码 apache org 解析 digester

server.xml是Tomcat服务器的核心配置文件,它定义了Tomcat服务器的运行参数和容器的配置。下面是对server.xml中一些关键标签的解读:

这是server.xml文件的根元素,它代表了整个Tomcat服务器的实例。
port属性定义了Tomcat的shutdown端口,用于接收关闭服务器的命令。
shutdown属性定义了关闭服务器的命令字符串。

这个标签用于定义服务器启动时要加载的监听器,监听器可以执行一些初始化任务,如日志记录、安全管理等。

这个标签用于定义全局的JNDI资源,如数据源、用户数据库等。

Service代表一个服务,它包含一个Connector和一个Engine,用于处理特定的网络连接。
name属性定义了服务的名称。

Connector定义了服务的网络连接器,它负责监听特定的端口,接收和处理网络请求。
port属性定义了监听的端口号。

protocol属性定义了连接器使用的协议,如HTTP/1.1、AJP/1.3等。
connectionTimeout属性定义了连接超时时间。
redirectPort属性定义了HTTPS重定向的端口号。

Engine是Tomcat容器的顶层组件,它代表了整个服务器的实例。
name属性定义了引擎的名称。
defaultHost属性定义了默认的Host,当请求的域名没有匹配的Host时,将使用默认的Host。

Host代表一个虚拟主机,它与一个特定的域名或IP地址关联。
name属性定义了虚拟主机的域名或IP地址。
appBase属性定义了Web应用的根目录。
unpackWARs属性定义了是否自动解压WAR文件。
autoDeploy属性定义了是否自动部署Web应用。

Context代表一个Web应用的上下文,它定义了Web应用的配置和部署信息。
path属性定义了Web应用的上下文路径。
docBase属性定义了Web应用的文档基础目录。


Valve代表一个容器阀,它用于处理容器级别的请求,如日志记录、错误处理等。
以上是server.xml中一些关键标签的解读,通过配置这些标签,你可以自定义Tomcat服务器的行为和性能。

添加标签:在标签内添加一个新的标签,为每个虚拟主机添加一个标签。每个标签应该包含以下属性:
name:指定虚拟主机的域名或IP地址。
appBase:指定虚拟主机的Web应用目录。
autoDeploy:指定是否自动部署应用目录下的应用。
deployOnStartup:指定在Tomcat启动时是否部署应用目录下的应用。
deployXML:指定是否使用web.xml文件来部署应用。

在Tomcat服务器中,Engine、Host、Context是三个关键的概念,它们构成了Tomcat的容器层次结构,用于管理和组织Web应用。下面分别解释这三个概念:
Engine(引擎):
Engine是Tomcat容器的顶层,它代表一个虚拟的服务器,可以包含多个Host。在Tomcat中,通常只有一个Engine实例,名为Catalina。
Engine负责处理HTTP请求的分发,它将请求分发给相应的Host进行处理。
Engine还负责管理Tomcat的全局生命周期,包括启动和停止等。
Host(主机):
Host代表一个虚拟主机,它与一个特定的域名或IP地址关联。一个Engine可以包含多个Host,每个Host可以有多个Web应用。
Host负责处理特定域名或IP地址的HTTP请求,它将请求分发给相应的Context进行处理。
Host还负责管理Web应用的生命周期,包括加载、卸载和重启等。
Context(上下文):
Context代表一个Web应用的上下文,它是Web应用的容器,负责加载、管理和运行Web应用。
Context负责处理具体的Web应用的HTTP请求,它管理Servlet、过滤器、监听器等Web组件的生命周期。
Context还负责管理Web应用的配置,包括读取web.xml文件、处理注解等。

在Tomcat的容器层次结构中,Engine、Host和Context之间形成了一个树状结构,从Engine到Host再到Context,每一层都负责更具体的任务。这种层次结构使得Tomcat能够灵活地管理多个Web应用,同时支持虚拟主机和多域名的配置。

org.apache.catalina.startup.Catalina#load{
...org.apache.catalina.startup.Catalina#createStartDigester{
//addObjectCreate、addSetProperties、addSetNext三个方法都是添加rule规则
...addObjectCreate->addRule->new ObjectCreateRule{
...begin{
//根据className反射java对象后入栈
...digester.push(instance)...
}...
...end{
//对象出栈,后续操作对象
digester.pop()...
}...
}...

    ...addSetProperties->addRule->new SetPropertiesRule{
        ...begin{
            //栈顶元素赋值,在使用Digester解析XML文档时,它会根据解析规则创建和管理一个对象栈,用于存储解析过程中创建的Java对象。peek方法允许你在不改变栈状态的情况下查看栈顶的对象。
            ...digester.peek()...

            ...IntrospectionUtils.setProperty(top, name, value)...
        }...
    }...
	//Server设置Listener、Service等
    ...addSetNext->addRule->new SetNextRule{
        ...end{
            //同样栈顶元素开始操作
            ...Object child = digester.peek(0);
            Object parent = digester.peek(1)...
            //IntrospectionUtils.callMethod是Apache Commons Lang库中的一个方法,用于通过反射调用Java对象的方法,parent是要调用方法的对象实例
            ...IntrospectionUtils.callMethod1(parent, methodName,
                child, paramType, digester.getClassLoader())...
        }...
    }....
    ...digester.addRuleSet(new NamingRuleSet("Server/GlobalNamingResources/"));
    //创建Engine对象,设置监听器EngineConfig等
    digester.addRuleSet(new EngineRuleSet("Server/Service/"));
    //创建Host对象,Engine通过方法addChild设置属性Host等
    digester.addRuleSet(new HostRuleSet("Server/Service/Engine/"));
    //创建Context对象,设置监听器ContextConfig、Host通过方法addChild设置属性Context等
    digester.addRuleSet(new ContextRuleSet("Server/Service/Engine/Host/"));
    addClusterRuleSet(digester, "Server/Service/Engine/Host/Cluster/");
    digester.addRuleSet(new NamingRuleSet("Server/Service/Engine/Host/Context/"))...
	
    org.apache.catalina.startup.EngineRuleSet#EngineRuleSet{
        addRuleInstances{
            //方法addObjectCreate、addSetProperties、addRule等
            ...digester.addObjectCreate(prefix + "Engine",
                             "org.apache.catalina.core.StandardEngine",
                             "className");
    digester.addSetProperties(prefix + "Engine");
    digester.addRule(prefix + "Engine",
                     new LifecycleListenerRule
                     ("org.apache.catalina.startup.EngineConfig",
                      "engineConfigClass"));
    digester.addSetNext(prefix + "Engine",
                        "setContainer",
                        "org.apache.catalina.Engine")...
        }
    }
}...

//inputStream 此时是 server.xml
inputSource.setByteStream(inputStream);
digester.push(this);
digester.parse->..parse..->scanDocument->..->scanStartElement->emptyElement{
startElement(element, attributes, augs)->org.apache.tomcat.util.digester.Digester#startElement{
//执行rule的begin执行对应的方法其中部分如上三种
...getRules()...
...for rule...
...rule.begin...
}
endElement(element, augs)->org.apache.tomcat.util.digester.Digester#endElement{
...rules = matches.pop()...
...rule.body...
...rule.end...
}
}->scanEndElement{
...endElement{
...endElement{
...rules = matches.pop()...
...for rules->rule.body...
//rule规则里面就有相应的方法其中部分如上三种
...for rules->rule.end...
}...
}...
}
}
//在startInternal这个方法前会setStateInternal->fireLifecycleEvent触发对应状态事件
org.apache.catalina.Lifecycle#start->startInternal->services.start->startInternal->engine.start->startInternal{
//StandardEngine extends ContainerBase
...super.startInternal{
//对于engin得到的是host,对于host得到的是context。异步启动StandardHost,StandardContext(configureStarthild->call->child.start()),调用org.apache.catalina.util.LifecycleBase#start{...startInternal...}。
...Container children[] = findChildren();
List<Future> results = new ArrayList<>();
for (int i = 0; i < children.length; i++) {
results.add(startStopExecutor.submit(new StartChild(children[i])));
}...
// Start our thread
...threadStart()...
}...
}

org.apache.catalina.core.StandardHost#startInternal{
//同上
...super.startInternal{
//得到StandardContext
...Container children[] = findChildren();
List<Future> results = new ArrayList<>();
for (int i = 0; i < children.length; i++) {
//会启动context org.apache.catalina.core.StandardContext#startInternal
results.add(startStopExecutor.submit(new StartChild(children[i])));
}...
//触发ContextConfig事件org.apache.catalina.startup.ContextConfig#configureStart->webConfig
...fireLifecycleEvent(Lifecycle.CONFIGURE_START_EVENT, null)
// Start our child containers, if not already started
for (Container child : findChildren()) {
if (!child.getState().isAvailable()) {
child.start();
}
}...
... // Call ServletContainerInitializers如:org.springframework.web.SpringServletContainerInitializer#onStartup
for (Map.Entry<ServletContainerInitializer, Set<Class<?>>> entry :
initializers.entrySet()) {
...entry.getKey().onStartup(entry.getValue(),
getServletContext())..
}...
//org.springframework.web.context.ContextLoaderListener
...listenerStart->listener.contextInitialized...
}...
}

org.apache.catalina.startup.ContextConfig#webConfig{
...configureContext{
//处理web.xml中的servlet、filter、listen等
//此处的wrapper为解析xml后的servlet:default,jsp,dispathservlet等
...context.addChild(wrapper){
...addChildInternal{
//org.apache.catalina.core.ContainerBase#children
///The child Containers belonging to this Container, keyed by name
//protected final HashMap<String, Container> children = new HashMap<>();
...children.put(child.getName(), child)... //default->org.apache.catalina.servlets.DefaultServlet、jsp->org.apache.jasper.servlet.JspServlet、mvc-test(web.xml中配置的servlet-name)->org.springframework.web.servlet.DispatcherServlet
}...
}...
}...
}

标签:Engine,...,tomcat,Host,源码,apache,org,解析,digester
From: https://www.cnblogs.com/leifonlyone/p/18391278

相关文章

  • ReentrantReadWriteLock源码剖析
    ReentrantReadWriteLock源码剖析测试案例:publicclassReentrantReadWriteLockDemo{privatestaticReentrantReadWriteLockreadWriteLock=newReentrantReadWriteLock();privatestaticLockreadLock=readWriteLock.readLock();//定义读锁privatesta......
  • ReentrantLock源码剖析
    ReentrantLock源码剖析测试案例:publicclassReentrantLockDemo{//ReentrantLocklock=newReentrantLock();//默认是非公平锁//ReentrantLocklock=newReentrantLock(true);//true:公平锁,false:非公平锁publicstaticvoidmain(String[]args){......
  • linux命令重启tomcat
    动一下小手点一下赞。谢谢!你的赞就是我更新的动力。Linux系统下,重启Tomcat服务器是一个常见的操作。Tomcat是一个开源的JavaServlet容器,用于实现JavaServlet和JavaServerPages(JSP)等技术。在Linux系统上,我们可以通过一些简单的命令来实现重启Tomcat服务器的操作。首先,我们需要打......
  • 毕业设计-基于Springboot+Vue的大学生租房系统的设计与实现(源码+LW+包运行)
    源码获取:https://download.csdn.net/download/u011832806/89456841基于SpringBoot+Vue的大学生租房系统开发语言:Java数据库:MySQL技术:SpringBoot+MyBatis+Vue.js工具:IDEA/Ecilpse、Navicat、Maven系统演示视频:链接:https://pan.baidu.com/s/1oXxVE3PeuLS5YOJvYjvKKw?pwd=......
  • C++奇迹之旅:深度解析list的模拟实现
    文章目录......
  • MyBatis中的#和$:深入解析与实战应用
    MyBatis中的#和$:深入解析与实战应用作为一名编程博客专家,我将带领大家深入探讨MyBatis中#和$的区别,并通过详细的代码示例和解释,帮助大家全面理解其工作原理及实际应用。前置知识在深入探讨之前,我们需要了解一些基本概念:MyBatis:一个持久层框架,支持自定义SQL、存储过程以......
  • 基于Springboot快递物流仓库管理系统【附源码+文档】
    ......
  • 【有源码】基于springboot+vue的高校大学生创新创业学分管理系统的设计与实现
    注意:该项目只展示部分功能,如需了解,文末咨询即可。本文目录1.开发环境2系统设计2.1设计背景2.2设计内容3系统展示3.1功能展示视频3.2前台页面3.3后台页面4更多推荐5部分功能代码1.开发环境开发语言:Java采用技术:sprngboot、vue数据库:MySQL开发环境:In......
  • 校园便利|基于SprinBoot+vue的校园便利平台(源码+数据库+文档)
    校园便利平台基于SprinBoot+vue的校园便利平台一、前言二、系统设计三、系统功能设计 系统前台实现系统首页功能用户后台管理功能管理员功能实现四、数据库设计 五、核心代码 六、论文参考七、最新计算机毕设选题推荐八、源码获取:博主介绍:✌️大厂码农|毕设......
  • “事事通”校园事务通知小程序的设计与实现-计算机毕业设计源码23598
    摘要 校园事务是大学生日常生活中不可或缺的一部分,包括课程查询、教务管理、校园活动信息等。然而,目前大多数学校在校园事务的通知发布和信息查询方面还依赖传统的官方网站和邮件通知,这种方式存在信息不及时、查找不方便等问题。本文旨在通过引入SpringBoot和Vue框架,结合云......