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)

大家都在看

  • myrocks复制中断问题排查

    mysql可以支持多种不同的存储引擎,innodb由于其高效的读写性能,并且支持事务特性,使得它成为mysql存储引擎的代名词,使用非常广泛。随着SSD逐渐普及,硬件存储成本越来越…

    数据库 2023年6月9日
    0108
  • MySQL 回表

    MySQL 回表 五花马,千金裘,呼儿将出换美酒,与尔同销万古愁。 一、简述 回表,顾名思义就是回到表中,也就是先通过普通索引扫描出数据所在的行,再通过行主键ID 取出索引中未包含…

    数据库 2023年6月14日
    083
  • Centos7安装Greenplum5.3单机版教程

    环境:centos7 ,Greenplum5.3 1. Greenplum 5.3 下载 安装包下载 https://download.csdn.net/download/Ange…

    数据库 2023年6月14日
    0102
  • 2022-8-20 数据库连接池

    1. 概念:其实就是一个容器(集合),存放数据库连接的容器。 当系统初&#x59CB…

    数据库 2023年6月14日
    0127
  • Windows10 下使用 telnet 命令

    正常情况下 windows 是使用不了 telnet 命令的: 打开控制面板-》程序和功能-》启用或关闭 Windows 功能 勾选 “Telnet客户端”…

    数据库 2023年6月14日
    082
  • MySQL的权限管理和Linux下的常用命令

    1.管理用户: root,具有最高权限,具有创建用户的权限,可以为其他用户授权 2.普通用户: 普通由root用户创建,权限由root分配 — mysql创建用户: create…

    数据库 2023年6月16日
    062
  • Read View的可见性判断理解

    读了 @SnailMann大佬【MySQL笔记】正确的理解MySQL的MVCC及实现原理 收益颇丰,非常感谢! 但对其中如何判断事务是否可见性还是不太理解,于是作了本文,在原博客基…

    数据库 2023年6月16日
    084
  • 删除chrome的域名安全策略

    使用过程中总有特殊情况必须使用http请求、又或者必须使用https请求 目前有两种思路,一种是浏览器默认开了http转https请求,像chrome和Firefox,另一种就是服…

    数据库 2023年6月6日
    0102
  • Vue 2.0 基础

    知识点 1.是一个MVVM框架 由MVC架构衍生,分为View(视图层)、ViewModel(数据视图层)、Model(数据层),MVVM 最标志性的特性就是 数据绑定,实现数据驱…

    数据库 2023年6月11日
    0105
  • MySQL实战45讲 10

    10 | MySQL为什么有时候会选错索引? 使用哪个索引是由 MySQL 来确定的 可能遇到的情况:一条本来可以执行得很快的语句,却由于 MySQL 选错了索引,而导致执行速度变…

    数据库 2023年5月24日
    0128
  • 云数据库技术|“重磅升级”后再测 TDSQL-C

    标题 1.摘要 前段时间,测试了国内主要云原生数据库 PolarDB、TDSQL-C、GaussDB 的性能,参考:《再测云原生数据库性能》。在上次测试结果中,由于地域版本差异,腾…

    数据库 2023年6月11日
    085
  • 【JDBC】笔记(2)— 模拟用户登录功能 (javaSE+MySQL+JDBC)[ 应用 Statement ]

    一.实现功能: 1、需求:模拟用户登录功能的实现2、业务描述:当程序运行时,它为用户输入用户名和密码提供了一个入口点。 [En] When the program is runni…

    数据库 2023年5月24日
    0194
  • Python–模块Module

    1、定义模块:用来从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能),本质就是.py结尾的python文件,(文件名:test.py,对应的模块名test)包:用来…

    数据库 2023年6月9日
    090
  • 三道MySQL联合索引面试题,淘汰80%的面试者,你能答对几道

    众所周知MySQL 联合索引遵循最左前缀匹配原则,在少数情况下也会不遵循(有兴趣,可以翻一下上篇文章)。 创建 联合索引的时候,建议优先把区分度高的字段放在第一列。 至于如何计算分…

    数据库 2023年5月24日
    076
  • jQuery学习笔记

    jQuery 是一个 JavaScript 库; jQuery 极大地简化了 JavaScript 编程; jQuery 很容易学习; 一. 什么 jQuery? jQuery 是…

    数据库 2023年6月11日
    090
  • 同时运行两个版本相同的tomcat

    由于项目需要,代理集群和一个节点都部署在本地,那么就需要有两个tomcat,一个部署集群,一个部署项目,我都用了7.0.34版本的tomcat 当启动代理的tomcat成功时,再启…

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