DynaBean是BeanUtils里的宝贝之一。有了动态Bean,就不用写那么多VO出来了,特别那些只是为了和View交互而存在的bean,i hate Form Bean。
DynaBean的用法很简单,特别是有了LazyBynaBean之后.
DynaBean car = new LazyDynaBean();
car.set("carNo",1);
car.set("owner","张三");
out.print(car.get("carNo"));
看着像一个map,只不过多了反射的功能,所以支持那些使用反射来获取属性的场合。
但是因为他没有car.getCarNo()这样的函数,只能用car.get("carNo"),所以也就不支持JSTL里面<c: out value="{car.carNo}">这样的语法,因为JSTL是默认转回car.getCarNo()的。
而且几经讨论,JSTL不支持 car.userFunction(),理由是不希望代码里有java代码:(
因此,还是写<%=car.get("carNo")>好了,如果是陷在JSTL的一个循环结构里,就要用从pageContext里面把bean拿出来,
又或者自己写的tag,幸亏也很简单,用BeanUtils.getProperty(bean,property)函数就可以了,
又或者,用Velocity和Freemarker。
最后,如果car.set("carNo",null),会得到一个莫名其妙的Object对象,如果要使它为Null,需要先定义他的类型。
因此,对于可能为Null的列,需要用LazyClass定义类型,幸亏也很Lazy, 不可能为Null的值可以不管。
LazyDynaClass lc = new LazyDynaClass();
lc.add("owner",String.class); // 指定null converter String
DynaBean car = new LazyDynaBean(lc);
car.set("carNo",1);
car.set("owner",null);
有关动态bean的一些用法,涉及到的类如下:
1、DynaBean是一个接口,它的实现类有BasicDynaBean、LazyDynaBean、ResultSetIterator、WrapDynaBean
2、DynaClass,也是接口,它的实现类有BasicDynaClass、WrapDynaClass等
3、DynaProperty,用来设置动态bean的属性
4、PropertyUtils,工具类,主要用来设置、取得属性值
等等,可以查阅commons-beanutils.jar
这里列举一个例子,讲述它的用法,代码如下:
①动态设置了三个属性id、name、email
DynaProperty[] property = {
new DynaProperty("id", Class.forName("java.lang.String")),
new DynaProperty("name", Class.forName("java.lang.String")),
new DynaProperty("email", Class.forName("java.lang.String"))
};
②创建一个dynaClass,通过dynaClass来创建DynaBean的实例
DynaClass dynaClass = new BasicDynaClass("bean", null, property);
DynaBean bean = dynaClass.newInstance();
③通过PropertyUtils来设置属性值
PropertyUtils.setProperty(bean, "id", "001");
PropertyUtils.setProperty(bean, "name", "iplan");
PropertyUtils.setProperty(bean, "email", "l...@love.com");
④通过以上的设置,这个bean就可以像平时的javabean一样来使用了
当然,不是xxx.getId(),而是bean.get("id");的用法
说明:在①处,除了设置一般的类型外,也可以设置其它类型(如java.util.List等),还可以是一般的javabean。
在②处,在构造函数中的"bean",是描述它的一个标记
在③处,可以不采用PropertyUtils来设置属性值,而是直接通过如下方式
bean.set("id", "001");
bean.set("name", "iplan");
bean.set("email", "l...@love.com");
总结一下:要使用BasicDynaBean,就首先要构造一个BasicDynaClass来包含期望的数据结构。
DynaBean的用法很简单,特别是有了LazyBynaBean之后.
DynaBean car = new LazyDynaBean();
car.set("carNo",1);
car.set("owner","张三");
out.print(car.get("carNo"));
看着像一个map,只不过多了反射的功能,所以支持那些使用反射来获取属性的场合。
但是因为他没有car.getCarNo()这样的函数,只能用car.get("carNo"),所以也就不支持JSTL里面<c: out value="{car.carNo}">这样的语法,因为JSTL是默认转回car.getCarNo()的。
而且几经讨论,JSTL不支持 car.userFunction(),理由是不希望代码里有java代码:(
因此,还是写<%=car.get("carNo")>好了,如果是陷在JSTL的一个循环结构里,就要用从pageContext里面把bean拿出来,
又或者自己写的tag,幸亏也很简单,用BeanUtils.getProperty(bean,property)函数就可以了,
又或者,用Velocity和Freemarker。
最后,如果car.set("carNo",null),会得到一个莫名其妙的Object对象,如果要使它为Null,需要先定义他的类型。
因此,对于可能为Null的列,需要用LazyClass定义类型,幸亏也很Lazy, 不可能为Null的值可以不管。
LazyDynaClass lc = new LazyDynaClass();
lc.add("owner",String.class); // 指定null converter String
DynaBean car = new LazyDynaBean(lc);
car.set("carNo",1);
car.set("owner",null);
有关动态bean的一些用法,涉及到的类如下:
1、DynaBean是一个接口,它的实现类有BasicDynaBean、LazyDynaBean、ResultSetIterator、WrapDynaBean
2、DynaClass,也是接口,它的实现类有BasicDynaClass、WrapDynaClass等
3、DynaProperty,用来设置动态bean的属性
4、PropertyUtils,工具类,主要用来设置、取得属性值
等等,可以查阅commons-beanutils.jar
这里列举一个例子,讲述它的用法,代码如下:
①动态设置了三个属性id、name、email
DynaProperty[] property = {
new DynaProperty("id", Class.forName("java.lang.String")),
new DynaProperty("name", Class.forName("java.lang.String")),
new DynaProperty("email", Class.forName("java.lang.String"))
};
②创建一个dynaClass,通过dynaClass来创建DynaBean的实例
DynaClass dynaClass = new BasicDynaClass("bean", null, property);
DynaBean bean = dynaClass.newInstance();
③通过PropertyUtils来设置属性值
PropertyUtils.setProperty(bean, "id", "001");
PropertyUtils.setProperty(bean, "name", "iplan");
PropertyUtils.setProperty(bean, "email", "l...@love.com");
④通过以上的设置,这个bean就可以像平时的javabean一样来使用了
当然,不是xxx.getId(),而是bean.get("id");的用法
说明:在①处,除了设置一般的类型外,也可以设置其它类型(如java.util.List等),还可以是一般的javabean。
在②处,在构造函数中的"bean",是描述它的一个标记
在③处,可以不采用PropertyUtils来设置属性值,而是直接通过如下方式
bean.set("id", "001");
bean.set("name", "iplan");
bean.set("email", "l...@love.com");
总结一下:要使用BasicDynaBean,就首先要构造一个BasicDynaClass来包含期望的数据结构。