<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    kapok

    垃圾桶,嘿嘿,我藏的這么深你們還能找到啊,真牛!

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      455 隨筆 :: 0 文章 :: 76 評論 :: 0 Trackbacks

    Digester學習筆記(二)

    http://www.infomall.cn/cgi-bin/mallgate/20040310/http://hedong.3322.org/archives/000336.html

      為便于理解,將筆記的內容結構作了一些調整。

    對象棧

      對digester技術最普通的應用,是用來動態創建一個由Java對象構成的樹結構,各對象的屬性以及對象間的關系,基于XML文檔的內容來設置(XML文檔就是一棵樹)。為實現這種應用,Digester提供了一個對象棧,以供在相關的模板識別后被激活的處理規則操作。此棧的基本操作包括:
    1. clear(),清空棧的內容
    2. peek(),返回對棧頂對象的引用
    3. pop(),將棧頂對象彈出并返回
    4. push(),將一個新的對象壓入棧頂

      用棧的原因,就是當識別出一個XML元素的“開始”時,將相關對象生成并壓入棧頂,這個對象在處理該元素的子元素的過程中一直在棧中,當所有子元素都處理完后,解析器遇到這個元素的“結束”時,則彈出此對象,并進行相關的處理。
      如何描述對象間的關系呢?將棧頂的對象做為一個參數,傳遞給第二棧頂(即先于棧頂對象入棧的那個對象,在棧頂對象的下面)的一個方法,就可以簡單地建立起一種“父子關系”,從而可以簡單地建立起1:1的關系(第二棧頂對象與棧頂對象之間)和1:N的關系(第二棧頂對象不動,N次壓棧頂彈棧頂對象).
      如果取得生成的第一個對象呢?可以讓parse()方法返回,或者在調用parse()方法前,先行壓入一個對象,在parse()方法結束后彈出這個對象,則其子對象即為我們想要的第一個對象。

    日志(logging)


      日志是一個調試Digester規則集的非常重要的工具,它可以記錄非常豐富的信息,因它在使用Digester之前有必要了解日志是如何工作的。
      Digester使用Jakarta Commons Logging,這個模塊并不是具體的日志實現,而只是一個可設置的接口。可以設置它將各種日志信息傳遞它自身帶的基本記錄器,或者傳遞給其它的更復雜的日志工具。具體請參考commons logging的文檔,或Jakarta Commons Logging學習筆記
      Digester主要使用兩個記錄器:
    1. SAX相關的信息,被送往org.apache.commons.digester.Digester.sax記錄器,記錄了Digester收到的SAX的事件的信息。
    2. 其它的所有信息,都被送往org.apache.commons.digester.Digester記錄器,這個記錄器在調試Digester時打開而在產品中常將其關閉

      假定用commons logging自帶的基本日志工具,并以DEBUG級別記錄Digester調試信息以及INFO級別記錄SAX事件信息,則對logging的配置文件設置如下:
    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

    Digester包中的例子

    ***********Example.xml**********
    <address-book>
      <person id="1" category="acquaintance" try="would be ignored">
        <name>Gonzo</name>
        <email type="business">gonzo@muppets.com</email>
        <gender result="the whole tag would be ignored">male</gender>
      </person>
      <person id="2" category="rolemodel">
        <name>Kermit</name>
        <email type="business">kermit@muppets.com</email>
        <email type="home">kermie@acme.com</email>
      </person>
    </address-book>**********Person.java************
    import java.util.HashMap;
    import java.util.Iterator;
    public class Person {
      private int id;
      private String category;
      private String name;
      private HashMap emails = new HashMap();
      //下面的兩個方法的名字中set以后的部分,與<person>的屬性名字對映。當從xml文件中識別出<person>的屬性時,如果有要求(即調用過addSetProperties方法),Digester會依據這種對映關系自動調用相應的方法。
      public void setId(int id) {
          this.id = id;
      }
      public void setCategory(String category) {
          this.category = category;
      }
      //對name而言,因為其值來自<name>標簽的內容而非屬性值,需要用addCallMethod指定識別<name>后的要調用此方法(想自動調用也要可以,需要addBeanPropertySetter,參見第下一個例子)。
      public void setName(String name) {
          this.name = name;
      }
      //同name,此時還要一一指定addEmail的參數值的來源。
      public void addEmail(String type, String address) {
          emails.put(type, address);
      }
      public void print() {
          System.out.println("Person #" + id);
          System.out.println("  category=" + category);
          System.out.println("  name=" + name);
          for(Iterator i = emails.keySet().iterator(); i.hasNext(); ) {
              String type = (String) i.next();
              String address = (String) emails.get(type);
              System.out.println("  email (type " + type + ") : " + address);
          }
      }
    }
    **********AddressBook.java***********
    import java.util.LinkedList;
    import java.util.Iterator;
    public class AddressBook {
        LinkedList people = new LinkedList();
        public void addPerson(Person p) {
            people.addLast(p);
        }
        public void print() {
            System.out.println("Address book has " + people.size() + " entries");

            for(Iterator i = people.iterator(); i.hasNext(); ) {
                Person p = (Person) i.next();
                p.print();
            }
        }
    }
    ************AddressBookDigester*********
    import org.apache.commons.digester.Digester;
    /**
     * Usage: java Example1 example.xml
     */
    public class AddressBookDigester {
        public static void main(String[] args) {
            if (args.length != 1) {
                usage();
                System.exit(-1);
            }
            String filename = args[0];
            // 創建一個Digester實例
            Digester d = new Digester();
            // 創建AddressBook實例,并將其壓入棧頂。
            AddressBook book = new AddressBook();
            d.push(book);
            // 增加規則
            addRules(d);
            // 處理輸入的xml文件
            try {
                java.io.File srcfile = new java.io.File(filename);
                d.parse(srcfile);
            }
            catch(java.io.IOException ioe) {
                System.out.println("Error reading input file:" + ioe.getMessage());
                System.exit(-1);
            }
            catch(org.xml.sax.SAXException se) {
                System.out.println("Error parsing input file:" + se.getMessage());
                System.exit(-1);
            }
            
            
            // 將解析出的地址數據打印出來
            book.print();
        }
        
        private static void addRules(Digester d) {
            // 當遇到<person>時,創建類Person的一個實例,并將其壓入棧頂
            d.addObjectCreate("address-book/person", Person.class);
            
            // 將<person>標簽的屬性(attribute)與棧頂Person類對象的屬性(property)設置方法根據各自的名字進行映射,(例如,將標簽屬性id與屬性設置方法setId進行映射,將標簽屬性category與屬性設置方法setCategory進行映射),然后將屬性的值作參數傳遞給執行相應的方法。
            // 如果某標簽屬性沒法通過名字找到相應的屬性設置方法,則此標簽屬性被忽略(如example.xml中第一個<person>的try屬性)。
            d.addSetProperties("address-book/person");

            // 調用第二棧頂對象(AddressBook實例)的addPerson方法,以棧對象(Person實例)的對象為參數
            d.addSetNext("address-book/person", "addPerson");        
            
            // 當遇到<person>的子元素<name>時,調用棧頂對象(Person實例)的setName方法。
            // 此處addCallMethod方法的第一參數是規則,第二個參數是方法的名字,第三個是參數的數量(為0時,表示只有一個參數,且參數的值是元素的內容)
            d.addCallMethod("address-book/person/name", "setName", 0);
            
            // 當遇到<person>的子元素<email>時,調用棧頂對象(Person實例)的addEmail方法,addEmail方法有兩個參數,取值分別來自<email>的屬性type的值和<email>本身的內容。
            // 此處addCallParam方法的第一參數是規則,第二個參數是指明被調用方法(addEmail)參數的序號,第三個是參數為字符串時指屬性的名字)
            d.addCallMethod("address-book/person/email", "addEmail", 2);
            d.addCallParam("address-book/person/email", 0, "type");
            d.addCallParam("address-book/person/email", 1);
        }

        private static void usage() {
            System.out.println("Usage: java Example1 example.xml");
        }
    }

    運行結果如下(運行時可能需要xml-crimson,一個源sun的XML解析器,可到http://xml.apache.org/crimson/下載)
    Address book has 2 entries
    Person #1
      category=acquaintance
      name=Gonzo
      email (type business) : gonzo@muppets.com
    Person #2
      category=rolemodel
      name=Kermit
      email (type business) : kermit@muppets.com
      email (type home) : kermie@acme.com

    Posted by Hilton at October 26, 2003 11:46 PM | TrackBack
    posted on 2005-04-15 09:28 笨笨 閱讀(582) 評論(0)  編輯  收藏 所屬分類: J2EEALLJ2SEStruts
    主站蜘蛛池模板: 亚洲人AV在线无码影院观看| 亚洲国产日产无码精品| 国产精品亚洲综合| 亚洲欧美成人一区二区三区| 国产四虎免费精品视频| 亚洲一级毛片在线播放| 无人在线直播免费观看| 一本色道久久综合亚洲精品| 亚洲一区二区三区精品视频| 97性无码区免费| 亚洲中文字幕久久无码| 久操视频在线免费观看| 亚洲人成在线播放网站岛国| 色天使亚洲综合一区二区| 无码专区AAAAAA免费视频| 97se亚洲综合在线| 九九99热免费最新版| 在线精品免费视频| 色偷偷噜噜噜亚洲男人| 亚洲成A人片在线观看无码3D | 亚洲AV日韩综合一区尤物| 最新亚洲成av人免费看| 永久免费无码网站在线观看| 亚洲精品午夜视频| 成年男女男精品免费视频网站 | 亚洲AV本道一区二区三区四区 | 成人电影在线免费观看| 亚洲日本国产精华液| 免费看无码自慰一区二区| 一级一看免费完整版毛片| 日本亚洲成高清一区二区三区| 精品在线免费视频| 精品国产_亚洲人成在线高清| 3344永久在线观看视频免费首页| 亚洲乱码中文字幕综合| 亚洲视频免费播放| 污污免费在线观看| 亚洲av高清在线观看一区二区| 亚洲AV无码一区二区乱子仑| 亚洲小说区图片区另类春色| 免费a级毛片高清视频不卡|