Digester學(xué)習(xí)筆記

          程序中用到的文件

          Example.xml (程序解析的xml文件)
          ???????????????
          ??????????????????
          ?1?<?xml?version="1.0"?encoding="UTF-8"?>
          ?2?
          ?3?<address-book>
          ?4?????<person?id="1"?category="acquaintance"?try="would?be?ignored">
          ?5?
          ?6?????<name>Gonzo</name>
          ?7?
          ?8?????<email?type="business">gonzo@muppets.com</email>
          ?9?
          10?????<gender?result="the?whole?tag?would?be?ignored">male</gender>
          11?
          12???</person>
          13?
          14???<person?id="2"?category="rolemodel">
          15?
          16?????<name>Kermit</name>
          17?
          18?????<email?type="business">kermit@muppets.com</email>
          19?
          20?????<email?type="home">kermie@acme.com</email>
          21?
          22???</person>
          23?
          24?</address-book>

          Person.java :
          ????????????
          ?1?package?digester.test;
          ?2?
          ?3?import?java.util.HashMap;
          ?4?import?java.util.Iterator;
          ?5?
          ?6?public?class?Person?{
          ?7?????private?int?id;
          ?8?????private?String??category;
          ?9?????private?String?name;
          10?????private?HashMap<String,?String>?emails?=?new?HashMap<String,?String>();
          11?????//下面的兩個(gè)方法的名字中set以后的部分,與</person>的屬性名字對(duì)應(yīng)?
          12?????//當(dāng)從xml文件中識(shí)別出<person>的屬性時(shí),如果有要求(即調(diào)用過(guò)addSetProperties方法),Digester會(huì)依據(jù)這種對(duì)映關(guān)系自動(dòng)調(diào)用相應(yīng)的方法。
          13?????
          14?????public?void?setId(int?id){
          15?????????this.id=id;????????
          16?????}
          17?????public?void?setCategory(String?category)?{
          18???????????this.category?=?category;
          19???????}
          20?????
          21?????//對(duì)應(yīng)name而言,因?yàn)槠渲祦?lái)自name標(biāo)簽的內(nèi)容,而非屬性值
          22?????//需要調(diào)用addCallMethod指定識(shí)別<name>后調(diào)用此方法,自動(dòng)調(diào)用,需調(diào)用addBeanPropertySetter()方法
          23?????
          24??????public?void?setName(String?name)?{
          25???????????this.name?=?name;
          26???????}
          27??????//同name,此時(shí)還要一一指定addEmail的參數(shù)值的來(lái)源。
          28??????public?void?addEmail(String?type,?String?address)?{
          29???????????emails.put(type,?address);
          30???????}
          31??????public?void?print()?{
          32?
          33???????????System.out.println("Person?#"?+?id);
          34?
          35???????????System.out.println("category="?+?category);
          36?
          37???????????System.out.println("name="?+?name);
          38?
          39???????????for(Iterator?i?=?emails.keySet().iterator();?i.hasNext();?)?{
          40?
          41???????????????String?type?=?(String)?i.next();
          42?
          43???????????????String?address?=?(String)?emails.get(type);
          44?
          45???????????????System.out.println("??email?(type?"?+?type?+?")?:?"?+?address);
          46?
          47???????????}
          48?
          49???????}
          50?
          51?}
          52?


          AddressBook.java

          ?????????
          ?1?package?digester.test;
          ?2?
          ?3?import?java.util.Iterator;
          ?4?import?java.util.LinkedList;
          ?5?
          ?6?public?class?AddressBook?{
          ?7??????LinkedList?people?=?new?LinkedList();
          ?8?
          ?9?????????public?void?addPerson(Person?p)?{
          10?????????????people.addLast(p);
          11?????????}
          12?????????public?void?print()?{
          13?????????????System.out.println("Address?book?has?"?+?people.size()?+?"?entries");?
          14?????????????for(Iterator?i?=?people.iterator();?i.hasNext();?)?{
          15?????????????????Person?p?=?(Person)?i.next();
          16?????????????????p.print();
          17?????????????}
          18?
          19?????????}
          20?????????public?void?digest()?{
          21?????????????//?TODO?Auto-generated?method?stub
          22?????????????
          23?????????}
          24?
          25?
          26?}
          27?



          主類(lèi):AddressBookDigester.java

          ???????????????
          ?1?package?digester.test;
          ?2?
          ?3?import?org.apache.commons.digester.Digester;
          ?4?????/**
          ?5??????*????digester技術(shù)最普通的應(yīng)用,就是用來(lái)動(dòng)態(tài)創(chuàng)建一個(gè)由java對(duì)象構(gòu)成的樹(shù)結(jié)構(gòu),各對(duì)象的屬性以及對(duì)象間的關(guān)系。
          ?6??????*????是基于xml文檔的內(nèi)容來(lái)設(shè)置的。為實(shí)現(xiàn)這種應(yīng)用,Digester提供了一個(gè)對(duì)象棧
          ?7??????*????clear(),清空棧的內(nèi)容;peek(),返回對(duì)棧頂對(duì)象的引用;pop(),將棧頂對(duì)象彈出并返回;push(),將一個(gè)新的對(duì)象壓入棧頂。
          ?8??????*??用棧的原因:
          ?9??????*??????????當(dāng)識(shí)別一個(gè)xml元素的開(kāi)始,創(chuàng)建對(duì)象并壓人棧頂。這個(gè)對(duì)象在處理該元素的子元素過(guò)程中一直在棧中,
          10??????*??????????當(dāng)所有子元素處理完后,解析器遇到該元素的結(jié)束標(biāo)記,彈出此對(duì)象,并進(jìn)行相應(yīng)的處理。
          11??????*?描述對(duì)象間的關(guān)系:
          12??????*?????????????將棧頂對(duì)象作為一個(gè)參數(shù),傳遞給該對(duì)象的下面的對(duì)象的一個(gè)方法,就可以簡(jiǎn)單的建立父子關(guān)系。
          13??????*?????????????從而可以簡(jiǎn)單地建立起1:1的關(guān)系(第二棧頂對(duì)象與棧頂對(duì)象之間)和1:N的關(guān)系(第二棧頂對(duì)象不動(dòng),N次壓棧頂彈棧頂對(duì)象)
          14??????*
          15??????*/
          16?public?class?AddressBookDigester?{
          17?????public?static?void?main(String[]?args)?throws?Exception?{
          18?????????AddressBookDigester?d=new?AddressBookDigester();
          19?????????//?創(chuàng)建一個(gè)Digester實(shí)例
          20?????????//當(dāng)遇到匹配元素的開(kāi)始標(biāo)記和結(jié)束標(biāo)記時(shí),begin()方法和end()方法將分別被調(diào)用。?
          21?????????Digester?digester=?new?Digester();
          22?????????//?創(chuàng)建AddressBook實(shí)例,并將其壓入棧頂。
          23?????????AddressBook?book?=?new?AddressBook();
          24?????????digester.push(book);
          25?????????//?增加規(guī)則
          26?????????addRules(digester);
          27?????????java.io.File?srcfile?=?new?java.io.File("../struts/src/Example.xml");
          28?????????digester.parse(srcfile);
          29?????????book.print();
          30?????}
          31?
          32?????private?static?void?addRules(Digester?digester)?{
          33?????????
          34?????????//當(dāng)遇到<person>時(shí),創(chuàng)建類(lèi)Person的一個(gè)實(shí)例,并將其壓入棧頂
          35?????????//當(dāng)元素被處理結(jié)束時(shí),對(duì)象被彈出。
          36?????????digester.addObjectCreate("address-book/person",?Person.class);
          37?????????
          38?????????//?將<person>標(biāo)簽的屬性(attribute)與棧頂Person類(lèi)對(duì)象的屬性(property)設(shè)置方法根據(jù)各自的名字進(jìn)行映射,
          39?????????//?(例如,將標(biāo)簽屬性id與屬性設(shè)置方法setId進(jìn)行映射,將標(biāo)簽屬性category與屬性設(shè)置方法setCategory進(jìn)行映射),
          40?????????//?然后將屬性的值作參數(shù)傳遞給執(zhí)行相應(yīng)的方法。
          41?
          42?????????//?如果某標(biāo)簽屬性沒(méi)法通過(guò)名字找到相應(yīng)的屬性設(shè)置方法,則此標(biāo)簽屬性被忽略(如example.xml中第一個(gè)<person>的try屬性)。
          43?
          44?????????digester.addSetProperties("address-book/person");
          45?
          46?????????//調(diào)用第二棧頂對(duì)象(AddressBook實(shí)例)的addPerson方法,以棧對(duì)象(Person實(shí)例)的對(duì)象為參數(shù)
          47?????????//配置完畢的Bean插入父對(duì)象。?
          48?????????
          49?????????//彈出棧頂?shù)膶?duì)象,把它傳遞給緊接其下的另一個(gè)對(duì)象的指定名稱(chēng)的方法。
          50?????????//通常用來(lái)把一個(gè)已經(jīng)初始化的Bean插入到父對(duì)象。?
          51?
          52?????????digester.addSetNext("address-book/person",?"addPerson");
          53?
          54?????????//?當(dāng)遇到<person>的子元素<name>時(shí),調(diào)用棧頂對(duì)象(Person實(shí)例)的setName方法。
          55?
          56?????????//?此處addCallMethod方法的第一參數(shù)是規(guī)則,第二個(gè)參數(shù)是方法的名字,
          57?????????//?第三個(gè)是參數(shù)的數(shù)量(為0時(shí),表示只有一個(gè)參數(shù),且參數(shù)的值是元素的內(nèi)容
          58?????????
          59?????????//調(diào)用頂層Bean的指定名稱(chēng)的方法。
          60?????????//被調(diào)用的方法可以有任意多個(gè)參數(shù),參數(shù)的值通過(guò)后繼的CallParamRule給出。?
          61?
          62?????????digester.addCallMethod("address-book/person/name",?"setName",?0);
          63?
          64?????????//?當(dāng)遇到<person>的子元素<email>時(shí),調(diào)用棧頂對(duì)象(Person實(shí)例)的addEmail方法,
          65?????????//?addEmail方法有兩個(gè)參數(shù),取值分別來(lái)自<email>的屬性type的值和<email>本身的內(nèi)容。
          66?
          67?????????//此處addCallParam方法的第一參數(shù)是規(guī)則,第二個(gè)參數(shù)是指明被調(diào)用方法(addEmail)參數(shù)的序號(hào),第三個(gè)是參數(shù)為字符串時(shí)指屬性的名字)
          68?????????//表示方法調(diào)用的參數(shù)。參數(shù)的值取自指定名稱(chēng)的XML元素的屬性,或者是當(dāng)前元素包含的原始字符數(shù)據(jù)。
          69?????????//這個(gè)規(guī)則要求用一個(gè)整數(shù)指定它在參數(shù)列表中的位置。
          70?????????
          71?????????digester.addCallMethod("address-book/person/email",?"addEmail",?2);
          72?????????digester.addCallParam("address-book/person/email",?0,?"type");
          73?????????digester.addCallParam("address-book/person/email",?1);
          74?????????
          75?????}
          76?
          77?????
          78?}
          79?

          ???以上的程序來(lái)源網(wǎng)絡(luò),我真理了一下。
          附件:http://www.aygfsteel.com/Files/windfree/test.rar
          posted on 2006-12-08 16:02 windfree 閱讀(468) 評(píng)論(1)  編輯  收藏 所屬分類(lèi): java

          評(píng)論

          # re: Digester學(xué)習(xí)筆記 2007-01-26 18:40 小竹  回復(fù)  更多評(píng)論   

          blog不錯(cuò)...筆記很詳細(xì)...學(xué)習(xí)ing

          只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 尤溪县| 丰宁| 大港区| 密云县| 中方县| 富锦市| 沭阳县| 普兰店市| 锡林浩特市| 贵德县| 子洲县| 攀枝花市| 永兴县| 和龙市| 宕昌县| 梅州市| 宝坻区| 凤凰县| 刚察县| 淮北市| 谢通门县| 株洲县| 若尔盖县| 无锡市| 南陵县| 丰顺县| 咸宁市| 南部县| 海口市| 宜宾市| 郁南县| 平南县| 新野县| 江西省| 八宿县| 全州县| 遂川县| 兰溪市| 金秀| 万州区| 青浦区|