Digester:可以归纳为模式和规则。
模式:说白了就是xml文件的元素标签,只不过是附带了父节点的标签,用分隔符“/”分割。
规则:rule,当遇到一个模式(xml标签元素)时,需要执行相应的动作。
Rule是个抽象类,它有很多个子类,主要的子类有:
ObjectCreateRule:创建对象
SetPropertyRule:设置属性
CallMethodRule:调用方法
SetNextRule:创建对象之间的关系
<studentid="1"group="1"><name>张三</name></student>
digester.addObjectCreate(“student”,”stu.test.Stundet”),这个意思就是碰到student标签就创建student实例.
digester. SetPropertyRule(“student”),这样就把id、group属性注入到student实例中
digester.addObjectCreate(“student/name”,”stu.test.SName”),碰到student/name标签就创建sname实例.
digester.addSetNext("student/name",
"setName"); 这样在创建student及name实例之后,就会利用student的setName方法把name实例注入.
最后还有个最要方法说明,这个也是tomcat源码中的digester没有,与commons
jar包中区别,就是tomcat中的Digester没有addBeanPropertySetter方法。
digester.addBeanPropertySetter("root/parent/child","value");例如<name>张三</name>,张三就赋予给Child实例的value属性。
tomcat的server.xml文件中没有像这种直接裸露的不用标签包裹的文本值。所以它没有这个方法。
需要注意的是顺序不能颠倒,不然会报错。特别是创建对象和设置属性不能颠倒,对象之间的父子顺序也不能颠倒。因为digester直接从栈顶弹出对象,紧跟着它的属性不存在就报错了。
这些子类的最主要的作用就是解析xml元素标签。当遇到相应的xml标签时,寻找到对应的rule执行代码。其中这些类中最主要的方法就是begin及end方法。一个是开始标签要执行的方法,一个是结束标签需要执行的方法。
我们知道,Digester是sax方式解析xml的,是继承了DefaultHandler。那么它一定需要去实现startElement、startDocument、endElement、endDocument等,在dom解析时分析过,sax与dom解析方式区分开来的关键点就是在DTDValidate. startElement等方法里面。dom调用的是dom的默认的解析方式,digester调用的是digester解析方式。digester与sax解析不同,就是sax需自己去实现DefaultHandler完成解析,digester则是系统已经集成,只需要自己注册规则。
那么对于digester有几个rule类特别容易混淆,下面简单说明下:
Rule:规则抽象类,前面已经列举了5个规则的实现子类
Rules:接口,list列表包含Rule
RulesBase:实现Rules,作用是注册rule、查找rule。
RuleSet:digester.addRuleSet,添加一系列的模式及规则,不是一个个单独的去添加。
digester.parse方法执行之后,基本上解析的步骤与sax解析方式是一致的。其实与dom解析的差别也不算太大。最主要的差别就是在DTDValidate. startElement等方法里面,digester调用的就是rule规则里面的begin、end等方法进行xml文档的解析。所有的对象都push到digester 的stack中,parse返回的对象就是xml文档的root根元素。
=