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>的屬性時,如果有要求(即調用過addSetProperties方法),Digester會依據這種對映關系自動調用相應的方法。
          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標簽的內容,而非屬性值
          22?????//需要調用addCallMethod指定識別<name>后調用此方法,自動調用,需調用addBeanPropertySetter()方法
          23?????
          24??????public?void?setName(String?name)?{
          25???????????this.name?=?name;
          26???????}
          27??????//同name,此時還要一一指定addEmail的參數值的來源。
          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技術最普通的應用,就是用來動態創建一個由java對象構成的樹結構,各對象的屬性以及對象間的關系。
          ?6??????*????是基于xml文檔的內容來設置的。為實現這種應用,Digester提供了一個對象棧
          ?7??????*????clear(),清空棧的內容;peek(),返回對棧頂對象的引用;pop(),將棧頂對象彈出并返回;push(),將一個新的對象壓入棧頂。
          ?8??????*??用棧的原因:
          ?9??????*??????????當識別一個xml元素的開始,創建對象并壓人棧頂。這個對象在處理該元素的子元素過程中一直在棧中,
          10??????*??????????當所有子元素處理完后,解析器遇到該元素的結束標記,彈出此對象,并進行相應的處理。
          11??????*?描述對象間的關系:
          12??????*?????????????將棧頂對象作為一個參數,傳遞給該對象的下面的對象的一個方法,就可以簡單的建立父子關系。
          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?????????//?創建一個Digester實例
          20?????????//當遇到匹配元素的開始標記和結束標記時,begin()方法和end()方法將分別被調用。?
          21?????????Digester?digester=?new?Digester();
          22?????????//?創建AddressBook實例,并將其壓入棧頂。
          23?????????AddressBook?book?=?new?AddressBook();
          24?????????digester.push(book);
          25?????????//?增加規則
          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>時,創建類Person的一個實例,并將其壓入棧頂
          35?????????//當元素被處理結束時,對象被彈出。
          36?????????digester.addObjectCreate("address-book/person",?Person.class);
          37?????????
          38?????????//?將<person>標簽的屬性(attribute)與棧頂Person類對象的屬性(property)設置方法根據各自的名字進行映射,
          39?????????//?(例如,將標簽屬性id與屬性設置方法setId進行映射,將標簽屬性category與屬性設置方法setCategory進行映射),
          40?????????//?然后將屬性的值作參數傳遞給執行相應的方法。
          41?
          42?????????//?如果某標簽屬性沒法通過名字找到相應的屬性設置方法,則此標簽屬性被忽略(如example.xml中第一個<person>的try屬性)。
          43?
          44?????????digester.addSetProperties("address-book/person");
          45?
          46?????????//調用第二棧頂對象(AddressBook實例)的addPerson方法,以棧對象(Person實例)的對象為參數
          47?????????//配置完畢的Bean插入父對象。?
          48?????????
          49?????????//彈出棧頂的對象,把它傳遞給緊接其下的另一個對象的指定名稱的方法。
          50?????????//通常用來把一個已經初始化的Bean插入到父對象。?
          51?
          52?????????digester.addSetNext("address-book/person",?"addPerson");
          53?
          54?????????//?當遇到<person>的子元素<name>時,調用棧頂對象(Person實例)的setName方法。
          55?
          56?????????//?此處addCallMethod方法的第一參數是規則,第二個參數是方法的名字,
          57?????????//?第三個是參數的數量(為0時,表示只有一個參數,且參數的值是元素的內容
          58?????????
          59?????????//調用頂層Bean的指定名稱的方法。
          60?????????//被調用的方法可以有任意多個參數,參數的值通過后繼的CallParamRule給出。?
          61?
          62?????????digester.addCallMethod("address-book/person/name",?"setName",?0);
          63?
          64?????????//?當遇到<person>的子元素<email>時,調用棧頂對象(Person實例)的addEmail方法,
          65?????????//?addEmail方法有兩個參數,取值分別來自<email>的屬性type的值和<email>本身的內容。
          66?
          67?????????//此處addCallParam方法的第一參數是規則,第二個參數是指明被調用方法(addEmail)參數的序號,第三個是參數為字符串時指屬性的名字)
          68?????????//表示方法調用的參數。參數的值取自指定名稱的XML元素的屬性,或者是當前元素包含的原始字符數據。
          69?????????//這個規則要求用一個整數指定它在參數列表中的位置。
          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?

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

          評論

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

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

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


          網站導航:
           
          主站蜘蛛池模板: 富源县| 北票市| 宿迁市| 高青县| 且末县| 新闻| 长汀县| 永善县| 息烽县| 清丰县| 金溪县| 万安县| 木兰县| 泽州县| 天峻县| 南昌市| 交城县| 图片| 宁阳县| 娄烦县| 沛县| 密云县| 伊金霍洛旗| 金乡县| 论坛| 曲阜市| 扶绥县| 奎屯市| 清河县| 诸城市| 修武县| 增城市| 台南市| 特克斯县| 玉田县| 越西县| 德清县| 蛟河市| 卢龙县| 大悟县| 偃师市|