Digester 的使用(tomcat中server.xml and web.xml 的加载)
2017-03-30 19:33
841 查看
最近看看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);
}
}
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);
}
}
相关文章推荐
- webpack配置热加载之react-hot-loader和webpack-dev-server的使用
- tomcat conf目录下web.xml,tomcat-users.xml,server.xml,context.xml四个文件的作用
- tomcat conf目录下web.xml,tomcat-users.xml,server.xml,context.xml四个文件的作用
- log4j无日志生成? 我将一个web项目部署在tomcat server.xml配置文件中,当我启动tomcat是无日志输出。
- Tomcat 8(八)Tomcat解析server.xml的工具—Digester
- [从零开始搭网站五]http网站Tomcat配置web.xml和server.xml
- 读Tomcat源码确定加载web.xml中节点元素的顺序
- Tomcat web.xml 中的listener、 filter、servlet 加载顺序及其详解
- tomcat对于web.xml的security-constraint使用的处理机制
- 在今天的测试过程中,我刚开始使用get方法传递参数,出现乱码,但是使用post传参数好着的,需要在tomcat的server.xml里面进行设置URIEncoding="UTF-8"即可
- tomcat conf目录下web.xml、tomcat-users.xml、server.xml以及context.xml四个文件的作用
- 更改tomcat项目路径 不修改server.xml【推荐使用此方法】
- 了解tomcat conf目录下web.xml,tomcat-users.xml,server.xml,以及context.xml四个文件的作用
- WebSphere Application Server 更新web.xml的问题以解决有些应用在tomcat环境下可以跑,更新到was上失效的问题
- SVN 上检出的包不能被tomcat 加载 Tomcat version 6.0 only supports J2EE 1.2, 1.3, 1.4, and Java EE 5 Web modul
- Tomcat源码的catalina中利用Digester解析conf/server.xml
- Tomcat的Web.xml加载顺序
- tomcat 不使用ROOT 使用server.xml配置 去除项目名 使用80端口访问项目
- tomcat之catalina使用Digester解析XML配置文件
- Tomcat项目发布的三种方式;一种:直接将项目(文件)直接复制到tomcat/webapps下二种:在tomcat/conf/server.xml配置tomcat的虚拟路径;