通過閱讀本文,您將瞭解面向服務的架構(Service-Oriented Architecture,SOA)、XML 和 XMLBeans 如何在解決實際商業問題中發揮重要作用及其原因,文中將以娛樂業為例進行案例分析。本文的目的並不在於介紹代碼,而是讓您瞭解在需要使用 XML 時如何使用 XMLBeans 及其原因。
面對日益升級的軟體複雜度,企業架構師的注意力逐漸集中到了一種能夠解決系統整合問題的方法 —— 物件導向的架構(SOA)。從本質上來說,SOA 就是要通過增強業務與資訊技術(IT)的運作關係來提高企業效益。
SOA 將請求/應答設計範例應用於同步和非同步應用程式中。在這種方法中,商務應用程式的邏輯和功能以服務的形式體現。應用程式開發人員或系統整合人員可以通過組合一項或多項服務來構建應用程式,而不必知道服務的底層實現方法。通過這種方式可以實際地整合所有 IT 資源,包括孤立的資料和以前不相容的遺留系統。
在 SOA 範例中,提供者與消費者通過訊息進行通訊。訊息傳遞介面必須與平台和語言無關。因此,通常使用符合 XML 模式的 XML 文檔來構造訊息。當然,也常常以 XML 格式儲存應用程式資料。
XML 提供了基本文法,您可以使用基本文法在各種電腦、各種應用程式和各種組織之間共用資訊,而無需經過多層轉換。XML 之所以重要,是因為它為構建整合基礎設施提供了通用的標準化平台,從而為企業應用程式整合工作提供支援。
為什麼使用 XMLBeans?
使用 XMLBeans 可以將 Java™ 程式設計語言與 XML 結合使用。Java 程式設計語言是一種物件導向的語言,它基於開放的、公開的標準,可移植、健壯而且可靠。由於具備這些特點,Java 程式設計語言已被廣泛接受並在包括娛樂業在內的許多行業中得到了實現。然而,XML 與 Java 程式設計語言不相容。而 XMLBeans 就是掃清這一障礙的最佳選擇。
XMLBeans 用於 XML 資料繫結。使用 XMLBeans,Java 應用程式就可以充分利用 XML 的優勢。XMLBeans 使用 XML Schema 來編譯用於訪問和修改 XML 執行個體資料的 Java 介面和類。使用此項技術,您可以將 XML Schema 編譯到一組 Java 類中使其具有以下功能:
遇到任何 Schema 時都使用 XMLBeans
根據需要在任意層級訪問 XML 資料
XMLBeans 提供了以下應用程式介面(API)用於資料繫結:
XmlObject:如果 Java 類是通過 XML Schema 產生的,則這些 Java 類都是派生自 XmlObject API。
XmlCursor:XmlCursor API 提供了對 XML Infoset 的低層訪問權,它表示 XML 執行個體中的游標位置。
SchemaType:用於底層元資訊的 XML Schema 物件模型。
XMLBeans 編譯器將產生 XML 模式的對象表示。這個對象表示是一組表示模式的結構和約束的通用 Java 類和介面。在產生 Java 類和介面後,符合該模式的 XML 執行個體文檔就會與之綁定。綁定過程包括以物件導向的方式使用 XMLBeans API 來訪問實際 XML 執行個體文檔中的資料。
如果使用功能強大的 XMLBeans,則無需為使用 XML 而編寫所有代碼。您可以輕鬆地在應用程式中使用 XML。如果不使用 XMLBeans,您就必須編寫代碼來利用模式的每一部分。試想:用 XMLBeans 為模式產生類,假定有若干個一對一、一對多和多對多關係需要管理,使用 XMLBeans 可以輕而易舉地完成這一任務:
安裝 XMLBeans。
編譯模式來產生 Java Archive(JAR)檔案。
編寫代碼將 XML 執行個體綁定到表示模式的 Java 類型上。清單 1 提供了一個簡單的例子:
清單 1. XMLBeans 簡單易用
File xmlEntertainFile = new File("c:\entertain.xml");
// Bind the instance to the XMLBeans types that were generated.
EntertainDocument entDoc =
EntertainDocument.Factory.parse(xmlEntertainFile);
// Get and then print pieces of the XML instance.
Entertain ent = entDoc.getEntertain();
Entertain[] entArray = ent.getEntertainArray();
for (int i = 0; i < entArray.length; i++)
{
System.out.println(entArray[i]);
}