博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Digester 的使用(tomcat中server.xml and web.xml 的加载)
阅读量:6113 次
发布时间:2019-06-21

本文共 3628 字,大约阅读时间需要 12 分钟。

最近看看tomcat的源码实现,发现将xml解析为java对象使用了 Digester;故而学习一下;

Digester 通过递归的思想解决xml的解析;使用Stack 的堆栈结构,xml解析的时候,主要关注 begin(开始一个标签) 和 end(结束一个标签) 事件;

begin:创建对象并入栈;

end:对象出栈;

在begin 和 end 之间,我们可以设置对象(栈顶)属性,并将栈顶的下一个对象与当前栈顶对象建立父子关系(一对一或一对多;与xml中父子节点定义一致);

xml节点的匹配使用pattern ,支持模糊匹配; (节点之间使用/分割)

事件 使用预先定义的Rule;

具体请看下例:

<system>

<ams attr="attr-A" attrKey="propertyRule" attrValue="propertyRuleValue">
<name>供应商管理</name>
</ams>
<dmc realClass="Dmc_B">
<name>数据中心</name>
</dmc>
</system>

解析以上的xml 并转为 System 的对象

定义如下的类:

<system> 对应的类

public class System {

private Ams ams;

private Dmc dmc;

public Ams getAms() {

return ams;
}

public void setAms(Ams ams) {

this.ams = ams;
}

public Dmc getDmc() {

return dmc;
}

public void setDmc(Dmc dmc) {

this.dmc = dmc;
}

@Override

public String toString() {
return "System [ams=" + ams + ", dmc=" + dmc + "]";
}
}

<ams> 对应的类 

public class Ams {

private System system;
public void setSystem(System system) {
this.system = system;
}

private String name;

private String attr;
private String propertyRule;

public void setPropertyRule(String propertyRule) {

this.propertyRule = propertyRule;
}

public String getName() {

return name;
}

public void setName(String name) {

this.name = name;
}

public void setAttr(String attr) {

this.attr = attr;
}

@Override

public String toString() {
return "Ams [system=" + (null==system?null:system.hashCode()) + ", name=" + name + ", attr=" + attr + ", propertyRule=" + propertyRule + "]";
}
}

 

<dmc> 对应的类 有三个 abstract 的Dmc、继承Dmc 的 Dmc_A、Dmc_B

public abstract class Dmc {

private String name;

public Dmc(String name) {

super();
this.name = name;
}

public String getName() {

return name;
}

public void setName(String name) {

this.name = name;
}

@Override

public String toString() {
return "Dmc [name=" + name + "]";
}
}

public class Dmc_A extends Dmc {

public Dmc_A(String name) {

super(name);
}

@Override

public String toString() {
return "Dmc_A [getName()=" + getName() + "]";
}

}

 

public class Dmc_B extends Dmc{

public Dmc_B(String name) {

super(name);
}

@Override

public String toString() {
return "Dmc_B [getName()=" + getName() + "]";
}
}

自定义的DmcObjectCreationFactory 

public class DmcObjectCreationFactory extends AbstractObjectCreationFactory<Dmc> {

@Override

public Dmc createObject(Attributes attributes) throws Exception {
String realClass = attributes.getValue("realClass");
if("Dmc_A".equals(realClass)) {
return new Dmc_A("默认名称");
} else if("Dmc_B".equals(realClass)) {
return new Dmc_B("默认名称");
}
return null;
}
}

 

测试类

public class DigesterTest {

public static void main(String[] args) throws IOException, SAXException {
Rule ruleA = new ObjectCreateRule(com.hym.digester.bean.System.class);
Rule ruleB = new ObjectCreateRule(com.hym.digester.bean.Ams.class);
Rule ruleC = new SetNextRule("setAms", com.hym.digester.bean.Ams.class);
Rule ruleF = new SetTopRule("setSystem", com.hym.digester.bean.System.class);
Rule ruleD = new SetPropertiesRule();
Rule ruleE = new SetPropertyRule("attrKey", "attrValue");
Rule ruleG = new FactoryCreateRule(DmcObjectCreationFactory.class);
Rule ruleH = new SetNextRule("setDmc", com.hym.digester.bean.Dmc.class);
Digester digester = new Digester();
digester.addRule("system", ruleA);
digester.addRule("system/ams", ruleB);
digester.addRule("system/ams", ruleC);
digester.addRule("system/ams", ruleD);
digester.addRule("system/ams", ruleE);
digester.addRule("system/ams", ruleF);
digester.addRule("system/dmc", ruleG);
digester.addRule("system/dmc", ruleH);
Object obj = digester.parse(new File("D:/WorkSpace/LearnDemo/src/resource/digester/System.xml"));
System.out.println(obj);
}
}

转载于:https://www.cnblogs.com/hzw-hym/p/6648091.html

你可能感兴趣的文章
php与ethereum客户端交互
查看>>
JavaFx系列教程之一:JavaFx+Springboot+Maven 开发打包教程
查看>>
67 个拯救前端开发者的工具、库和资源
查看>>
leetcode median of two sorted arrays C语言实现
查看>>
iOS微信内存监控
查看>>
解决vue开发环境跨域问题
查看>>
Flutter 初尝:从 Java 无缝过渡
查看>>
Canvas画板---手机上也可以用的画板
查看>>
Linux
查看>>
JS中的原型链和原型的认识
查看>>
OneAPM NI 基于旁路镜像数据的真实用户体验监控
查看>>
golang channel
查看>>
JAVA通过Gearman实现MySQL到Redis的数据同步(异步复制)
查看>>
设计模式在 TypeScript 中的应用 - 单例模式
查看>>
[后台系统模板]优质、整洁的基于Bootstrap 3& Bootstrap 4的响应式后台管理系统模板...
查看>>
利用七牛 qshell 和 Automator 打造快捷上传服务
查看>>
制作kubernetes1.8离线安装包有感,我们的劳动如何变现
查看>>
cookie介绍一个简单的效果传值
查看>>
Egg + Vue 服务端渲染工程化建设
查看>>
监听微信手Q的挂起事件(visibilitychange)
查看>>