Tomcat配置文件Server.xml解析

一、Sax的事件驱动模型

  • 类图
    Tomcat配置文件Server.xml解析
  • 基础实现类
  • DefaultHandler2: 此类扩展了SAX2基本处理程序类,以支持SAX2 LexicalHandler , DeclHandler和EntityResolver2扩展
    1. DefaultHandler: SAX2事件处理程序的默认基类。此类可用作SAX2应用程序的便捷基类: 它为四个核心SAX2处理程序类中的所有回调提供默认实现: EntityResolver DTDHandler ContentHandler ErrorHandler
  • 接口
  • 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)
  2. 新建对象: Digester digester = new Digester();
  3. 添加规则(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对象.
  4. 开始解析server.xml()

  5. 添加root对象: Catalina: digester.push(this);
  6. 代码解析入口: Catalina: digester.parse(inputSource)
    1. Digester.startDocument : 开始解析文档
    2. Digester.startElement : 解析文档的xml标签
    3. list = updateAttributes(list);
      返回一个属性列表,其中包含所有传入的属性,并且属性值中形式为” $ {xxx}”的任何文本都将替换为系统属性中的适当值。
    4. List rules = getRules().match(namespaceURI, match); matches.push(rules);
      把规则列表添加到栈顶 然后再针对所有相关规则触发’begin’方法
    5. Digester.characters : 解析标签之间的内容
    6. bodyText.append(buffer, start, length); 处理从XML元素的主体接收到的字符数据的通知
    7. Digester.endElement : xml标签解析结束
    8. bodyText = updateBodyText(bodyText);
      返回一个新的StringBuilder,其中包含与输入缓冲区相同的内容,但格式$ {varname}的数据已被系统属性中定义的var值替换。
    9. List rules = matches.pop();
      从栈顶获取rules 然后再针对所有相关规则触发’body’方法 最后再以相反的顺序触发所有相关规则的’end’方法
    10. match = match.substring(0, slash);
      恢复先前的匹配表达式
    11. Digester.endDocument : 整个文档解析结束
    12. pop(); 从堆栈中弹出顶部对象(Catalina),然后将其返回。 如果堆栈上没有对象,则返回null
    13. getRules().rules().forEach(k→k.finish()); 为所有已定义的规则触发’finish’方法

posted @
2022-08-24 11:35 菜阿

阅读(
122

) 评论(
) 编辑

Original: https://www.cnblogs.com/xysgo/p/16619299.html
Author: 菜阿
Title: Tomcat配置文件Server.xml解析

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/601514/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • JavaWeb核心篇(6)——Ajax

    JavaWeb核心篇(6)——Ajax Ajax(Asynchronous JavaScript And XML):异步的 JavaScript 和 XML。 我们先来说概念中的 …

    数据库 2023年6月14日
    052
  • VMWare 12 Mac 10.11 XCode 7.3 Ipad真机调试重要问题总结

    XCode 7.3可以不需要每年缴费而直接调试IOS应用,测试如下: 1,安装Mac 10.11在VMWare12上,网上有很多例子。注意: 1.1,虚拟机设置中USB为USB2….

    数据库 2023年6月14日
    086
  • canal

    canal 简介 canal 主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。 canal 工作原理: canal 模拟 MySQL slave 的交互协议…

    数据库 2023年6月14日
    075
  • 正则表达式与SQL

    在我心中正则表达式和SQL就是一样的东西。 SQL是结构化查询语言,是根据某个查询、修改规则来查询修改数据,是描述一个规则给数据库,数据库来执行,数据库返回结果,过程不需要考虑,不…

    数据库 2023年6月9日
    062
  • python 学习笔记(十二)–Django 基本知识点小结

    构造函数格式: 作用: 向客户端浏览器返回相应,同时携带响应体内容。 参数: –content:表示返回的内容。 –status_code:返回的HTTP响…

    数据库 2023年6月16日
    065
  • StoneDB完成华为鲲鹏国产处理器适配认证!

    近日,一体化实时 HTAP 数据库 StoneDB 与华为鲲鹏 920 已完成并通过相互兼容性测试认证,取得 KUNPENG COMPATIBLE 证书及认证徽标的使用权。 该认证…

    数据库 2023年5月24日
    076
  • Redis与Python连接实例

    2022-09-22 1、 Redis与Python建立连接之前需要先安装”Redis”安装包: 在ubantu中,打开终端,输入命令: sudo pip …

    数据库 2023年6月14日
    0102
  • 翻译 | Kubernetes Operator 对数据库的重要性

    一些刚接触 Kubernetes 的公司尝试使用传统环境中运行数据库的方法在 Kubernetes 中运行数据库。但是,不建议这样做。因为这可能会导致数据丢失,并且也不建议这样管理…

    数据库 2023年5月24日
    099
  • B树详解

    B树系列文章 1. B树-介绍 2. B树-查找 3. B树-插入 4. B树-删除 什么是B树 B树(英语:B-tree)是一种自平衡的树,能够保持数据有序。使用B树这种数据结构…

    数据库 2023年6月14日
    091
  • 多商户商城系统功能拆解25讲-平台端分销申请

    多商户商城系统,也称为B2B2C(BBC)平台电商模式多商家商城系统。可以快速帮助企业搭建类似拼多多/京东/天猫/淘宝的综合商城。 多商户商城系统支持商家入驻加盟,同时满足平台自营…

    数据库 2023年6月14日
    068
  • RadonDB MySQL Kubernetes 2.2.0 发布!

    摘要 RadonDB MySQL Kubernetes v2.2.0 于近日发布!该版本开始支持 MySQL 8.0,备份功能优化,并全面提升高可用稳定性。社区同步发起&#8221…

    数据库 2023年5月24日
    095
  • 关于在linux上部署.netcore项目,只能Linux访问,不能外部主机访问的问题

    在我们在Linux上部署完.netcore项目之后,是进入到部署项目的文件夹之下启动项目,比如我的就是在www/core文件夹下。 首先cd 之后我们直接启动项目 之后我们在win…

    数据库 2023年6月11日
    0161
  • 新建vue项目

    1、CMD中输入命令行 vue ui 打开一个创建项目的窗口 2、安装插件element ui 3、Idea 打开这个项目即可 4、Idea 运行vue项目 npm run ser…

    数据库 2023年6月9日
    092
  • MySQL知识点大全!!

    使用PreStatement对象: public int execUpdate(String sql, Object[] parms) { int count = 0; try {…

    数据库 2023年5月24日
    074
  • 计算机网络 | TCP 连接的建立 和 TCP 连接的断开

    TCP 连接的建立过程 一开始,客户端和服务端都处于 close 状态。 先是服务端监听某个端口,此时服务端处于 listen 状态。 这个时候客户端就可以发送连接请求报文了。 第…

    数据库 2023年6月11日
    0117
  • Mysql事件调度实现字段自动刷新

    mysql中事件与触发器,触发器是当mysql运行起来之后因某些设定的语句而触发执行,事件则可自定义一次或者周期性执行的任务,在mysql中有特定的线程来管理它,即”事…

    数据库 2023年5月24日
    081
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球