項目中要用到解析配置文件的功能,google了一下,發現基本都是說用Digester的,正好工程中有這個jar包,所以可以用,研究了一下。Digester原來是struts1.x下面的jar,但由於解析xml到bean是個如此常用的功能,於是就分出來了,成爲apache一個單獨的項目了,它用純java實現。試了一下,解析xml還是挺方便的。下面是我改寫了官網提供的一個例子,基本覆蓋常用的功能。
example.xml:
beans:
測試類:
簡單說明一下,
1)當創建bean中的bean屬性時,如AddressBook的Person對象,總是需要兩步:
addObjectCreate
addSetNext
前者是告訴系統下面的元素會映射成一個對象,後者告訴系統用當前父對象的哪個方法將這個新的子對象添加進來,不能以addCallMethod代替,如果用了,會發現多個元素時,只有一個被添加了進去,原因我也不知道,文檔講得也不清楚.
2)讀取attribute
兩種辦法,一種是addSetProperties(),它會用xml中的attribute來設置bean上同名的property,如果兩者名字不同怎麼辦,如例中xml裏是birth,而bean中叫birthDay,用第二種辦法addSetProperties("address-book/person","birth","birthDay");
3)將元素文本設置給bean的property
我一般比較喜歡用addBeanPropertySetter,用addCallMethod也可以,不過要指定參數的個數,如果只有一個參數,那麼個數用0表示,a little weird。
另外,addSetNestedProperties這個方法可以將一組元素按鈕元素名設置給bean的property,如:
用addSetNestedProperties("address-book/person/address"),它會把這些子元素都作爲property設置給address。
如果想給bean設置一個常量的屬性,addCallMethod之後用addObjectParam即可。Digester一點兒也難,多動手練習就會明白。
是不是很簡單?瞭解了原理,當xml結構變化時,可以簡單地修改下代碼就同步了,另外有種辦法貌似是用xmlbeans,用annotation實現的,在一個項目中見過,不過沒研究過。
官方例子:
http://svn.apache.org/viewvc/commons/proper/digester/trunk/src/examples/
需要的其它jar包,commons-logging,BeanUtils
如果想使用日誌,定義個commons-logging.properties文件,附上以下內容:
org.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog
org.apache.commons.logging.simplelog.log.org.apache.commons.digester.Digester=debug
org.apache.commons.logging.simplelog.log.org.apache.commons.digester.Digester.sax=info