Digester學習筆記

          程序中用到的文件

          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?????//下面的兩個方法的名字中set以后的部分,與</person>的屬性名字對應?
          12?????//當從xml文件中識別出<person>的屬性時,如果有要求(即調(diào)用過addSetProperties方法),Digester會依據(jù)這種對映關系自動調(diào)用相應的方法。
          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?????//對應name而言,因為其值來自name標簽的內(nèi)容,而非屬性值
          22?????//需要調(diào)用addCallMethod指定識別<name>后調(diào)用此方法,自動調(diào)用,需調(diào)用addBeanPropertySetter()方法
          23?????
          24??????public?void?setName(String?name)?{
          25???????????this.name?=?name;
          26???????}
          27??????//同name,此時還要一一指定addEmail的參數(shù)值的來源。
          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?



          主類:AddressBookDigester.java

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

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

          評論

          # re: Digester學習筆記 2007-01-26 18:40 小竹  回復  更多評論   

          blog不錯...筆記很詳細...學習ing

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 云林县| 长春市| 大庆市| 永仁县| 乐业县| 奉贤区| 景谷| 扎赉特旗| 蓬溪县| 福海县| 乐都县| 兴海县| 平潭县| 东海县| 阿合奇县| 北安市| 珲春市| 呼和浩特市| 仙桃市| 满洲里市| 渭源县| 华蓥市| 玛曲县| 高要市| 饶阳县| 扶风县| 凤凰县| 调兵山市| 桂林市| 龙井市| 忻城县| 金山区| 三台县| 台北县| 阿鲁科尔沁旗| 金秀| 喀什市| 金塔县| 东海县| 德清县| 班戈县|