【笔记】JavaWeb - tomcat Digester 源码解读

Tomcat的Digester用于处理XML,基于SAX解析。在digester构建阶段,通过catalina.createStartDigester创建digester实例,并解析server.xml。在SAX事件回调阶段,digester监听startElement和endElement事件,执行反射创建实例、设置属性值等操作,如ConnectorCreateRule和SetPropertiesRule。
摘要由CSDN通过智能技术生成

tomcat 的 Digester 是用来处理 XML的一个封装,使用的是 SAX解析。

在这里插入图片描述

💡 提示

这篇文章,有关于sax解析api的使用

【笔记】Java - XML的解析 - https://lawsssscat.blog.csdn.net/article/details/103024157

digester 构建阶段

💡 结合 server.xml 观看

catalina.createStartDigester 得到 catalina.digester

/**

在Digester中设置Rules,用SAX解析XML回调时,会根据这些Rules做对应的操作

 * Create and configure the Digester we will be using for startup.
 * @return the main digester to parse server.xml
 */
protected Digester createStartDigester() {
   
    long t1=System.currentTimeMillis();
    // Initialize the digester
    Digester digester = new Digester();
    
    digester.setValidating(false);
    
    digester.setRulesValidation(true);
    
	/*
	💡 为 SetPropertiesRule 服务
	设置忽略的列表: 类名相同,属性名相同的设置属性操作会被忽略
	*/
    Map<Class<?>, List<String>> fakeAttributes = new HashMap<>();
    // Ignore className on all elements
    List<String> objectAttrs = new ArrayList<>();
    objectAttrs.add("className");
    fakeAttributes.put(Object.class, objectAttrs);
    // Ignore attribute added by Eclipse for its internal tracking
    List<String> contextAttrs = new ArrayList<>();
    contextAttrs.add("source");
    fakeAttributes.put(StandardContext.class, contextAttrs);
    // Ignore Connector attribute used internally but set on Server
    List<String> connectorAttrs = new ArrayList<>();
    connectorAttrs.add("portOffset");
    fakeAttributes.put(Connector.class, connectorAttrs);
    digester.setFakeAttributes(fakeAttributes);
    
    digester.setUseContextClassLoader(true);

    // Configure the actions we will be using
    // Server 服务器
    /*
    ⚠️⚠️⚠️⚠️⚠️
	ObjectCreateRule: 在startElement时被调用,通过类名反射创建实例
	SetPropertiesRule: 在startElement时被调用,根据标签往上一个实例中设置属性值 "<name 属性值=属性名 ...>" 
	SetNextRule: 在endElement时被调用,反射调用父节点方法,将当前节点存入父节点
	⚠️⚠️⚠️⚠️⚠️
	*/
    digester.addObjectCreate("Server",
                             "org.apache.catalina.core.StandardServer", // 默认值
                             "className"); // 标签上的值(如果标签上没有值,则用默认值)
    digester.addSetProperties("Server");
    digester.addSetNext("Server", // 标识
                        "setServer", // 父节点方法名
                        "org.apache.catalina.Server"); // 父节点方法参数类型

	// Server/GlobalNamingResources
    digester.addObjectCreate("Server/GlobalNamingResources",
                             "org.apache.catalina.deploy.NamingResourcesImpl");
    digester.addSetProperties("Server/GlobalNamingResources");
    digester.addSetNext("Server/GlobalNamingResources",
                        "setGlobalNamingResources",
                        "org.apache.catalina.deploy.NamingResourcesImpl");

	// Server/Listener
    digester.addObjectCreate("Server/Listener",
                             null, // MUST be specified in the element
                             "className");
    digester.addSetProperties("Server/Listener");
    digester.addSetNext("Server/Listener",
                        "addLifecycleListener",
                        "org.apache.catalina.LifecycleListener");

	// Server/Service 服务容器
    digester.addObjectCreate("Server/Service",
                             "org.apache.catalina.core.StandardService",
                             "className");
    digester.addSetProperties("Server/Service");
    digester.addSetNext("Server/Service",
                        "addService",
                        "org.apache.catalina.Service");

	// Server/Service/Listener
    digester.addObjectCreate("Server/Service/Listener",
                             null, // MUST be specified in the element
                             "className");
    digester.addSetProperties("Server/Service/Listener");
    digester.addSetNext("Server/Service/Listener",
                        "addLifecycleListener",
                        "org.apache.catalina.LifecycleListener");

	// Server/Service/Executor
    //Executor
    // 线程池?EndPoint
    digester.addObjectCreate("Server/Service/Executor",
                     "org.apache.catalina.core.StandardThreadExecutor",
                     "className");
    digester.addSetProperties("Server/Service/Executor");
    digester.addSetNext("Server/Service/Executor",
                        "addExecutor",
                        "org.apache.catalina.Executor");
     
    // Server/Service/Connector
	// Connector
    digester.addRule("Server/Service/Connector",
                     new ConnectorCreateRule());
    digester.addRule("Server/Service/Connector",
                     new SetAllPropertiesRule(new String[]{
   "executor", "sslImplementationName"}));
    digester.addSetNext("Server/Service/Connector",
                        "addConnector",
                        "org.apache.catalina.connector.Connector");

    digester.addRule("Server/Service/Connector", new AddPortOffsetRule());

	// Server/Service/Connector/SSLHostConfig
    digester.addObjectCreate("Server/Service/Connector/SSLHostConfig",
                             "org.apache.tomcat.util.net.SSLHostConfig");
    digester.addSetProperties("Server/Service/Connector/SSLHostConfig");
    digester.addSetNext("Server/Service/Connector/SSLHostConfig",
            "addSslHostConfig",
            "org.apache.tomcat.util.net.SSLHostConfig");

	// Server/Service/Connector/SSLHostConfig/Certificate
    digester.addRule("Server/Service/Connector/SSLHostConfig/Certificate",
                     new CertificateCreateRule());
    digester.addRule("Server/Service/Connector/SSLHostConfig/Certificate",
                     new SetAllPropertiesRule(new String[]{
   "type"}));
    digester.addSetNext("Server/Service/Connector/SSLHostConfig/Certificate",
                        "addCertificate",
                        "org.apache.tomcat.util.net.SSLHostConfigCertificate");

	// Server/Service/Connector/SSLHostConfig/OpenSSLConf
    digester.addObjectCreate("Server/Service/Connector/SSLHostConfig/OpenSSLConf",
                             "org.apache.tomcat.util.net.openssl.OpenSSLConf");
    digester.addSetProperties("Server/Service/Connector/SSLHostConfig/OpenSSLConf");
    digester.addSetNext("Server/Service/Connector/SSLHostConfig/OpenSSLConf",
                        "setOpenSslConf",
                        "org.apache.tomcat.util.net.openssl.OpenSSLConf");

	// Server/Service/Connector/SSLHostConfig/OpenSSLConf/OpenSSLConfCmd
    digester.addObjectCreate("Server/Service/Connector/SSLHostConfig/OpenSSLConf/OpenSSLConfCmd",
                             "org.apache.tomcat.util.net.openssl.OpenSSLConfCmd");
    digester.addSetProperties("Server/Service/Connector/SSLHostConfig/OpenSSLConf/OpenSSLConfCmd");
    digester.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

骆言

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值