前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >tomcat (2.5) Digester

tomcat (2.5) Digester

作者头像
平凡的学生族
发布2019-05-25 09:22:48
3990
发布2019-05-25 09:22:48
举报
文章被收录于专栏:后端技术后端技术后端技术

1. 参考

深入理解Tomcat(六)Digester组件 digester和rule

2. 是什么

它是用于解析xml文件的类库。

我们提到Digester其实有两种:

  1. tomat内嵌的org.apache.tomcat.util.digester.Digester
  2. maven依赖的digester

第一种其实只是把第二种的源代码拷贝过去了,其实基本是等同的。

3. 解析方式

市面上有两种解析方式的xml Parser。

  1. 将整个xml读取,解析,保存到内存,比如Dom4j
  2. 基于流进行分析,比如sax Digester是第二种,底层是基于sax的。

4. 常规使用方法

4.1 addObjectCreate

public void addObjectCreate(String pattern, String className, String attributeName)

增加对象创建规则,当匹配到pattern模式时,如果指定了attributeName,则根据attributeName创建类对象;否则根据className创建类对象。 比如对于xml里有标签

<School name="Jen">

代码中有

digester.addObjectCreate("School", School.class.getName(), "className");

则解析器会先查看<School>标签里是否有className属性,如果有,则用它的字符串所指向的类来构建对象。如果没有,则用School.class.getName()所指向的类来构建对象。 此处标签显然没有指定className,因此会用School.class.getName()来构建对象,也就是构建School.class

如果代码中为

digester.addObjectCreate("School", null, "className");

说明在标签内必须显式指定className属性,比如<School className="xxx.xx.xx.School">,否则会报错。

4.2 addSetProperties

digester.addSetProperties("School");

这个比较好理解。 将指定节点的属性映射到对象,即将School节点的name的属性映射到School.java。会调用属性对应的set方法,因此必须提供。 比如,对于如下标签:

<School name="Jen">

会调用节点对象的setName方法。

4.3 addSetNext

public void addSetNext(String pattern, String methodName, String paramType)

增加设置下一个规则,当匹配到pattern模式时,调用父节点的methodName方法,paramType为方法传入参数的类型

digester.addSetNext("School", "setSchool", School.class.getName());

会调用父节点的setSchool方法,且参数类型为School.class.getName()所指向的类,传入参数为当前节点所构建的对象。

5. addRule

查看源码,发现addSetPropertiesaddSetNext这些其实内部都是调用了addRule(pattern, new SetPropertiesRule());。 所以addRule是提供一个实现了某些方法的Rule类。 Rule抽象类有核心的几个公共方法,如下:

  • begin:遇到标签开头执行的方法
  • end:遇到标签结束执行的方法
  • finish:遇到标签全部解析完成后的方法

6. RuleSet

digester.addRuleSet(new NamingRuleSet("Server/GlobalNamingResources/"));

碰到Server/GlobalNamingResources/节点时将会调用 org.apache.catalina.startup.NamingRuleSet类中的 addRuleInstances方法添加解析规则。

总结

Digester会用流的方式解析xml,并生成对应的对象。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.04.10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 参考
  • 2. 是什么
  • 3. 解析方式
  • 4. 常规使用方法
    • 4.1 addObjectCreate
      • 4.2 addSetProperties
        • 4.3 addSetNext
        • 5. addRule
        • 6. RuleSet
        • 总结
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档