`
leadyu
  • 浏览: 51444 次
  • 性别: Icon_minigender_1
  • 来自: 广州,福州
文章分类
社区版块
存档分类
最新评论

Jwebap项目(二)——Digester项目的介绍

阅读更多
Digester是Jakarta 子项目Commons下的一个模块,支持基于规则的对任意XML文档的处理。Jwebap中采用它进行XML的加载。

Digester项目提供了非常友好的XML操作API,当XML结构改变时,只需要改变映射的规则,就可以完成代码的修改。

Digester项目提供了一个简单的例子
假定有两个JavaBean如下,分别为Person和Address

package mypackage;
public class Person {
  public void addAddress(Address address);
  public Iterator getAddress();
  public String getName();
  public void setName(String name);
}
public mypackage;
public class Address {
  public int getStreet();
  public void setStreet(String street);
  public String getCity();
  public void setCity(String city);
}

  用下面的xml文件进行配置

<Person name="yu.lide">
  <address>
      <type>business</type>
      <street>234 Maple Dr.</street>
      <city>Los Angeles</city>
      <state>CA</state>
      <zip>98765</zip>
      <country>USA</country>
    </address>
   <address>
      <type>business</type>
      <street>234 Maple Dr.</street>
      <city>Los Angeles</city>
      <state>CA</state>
      <zip>98765</zip>
      <country>USA</country>
    </address>
</Person>

Digester digester = new Digester();  
digester.setValidating(false); //不进行XML与相应的DTD的合法性验证 
//当遇到<Person>时创建一个mypackage.Person对象,并将其放在栈顶 
digester.addObjectCreate("Person", "mypackage.Person");
//根据<Person>元素的属性(attribute),对刚创建的Person对象的属性(property)进行设置 
digester.addSetProperties("Person");
//当遇到<Person>的子元素<address>时创建一个mypackage.Address对象,并将其放在栈顶。 
digester.addObjectCreate("Person/Address", "mypackage.Address"); 
//根据<Address>元素的属性(attribute),对刚创建的Address对象的属性(property)进行设置
digester.addSetProperties("Person/Address");
//对<Address>元素的子标签包含的内容当成属性进行设置
digester.addSetNestProperties("Person/Address");
//当再次遇到<Person>的子元素<Address>时创建一个mypackage.Address对象,并将其放在栈顶,同时调用第二栈顶元素(Person对象)的addAddress方法。  
digester.addSetNext("Person/Address", "addAddress", "mypackage.Address");
Person person = (Person) digester.parse(); 


当然,也可以通过配置rule.xml规则定义文件,来定义每个对象的映射规则,配置语法也很简单

<digester-rules>
  <pattern value="address-book">
    <pattern value="person">
      <object-create-rule classname="Person"/>
      <set-properties-rule/>
      <set-next-rule methodname="addPerson"/>
      
      <pattern value="name">
        <call-method-rule methodname="setName" paramcount="0"/>
      </pattern>
      
      <pattern value="email">
        <call-method-rule methodname="addEmail" paramcount="2"/>  
        <call-param-rule paramnumber='0' attrname='type'/>
        <call-param-rule paramnumber='1'/>
      </pattern>
      
      <pattern value="address">
        <object-create-rule classname="Address"/>
        <set-nested-properties-rule/>
        <set-next-rule methodname="addAddress"/>
      </pattern>
    </pattern>
  </pattern>
</digester-rules>


是不是很好用?多的不说,赶快去下载一下,试试吧,非常简单
分享到:
评论
3 楼 javatar 2007-12-17  
基于规则的配置方案, 可以考虑作为组件的配置, 其实只要被配置的类符合JavaBean规范, 或者说IoC可注入性, 配置方案很容易更换的.
2 楼 bao110908 2007-12-11  
嗯,Digester本来是用于Struts配置解析的,大概比较好,就单独地把它给拿出来了吧。
1 楼 huangyh 2007-12-09  
这东西是非常不错,非常的方便,顶一个

相关推荐

Global site tag (gtag.js) - Google Analytics