DynaBean是BeanUtils里的寶貝之一。有了動(dòng)態(tài)Bean,就不用寫那么多VO出來了,特別那些只是為了和View交互而存在的bean,i hate Form Bean。
DynaBean的用法很簡(jiǎn)單,特別是有了LazyBynaBean之后.
DynaBean car = new LazyDynaBean();
car.set("carNo",1);
car.set("owner","張三");
out.print(car.get("carNo"));
看著像一個(gè)map,只不過多了反射的功能,所以支持那些使用反射來獲取屬性的場(chǎng)合。
但是因?yàn)樗麤]有car.getCarNo()這樣的函數(shù),只能用car.get("carNo"),所以也就不支持JSTL里面<c: out
value="{car.carNo}">這樣的語法,因?yàn)镴STL是默認(rèn)轉(zhuǎn)回car.getCarNo()的。
而且?guī)捉?jīng)討論,JSTL不支持 car.userFunction(),理由是不希望代碼里有java代碼:(
因此,還是寫<%=car.get("carNo")>好了,如果是陷在JSTL的一個(gè)循環(huán)結(jié)構(gòu)里,就要用從pageContext里面把bean拿出來,
又或者自己寫的tag,幸虧也很簡(jiǎn)單,用BeanUtils.getProperty(bean,property)函數(shù)就可以了,
又或者,用Velocity和Freemarker。
最后,如果car.set("carNo",null),會(huì)得到一個(gè)莫名其妙的Object對(duì)象,如果要使它為Null,需要先定義他的類型。
因此,對(duì)于可能為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);