请选择 进入手机版 | 继续访问电脑版

Tomcat配置文件Server.xml解析

[复制链接]
欣荣 发表于 2021-1-1 17:46:54 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
 

一、Sax的事件驱动模子



  • 类图 

 


  • 底子实现类

    • DefaultHandler2: 此类扩展了SAX2根本处置处罚步调类,以支持SAX2 LexicalHandler , DeclHandler和EntityResolver2扩展

      • DefaultHandler: SAX2事件处置处罚步调的默认基类。此类可用作SAX2应用步调的便捷基类: 它为四个焦点SAX2处置处罚步调类中的所有回调提供默认实现: EntityResolver DTDHandler ContentHandler ErrorHandler


  • 接口

    • ContentHandler: (按照先后顺序分列)

      • startDocument : 接收文档开始的通知。
      • startElement : 接收元素开始的通知。 剖析器将在XML文档中每个元素的开头调用此方法。 每个startElement事件都会有一个对应的endElement事件(纵然元素为空)。 将在相应的endElement事件之前按顺序陈诉元素的所有内容。
      • characters : 接收字符数据的通知。 剖析器将调用此方法陈诉字符数据的每个块。 SAX剖析器可以在单个块中返回所有连续的字符数据,也可以将其拆分为几个块。
      • endElement : 接收元素结束的通知。 SAX剖析器将在XML文档中每个元素的末端调用此方法
      • endDocument : 接收文档末端的通知


二、Xml剖析(Catalina.parseServerXml)

视频教程

  • 创建Xml剖析类Digester(Catalina.createStartDigester)

    • 新建对象: Digester digester = new Digester();
    • 添加规则(org.apache.tomcat.util.digester.Rule):

      • digester.addObjectCreate("Server", "org.apache.catalina.core.StandardServer", "className");
        创建对象Server
      • digester.addSetProperties("Server");
        给Server对象设置属性
      • digester.addSetNext("Server", "setServer", "org.apache.catalina.Server");
        调用setServer方法把创建的Server对象赋值给上一级对象
      • digester.addRule("Server/Service/Connector", new ConnectorCreateRule())
        创建Connector对象.


  • 开始剖析server.xml()

    • 添加root对象: Catalina: digester.push(this);
    • 代码剖析入口: Catalina: digester.parse(inputSource)

      • Digester.startDocument : 开始剖析文档
      • Digester.startElement : 剖析文档的xml标签

        • list = updateAttributes(list);
          返回一个属性列表,此中包罗所有传入的属性,而且属性值中形式为“ $ {xxx}”的任何文本都将替换为系统属性中的适当值。
        • List rules = getRules().match(namespaceURI, match); matches.push(rules);
          把规则列表添加到栈顶 然后再针对所有相关规则触发’begin’方法

      • Digester.characters : 剖析标签之间的内容

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

      • Digester.endElement : xml标签剖析结束

        • bodyText = updateBodyText(bodyText);
          返回一个新的StringBuilder,此中包罗与输入缓冲区相同的内容,但格式$ {varname}的数据已被系统属性中界说的var值替换。
        • List rules = matches.pop();
          从栈顶获取rules 然后再针对所有相关规则触发’body’方法 最后再以相反的顺序触发所有相关规则的’end’方法
        • match = match.substring(0, slash);
          规复先前的匹配表达式

      • Digester.endDocument : 整个文档剖析结束

        • pop(); 从堆栈中弹出顶部对象(Catalina),然后将其返回。 如果堆栈上没有对象,则返回null
        • getRules().rules().forEach(k→k.finish()); 为所有已界说的规则触发’finish’方法




来源:https://blog.csdn.net/xu1204013031/article/details/111999013
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

发布主题

专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )