在這個由四部分組成的系列文章的第一部分,我們將弄清什么是數據綁定,與在 java 應用程序中處理 xml 數據的其它方法相比它有什么優勢,以及如何開始使用它。這一部分將考查為什么使用數據綁定,以及如何為各種約束建立模型,使 XML 文檔能轉換成 Java 對象。同時還涵蓋用于生成數據綁定類的輸入和輸出。
您希望在您的 Java 應用程序中使用 XML 嗎?那么好,同成千上萬的其他人一起上這條船吧。當您深入了解 XML 以后,也許您會發現 DOM 和 SAX API(請參閱參考資料)不過是唬人的東西。您可能認為肯定存在某種簡單方法可以取得 XML 文檔,并通過 Java 應用程序訪問它,對嗎?不必通過回調或復雜的樹狀結構,而是使用像 setOwner(Stringowner) 和 int getNumOrders() 這樣的方法,對嗎?假如您曾經沿著這一思路考慮問題,那么數據綁定就是您要尋找的解決方案。
分析各種選擇
當今各種 XML 和 XML 主義正泛濫成災(XSL、RDF、命名空間、rss、XML Schema、XSLT...),您可能認為現在會有很多方法去訪問 Java 應用程序中的 XML 數據。令人驚奇的是,假如您尋根究底,實際只存在三種訪問 XML 數據的方法。沒錯 -- 只有三種方法,其中的一種還是最近隨一種新的 Java API 才出現的。
應該這樣來看待這一問題:選擇范圍小使您更易于選出適合于您的方法。
回調
回調是作為一種事件驅動模型工作的。當分析 XML 文檔時,某些事件 -- 如文檔的起始和某個元素中的字符數據的起始 -- 將觸發回調方法。通過使用執行邏輯所需的數據,您可以實現這些事件的 Java 代碼。要弄清這種方法不能全靠直覺;開發人員通常要花費一段時間來理解和把握回調模型的使用。SAX,用于 XML 的一種簡單 API,是這種 XML 使用方法的事實上的標準。
樹
更常見、更流行的是這種 API,它們取得一個 XML 文檔,然后創建數據的樹狀結構。XML 文檔成為樹首,充當一種容器。它有若干子級,如根元素。根元素又有其附加的子級,依此類推,直到(在某種意義上)獲得 XML 數據的一幅圖為止。因為幾乎每個大學生在某個階段肯定都處理過樹狀結構,所以這就可用作表示 XML 數據的一種非常直觀的方法。
用于 XML 文檔樹狀表示的最流行的 API 就是 W3C 的推薦標準,即文檔對象模型 (DOM)。一種更新的 API,JDOM (這不是首字母縮寫詞)最近也正一直在推廣并流行開來。(雖然這個方案是我和 Jason Hunter 建立的,但我還得說實話。)另外,DOM 和 JDOM 都是 Spinnaker 方案設計的基本要求,Spinnaker 是一種新的 XML 分析器,它作為 Apache XML 方案的一部分正在開發之中。
雖然樹狀 API 看起來比事件驅動的 SAX 更易于使用,但它們并不總是合適的。非常大的文檔可能需要大量的內存(尤其是使用 DOM 時);當對樹結構執行轉換 (XSLT) 時,系統可能停止運轉甚至徹底崩潰。雖然更新的 API(如 JDOM)能處理這些問題,但假如您必須處理極大量的數據,它們仍將是一個問題。并且,有時開發人員寧愿將 XML 文檔中的數據建模為一個簡單的帶有值的讀寫方法的 Java 對象,而不用樹狀模型工作。例如,開發人員會寧愿不去訪問名為 skuNumber 的子節點并設置該節點的文本值,而只想調用 setSkuNumber("mySKU") 并繼續進行。
術語解釋
數據綁定:從 Java 應用程序內部訪問 XML 數據的一種新方法,使用仍在開發中的一種 API,JSR-031。
JSR-031: Sun 仍在開發中的一種新的 Java 規范請求,設計用于將 XML 文檔編譯成一個或多個 Java 類,而在 Java 應用程序中可以方便地使用這些 Java 類。
打包:將 Java 對象轉換為 XML 表示,擁有當前值。
解包:根據 XML 對象創建 Java 對象,通常是根據打包生成一個 Java 對象。
用 Java 代碼訪問 XML 數據的最新方法要依靠于一套新的 Java 方法和相關的 API,這些 API 仍在開發之中。數據綁定是由 Sun 構建的一種“Java 規范要求”(JSR-031,見參考資料),它設計用于使 Java 對象綁定到 XML 文檔更加方便,這樣就使一種格式能夠輕易地轉換為另一種格式,反之亦然。綁定引用一個具有讀寫方法的 Java 對象,讀寫方法都會影響到底層的 XML 文檔,并且也都直接映射為 XML 文檔中的元素及特征的名稱。當您進入到本系列文章下一部分中的某些細節時,這一說明會更有意義,但在目前,只說一點就夠了:這樣做使 XML 文檔特征 name 能夠通過一個稱為 setName() 的方法,來更改它的值,就像我上面暗示的那樣。
數據綁定
這種訪問方式正在得到普及,并且當在 XML 文檔中存儲配置信息時非凡有用。許多開發人員發現,它非常便于直接訪問所需的參數,而無須使用更復雜的樹狀結構。雖然這種訪問對于文檔轉換或消息傳送沒有什么用處,但它對于簡單數據處理是極其方便的。它是我們在本文及本系列文章中關注的第三種使用 XML 的方法。
(當然,任何方法隨后都會引出一系列新的術語,所以請查看術語解釋以了解這些新的行話。)
是否任何 XML 文檔都可以轉換為 Java 對象?還是僅有某些類型的 XML 文檔才可以?問得好!您很可能只希望將滿足一組約束條件的文檔轉換為 Java 對象。這與定義 Java 接口的方法類似:您確保只實例化和使用適應該接口的對象,答應就如何操作該對象作出假定。同樣,您只答應將滿足一組約束條件的 XML 對象轉換成 Java 對象;這使您能夠按希望的方式來使用所創建的對象。 約束數據
在研究代碼之前,您需要回答幾個有關如何表示 XML 數據的問題。這是數據綁定的最具挑戰性的方面之一。