转:DynaBean 的使用
DynaBean 的使用
?????? 在正常的开发的过程中,我们时常会遇到这样的问题, JavaBean 的属性是不确定的、动态的,其属性的确定是由逻辑控制来处理的。比如这样的一种情况,有一组基本报表信息需要 JavaBean 来描述,这组报表在结构上具有很大的相似性,如果你不想为每一份基本报表都创建一个 JavaBean ,那么接下来为你介绍一种为 JavaBean 动态创建属性的方法。
1.?? DynaBean 的创建
?????? 为了描述的便利,我们虚拟一个简单的需求环境,就以上面提到的描述一组基本报表信息为例吧,我们假设基本报表的名称为 basicReport ,每一份基本报表都包含 3 个属性 id 、 name 、 rowNo( 行号 ) 。在下面我们将使用 org.apache.commons.beanutils 包提供为我们的一些接口和类来处理上面提到的需求。
1.1. DynaBean and DynaClass
DynaBean 和 DynaClass 是 beanutils 包实现 DynaBean 最基本、最常用的接口。对于 DynaBean 和 DynaClass 你可以这样理解, DanyBean 提供了可以动态修改实现他的类的属性名称、属性值、属性类型的功能;而 DynaClass 负责为一个或者多个实现了 DanyBean 接口的对象提供属性的功能, DynaClass 提供的属性正是我们动态创建的那些属性参考 。如果你不理解,在下一节 BasicDynaBean and BasicDynaClass 我们以实例展示。
关于 DynaBean 和 DynaClass 的详细描述,参见 DynaBean 和 DynaClass 。
1.2. BasicDynaBean and BasicDynaClass
BasicDynaBean 和 BasicDynaClass 分别实现了 DynaBean 和 DynaClass 接口, BasicDynaBean 和 BasicDynaClass 实现了提供一组基本的属性的能力,这组属性是由你动态定义的,而且这组属性中的成员应该是 DynaProperty 类的实例。首先,你要为 DynaClass 创建你所关心的一组属性,代码如下:
示例代码:
?????? ??? DynaProperty[] props = new DynaProperty[]
{
?????? ??????????? new DynaProperty("id",String.class),
?????? ??????????? new DynaProperty("name", String.class),
?????? ??????????? new DynaProperty("rowNo", int.class),
?????? ??????????? new DynaProperty("c1",? long.class),
?????? ??????????? new DynaProperty("c2",long.class),
?????? ??????????? new DynaProperty("c3",long.class)
?????? ??? };
BasicDynaClass dynaClass = new BasicDynaClass("basicReport", null, props);
说明: ???????????????????????????????????????????????????????????????
?????? BasicDynaClass
一共提供了3个构造函数,我这里强调的只有一点,对于参数dynaBeanClass的一个说明。在上面的代码中,我们指定要创建一个名称为“ basicReport ”的DynaBean,dynaBeanClass参数说明的是你希望系统为你创建的DynaBean的类型是什么,如果为null的话,系统就认为你要创建的是BasicDynaBean类型的DynaBean实例。如果你希望用其他类型代替null的话,那么指定的类应该实现了DynaClass接口,否则就会抛出IllegalArgumentException 异常 。?????????????????????
在上面的代码中,我们假设为 basicReport 创建了 6 个属性,同时告诉了 BasicDynaClass ,我们需要创建一个名称为 basicReport 的报表, basicReport 的类型我们采用默认的 BasicDynaBean 。接下来,我们由 dynaClass 对象为我们实例化我们设置的这个动态对象,参考代码如下:???
?????????????????
示例代码:
????????????? DynaBean basicReport = dynaClass.newInstance();
?????? ??? basicReport.set("id","124578");
?????? ??? basicReport.set("name"," 在校生数 ");
?????? ??? basicReport.set("rowNo",new Integer(1));
?????? ??? basicReport.set("c1",new Long(125));
?????? ??? basicReport.set("c2",new Long(125));
?????? ??? basicReport.set("c3",new Long(125));
?????????????
????????????? String id = (String)basicReport.get(“id”);
????????????? String name = (String) basicReport.get("name");
?????? ??? int rowNo = ((Integer)basicReport.get("rowNo")).intValue();???
?
在上面的代码中我们完成了 DynaBean 的实例化 (basicReport) ,并且对实例化的 basicReport 进行了设置和获取的操作。
关于 DynaBean 还有其他形式的应用,像 ResultSetDynaClass 、 LazyDynaBean 等分别描述了如何处理数据库检索结果集的 DynaBean 处理、以及简略 DynaProperties 处理的 LazyDynaBean 的处理方式,这些都能极大地简化开发过程中 JavaBean 的处理,要了解更多请参考 http://jakarta.apache.org/commons/beanutils/api/index.html 。
上面讲述的常常是在逻辑处理时碰到的,那么在 Struts 框架下动态的页面的显示以及提交是否也有这方面的处理呢?答案是肯定的。?????????
?
?
?
?
?