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

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

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

    月亮的太陽

    小乖的BLOG
    posts - 114, comments - 41, trackbacks - 0, articles - 27
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    挖掘Jakarta Commons中隱藏的寶貝(三)[轉載]

    Posted on 2005-12-27 11:59 月亮的太陽 閱讀(392) 評論(0)  編輯  收藏 所屬分類: 編程
    3. 使用XPath語法來查詢對象和集合
        Commons JXPath是一種讓人很吃驚地(非標準的)對XML標準的使用。XPath一段時間以來一直是作為在一個XSL樣式表中選擇結點或結點集的一種方法。如果你用過XML,你會很熟悉用這樣的語法/foo/bar來從foo文檔元素中選擇bar子元素。

        Jakarta Commons JXPath增加了一種有趣的手法:你可以用JXPath來從bean和集合中選擇對象,其中如servlet上下文和DOM文檔對象。考慮一個包含了Person對象的列表。每一個Person對象有一個屬性的類型為Job,每一個Job對象有一個salary(薪水)屬性,類型為int。Person對象也有一個coountry屬性,它是兩個字符的國家代碼。使用JXPath,你可以很容易地選出所有國家為美國,薪水超過一百萬美元的Person對象。下面是設置一個由JXPath過濾地bean的List的代碼:

    // Person的構造器設置姓和國家代碼
    Person person1 = new Person( "Tim", "US" );
    Person person2 = new Person( "John", "US" );
    Person person3 = new Person( "Al",  "US" );
    Person person4 = new Person( "Tony", "GB" );

    // Job的構造器設工作名稱和薪水
    person1.setJob( new Job( "Developer", 40000 ) );
    person2.setJob( new Job( "Senator", 150000 ) );
    person3.setJob( new Job( "Comedian", 3400302 ) );
    person4.setJob( new Job( "Minister", 2000000 ) );

    Person[] personArr =
      new Person[] { person1, person2,
                     person3, person4 };

    List people = Arrays.asList( personArr );


    people List包含了四個bean: Tim, John, Al, 和George。Tim是一個掙4萬美元的開發者,John是一個掙15萬美元的參議員,Al是一個掙340萬美元的喜劇演員,Tony是一個掙200萬歐元的部長。我們的任務很簡單:遍歷這個List,打印出每一個掙錢超過100百萬美元的美國公民的名字。記住people是一個由Person對象構成的ArrayList,讓我們先看一下沒有利用JXPath便利的解決方案:

    Iterator peopleIter = people.getIterator();
    while( peopleIter.hasNext() ) {
      Person person = (Person) peopleIter.next();

      if( person.getCountry() != null &&
          person.getCountry().equals( "US" ) &&
          person.getJob() != null &&
          person.getJob().getSalary() > 1000000 ) {
            print( person.getFirstName() + " "
                   person.getLastName() );
          }
        }
      }
    }


    上面的例子是繁重的,并有些容易犯錯。為了發現合適的Person對象,你必須首先遍歷每一個Person對象并且檢查conuntry的屬性。如果country屬性不為空并且符合要求,那么你就要檢查job屬性并看一下它是否不為空并且salary屬性的值大于100萬。上面的例子的代碼行數可以被Java 1.5的語法大大減少,但是,哪怕是Java 1.5,你仍舊需要在兩層上作兩次比較。

    如果你想對內存中的一組Person對象也做一些這樣的查詢呢?如果你的應用想顯示所有在英格蘭的名叫Tony的人呢?喔,如果你打印出每一個薪水少于2萬的工作的名稱呢?

    如果你將這些對象存儲到關系數據庫中,你可以用一個SQL查詢來解決問題,但你正在處理的是內存中的對象,你可以不必那么奢侈。雖然XPath主要是用在XML上面,但你可以用它來寫一個針對對象集合的“查詢”,將對象作為元素和,把bean屬性作為子元素。是的,這是一種對XPath奇怪的應用,但請先看一下下面的例子如何在people上,一個由Person對象構成的ArrayList,實現這三種查詢:

    import org.apache.commons.jxpath.JXPathContext;

    public List queryCollection(String xpath,
                                Collection col) {
        List results = new ArrayList();

        JXPathContext context =
            JXPathContext.newContext( col );

        Iterator matching =
            context.iterate( xpath );

        while( matching.hasNext() ) {
            results.add( matching.getNext() );
        }
        return results;
    }

    String query1 =
       ".[@country = 'US']/job[@salary > 1000000]/..";  
    String query2 =
       ".[@country = 'GB' and @name = 'Tony']";  
    String query3 =
       "./job/name";

    List richUsPeople =
        queryCollection( query1, people );
    List britishTony =
        queryCollection( query2, people );
    List jobNames =
        queryCollection( query3, people );



    queryCollection()方法使用了一個XPath表達式,將它應用到一個集合上。XPath表達式被JXPathContext求值, JXPathContext由JXPathContext.newContext()調用創建,并將它傳入要執行查詢的集合中。凋用context.iterate()來在集合中的每一個元素上應用XPath表達式,返回包含所有符合條件的“節點”(這里是“對象”)的Iterator。上例中執行的第一個查詢,query1,執行了和不使用JXPath的例子相同的查詢。query2選擇所有國家為GB并且名字屬性為Tony的Person對象,query3返回了一個String對象的List,包含了所有Job對象的name屬性。

    當我第一次看到Commons JXPath, 它是一個壞思想的想法觸動了我。為什么要把XPath表達式應用到對象上?有點感覺不對。把XPath作為一個bean的集合的查詢語言的這種意想不到的用法,在過去幾年中已經好多次給我帶來了便利。如果你發現你在list中循環來查找符合條件的元素,請考慮一下JXPath。更多的信息,請參考Jakarta Commons Cookbook的第12章,“查找和過濾”,它討論了Commons JXPath和與Commons Digester配對的Jakarta Lucene。

    還有更多
    對Jakarta Commons縱深地探索仍然在調試中。在這一系列的下面幾部分中,我會介紹一些相關的工具和功能。在Commons Collections中設置操作,在collection中使用Predicate對象,使用Commons Configuration來配置一個應用和使用Commons Betwixt來讀寫XML。能從Jakarta Commons得到的東西還有很多,不能在幾千字中表達,所以我建議你看一下Jakarta Commons Cookbook。許多功能可能會,一眼看上去,有點普通,但Jakarta Commons的能量就蘊藏在這些工具的相互組合和與你的系統的集成當中。

    Timothy M. O'Brien是一個專業的獨立的開發者,在Chicago地區工作和生活。

    資源
    ·onjava.com:
    onjava.com
    ·Matrix-Java開發者社區:http://www.matrix.org.cn/
    ·APACHE:APACHE.org

    Tracker:http://m.tkk7.com/flyingis/archive/2005/11/09/18959.html

    主站蜘蛛池模板: 欧洲亚洲综合一区二区三区 | 国产精品亚洲一区二区三区久久 | 亚洲免费观看视频| 一个人看的免费视频www在线高清动漫 | 亚洲一级毛片在线观| 精品无码AV无码免费专区| 久久国产亚洲电影天堂| 999任你躁在线精品免费不卡| 亚洲色欲或者高潮影院| 国国内清清草原免费视频99| 在线a亚洲老鸭窝天堂av高清| 免费看美女被靠到爽| 香港经典a毛片免费观看看| 亚洲男人第一无码aⅴ网站| 国产成人精品免费大全| 国产亚洲福利精品一区| 久久久久久毛片免费播放| 亚洲一区精品视频在线| 国产精品免费看香蕉| 岛国精品一区免费视频在线观看| 亚洲成A∨人片在线观看不卡| 日韩人妻一区二区三区免费| 麻豆狠色伊人亚洲综合网站| 四虎影库久免费视频| 精品国产污污免费网站入口| 亚洲国产精品国自产电影| 免费H网站在线观看的| 国产亚洲午夜精品| 亚洲AV无码久久| 无码一区二区三区AV免费| 麻豆安全免费网址入口| 亚洲成AV人片一区二区密柚| 日韩精品无码区免费专区| 黄色片网站在线免费观看| 亚洲国产精品久久久久| 在线播放免费人成视频在线观看| caoporn成人免费公开| 亚洲午夜国产精品| 亚洲日韩国产一区二区三区| 99re6热视频精品免费观看| 久久久久久久久无码精品亚洲日韩|