Tomcat配置文件Server.xml解析

 

一、Sax的事件驱动模型

  • 类图 

  • 基础实现类

    1. DefaultHandler2: 此类扩展了SAX2基本处理程序类,以支持SAX2 LexicalHandler , DeclHandler和EntityResolver2扩展

      1. DefaultHandler: SAX2事件处理程序的默认基类。此类可用作SAX2应用程序的便捷基类: 它为四个核心SAX2处理程序类中的所有回调提供默认实现: EntityResolver DTDHandler ContentHandler ErrorHandler

  • 接口

    1. ContentHandler: (按照先后顺序排列)

      1. startDocument : 接收文档开始的通知。

      2. startElement : 接收元素开始的通知。 解析器将在XML文档中每个元素的开头调用此方法。 每个startElement事件都会有一个对应的endElement事件(即使元素为空)。 将在相应的endElement事件之前按顺序报告元素的所有内容。

      3. characters : 接收字符数据的通知。 解析器将调用此方法报告字符数据的每个块。 SAX解析器可以在单个块中返回所有连续的字符数据,也可以将其拆分为几个块。

      4. endElement : 接收元素结束的通知。 SAX解析器将在XML文档中每个元素的末尾调用此方法

      5. endDocument : 接收文档结尾的通知

二、Xml解析(Catalina.parseServerXml)

视频教程

  1. 创建Xml解析类Digester(Catalina.createStartDigester)

    1. 新建对象: Digester digester = new Digester();

    2. 添加规则(org.apache.tomcat.util.digester.Rule):

      1. digester.addObjectCreate("Server", "org.apache.catalina.core.StandardServer", "className");
        创建对象Server

      2. digester.addSetProperties("Server");
        给Server对象设置属性

      3. digester.addSetNext("Server", "setServer", "org.apache.catalina.Server");
        调用setServer方法把创建的Server对象赋值给上一级对象

      4. digester.addRule("Server/Service/Connector", new ConnectorCreateRule())
        创建Connector对象.

  2. 开始解析server.xml()

    1. 添加root对象: Catalina: digester.push(this);

    2. 代码解析入口: Catalina: digester.parse(inputSource)

      1. Digester.startDocument : 开始解析文档

      2. Digester.startElement : 解析文档的xml标签

        1. list = updateAttributes(list);
          返回一个属性列表,其中包含所有传入的属性,并且属性值中形式为“ $ {xxx}”的任何文本都将替换为系统属性中的适当值。

        2. List<Rule> rules = getRules().match(namespaceURI, match); matches.push(rules);
          把规则列表添加到栈顶 然后再针对所有相关规则触发’begin’方法

      3. Digester.characters : 解析标签之间的内容

        1. bodyText.append(buffer, start, length); 处理从XML元素的主体接收到的字符数据的通知

      4. Digester.endElement : xml标签解析结束

        1. bodyText = updateBodyText(bodyText);
          返回一个新的StringBuilder,其中包含与输入缓冲区相同的内容,但格式$ {varname}的数据已被系统属性中定义的var值替换。

        2. List<Rule> rules = matches.pop();
          从栈顶获取rules 然后再针对所有相关规则触发’body’方法 最后再以相反的顺序触发所有相关规则的’end’方法

        3. match = match.substring(0, slash);
          恢复先前的匹配表达式

      5. Digester.endDocument : 整个文档解析结束

        1. pop(); 从堆栈中弹出顶部对象(Catalina),然后将其返回。 如果堆栈上没有对象,则返回null

        2. getRules().rules().forEach(k→k.finish()); 为所有已定义的规则触发’finish’方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值