DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> XML學習教程 >> XML詳解 >> 實現 Castor 數據綁定,第 1 部分: 安裝和設置 Castor
實現 Castor 數據綁定,第 1 部分: 安裝和設置 Castor
編輯:XML詳解     

本文示例源代碼或素材下載

  數據綁定風靡一時

  在 XML 新聞組、郵件列表和網站的討論論壇中(在 參考資料 中可以找到這些內容的鏈接),最常見的一個主題就是數據綁定。Java 和 XML 開發人員正在尋求一種在 Java 對象與 XML 文檔之間來回轉換的簡單方法。

  Sun 借助其 JAXB,即 Java Architecture for XML Binding(如果您在其他地方看到縮寫詞 JAXB,那也是正常的;Sun 似乎每年都會更改 JAXB 所代表的含義), 在數據綁定領域占據了主導地位。然而,JAXB API(如果您喜歡,也可以稱為架構)存在著一些不足,並且更新速度較慢。它也不能處理到關系數據庫的映射,而這種映射是一種很常見的請求。

  Castor 的誕生

  正是在這種情形下,Castor 出現了。Castor 是一種開源框架,它可用於無法使用 JAXB 的領域。Castor 一直在發展之中,並且早於 JAXB 代碼庫和 SUN 數據綁定規范。實際上,Castor 已經實現了更新,可結合 JAXB 方法實現數據綁定,因此使用 JAXB 的編程人員可以很容易地移動代碼。

  Castor 的優勢

  在討論安裝和使用 Castor 的細節之前,有必要指出嘗試 Castor 以及從 JAXB 轉變到 Castor 的理由。

  首先,Castor 幾乎是 JAXB 的替代品。換句話說,可以輕易地將所有 JAXB 代碼轉變為 Castor(並不是完全取代,但是足以使剛剛接觸 Castor 的程序員輕松完成任務)。

  其次,Castor 在數據綁定領域提供了許多的功能,無需使用模式便可在 Java 和 XML 之間進行轉換,提供一種比 JAXB 更易於使用的綁定模式,以及能夠對關系數據庫和 XML 文檔進行編組(marshal)和解組(unmarshal)。

  Castor 還提供了 JDO 功能。JDO 也就是 Java Data Objects,是驅動 Java-to-RDBMS 編組和解組的底層技術。盡管不再像前幾年那麼流行,JDO 仍然是一個不錯的功能。此外,由於 JDO 也是一種 Sun 規范,因此不用編寫模糊的 API。

下載 Castor

  Castor 的安裝過程很簡單。首先,訪問 Castor Web 站點(參見 參考資料 中的鏈接)並在左側菜單中單擊 Download。選擇 latest milestone release,然後向下滾動到 Download sets。您可以下載 Castor JAR、DTD、doc、dependency 等所有內容,預打包的下載套件非常容易使用(參見圖 1)。

  圖 1. Castor Web 站點的下載套件

  實現 Castor 數據綁定,第 1 部分: 安裝和設置 Castor

  在本文中,我們將使用版本 1.1.2.1。我選擇 ZIP 格式的 The Castor JARs, docs, DTDs, command line tools, and examples 下載套件。您將獲得一個可以展開的歸檔文件,其中包含許多 JAR 文件、文檔和示例程序(參見圖 2)。

  圖 2. 展開的 Castor 歸檔文件

  實現 Castor 數據綁定,第 1 部分: 安裝和設置 Castor

  正確放置所有文件

  接下來,需要將 Castor 的所有文件安放在系統中的正確位置,使您的 Java 環境能夠訪問它們。

  將 Java 庫放在同一個位置

  我強烈建議將所有第三方 Java 庫放在一個常見位置。您可以將它們隨意散放在系統中,但是這樣做會帶來嚴重後果,因為如下原因:

  在大多數情況下很難找到需要的東西。

  您將會花大量時間來確定使用的庫版本,因為您會經常將多個版本放在系統的不同位置。

  類路徑將會變得很長而且難於理解。

  我將我的所有庫放在 /usr/local/java/ 中,每個庫放在自己的子目錄中(各個目錄通常帶有一個版本號)。因此將 Castor 歸檔文件 — 經過擴展 — 移動到您常用的庫位置。在本例中,Castor 的完整路徑為:/usr/local/Java/castor-1.1.2.1。

為 Castor JavaDoc 添加書簽

  在系統中設置 Java 庫的另一個步驟是定位和鏈接到文檔。您會經常這樣做,而且大多數 Java 庫都提供文檔的本地副本(包括 JavaDoc),使用 Html 格式。在 Castor 中,這個路徑是 castor-1.1.2.1/doc/。因此在我的系統中,我為 /usr/local/Java/castor-1.1.2.1/doc/index.Html 添加了一個書簽。圖 3 顯示了本地載入的 Castor 文檔外觀,版本為 1.1.2.1。

  圖 3. 本地載入的 Castor 文檔

  實現 Castor 數據綁定,第 1 部分: 安裝和設置 Castor

  在本文中以及在您日常編程中都需要執行這些操作,原因有二:

  文檔是本地的。 在飛機上編寫過程序嗎?是不是沒有網絡鏈接?不能登錄到 Starbucks WiFi 吧?本地文檔除了能夠更快速地訪問之外,在這些情形中也發揮著重要作用。

  本地文檔總是適合您自己的需要。隨著 Castor 的不斷發展,您也許不會經常下載最新的發行版。使用在線文檔就意味著使用最新版本的文檔,這可能與您系統中的版本不匹配。當使用本地文檔時,使用的文檔總是和當前使用的庫版本對應。因此,不會由於使用不恰當或者庫版本中根本不存在的特性而引起混亂和挫折。

  下載 Castor 依賴項

  Castor 有許多 依賴項:

  apache Ant

  Jakarta Commons

  JDBC 2.0 Standard Extensions

  Log4J 登錄實用程序

  apache Xerces XML 解析程序

  這實際上是適用於大多數 Castor 操作的一個精簡的集合。如果想從頭構建 Castor、運行這些示例、使用這些測試,或者更深入地研究 Castor,還需要更多的依賴項。必須將這些依賴項放到類路徑中,才能使用 Castor。


 

復雜的方法

  要運行 Castor,比較麻煩的方法就是,首先訪問 Castor 的下載頁面並記下所需的每個依賴項的版本。然後跳轉到每個依賴項的 Web 站點,找到該版本,下載並將其添加到類路徑中。這種方法會花費較長的 時間,但是更加易於控制。此外,如果您已經設置好並能正常運行大多數庫,這仍然是一個可行的方法。

  簡單的方法

  幸運的是,還有一種更好的方法。回到 Castor 的下載頁面,找到穩定版本,並定位到另一個下載套件,這個下載套件叫做 Full SVN snapshot: All sources, docs, and 3rd party librarIEs (big)。盡管標記為 “big”,但只有 10 MB(對於用 DSL 或者電纜上網的用戶來說,這根本不算什麼)。下載這個文件,並展開(如圖 4 所示)。

  圖 4. Full SVN 截圖(已展開)

  實現 Castor 數據綁定,第 1 部分: 安裝和設置 Castor

  現在可以進入 lib/ 目錄了,其中包含大量的 JAR 文件。這些正是 Castor 所需的庫。

  存放更多庫的位置

  創建一個新目錄 — 在最初的 Castor 安裝目錄中或者與之同級的目錄 — 然後將剛才下載的所有 JAR 文件移動到這個目錄中。例如:

[bmclaugh:~] cd /usr/local/Java
[bmclaugh:/usr/local/Java] ls
castor-1.1.2.1 xalan-j_2_7_0
[bmclaugh:/usr/local/Java] cd castor-1.1.2.1/
[bmclaugh:/usr/local/Java/castor-1.1.2.1] ls
CHANGELOG            castor-1.1.2.1.jar
castor-1.1.2.1-anttasks.jar   doc
castor-1.1.2.1-codegen.jar   jdbc-se2.0.jar
castor-1.1.2.1-ddlgen.jar    jta1.0.1.jar
castor-1.1.2.1-jdo.jar     schema
castor-1.1.2.1-XML.jar
[bmclaugh:/usr/local/Java/castor-1.1.2.1] mkdir lib
[bmclaugh:/usr/local/Java/castor-1.1.2.1] cd lib
[bmclaugh:/usr/local/Java/castor-1.1.2.1/lib] cp ~/downloads/castor-1.1.2.1/lib/*.jar .
[bmclaugh:/usr/local/Java/castor-1.1.2.1/lib]


 

此處,我在 Castor 文件夾中創建了一個 lib/ 目錄,將所有的 JAR 文件移到其中,供 Castor 使用。

  設置類路徑

  現在需要設置類路徑中的所有東西。我在 Mac OS X 配置中使用一個 .profile 文件處理所有這些問題。您也許想將您的 profile 也設置為這樣,或者在 Windows 中設置一個系統環境變量。在任何情況下,都需要將如下 JAR 文件添加到類路徑:

  castor-1.1.2.1.jar(在 Castor 主目錄中)

  castor-1.1.2.1-XML.jar(在 Castor 主目錄中)

  xerces-J-1.4.0.jar(放在與 Castor 依賴項庫相同的位置)

  commons-logging-1.1.jar(放在與 Castor 依賴項庫相同的位置)

  作為參考,以下是我的 .profile,從中可以看到我是如何設置的:

export JAVA_BASE=/usr/local/Java
export JAVA_HOME=/Library/Java/Home
export XERCES_HOME=$Java_BASE/xerces-2_6_2
export XALAN_HOME=$Java_BASE/xalan-j_2_7_0
export CASTOR_HOME=$Java_BASE/castor-1.1.2.1
export EDITOR=vi
export CASTOR_CLASSES=$CASTOR_HOME/castor-1.1.2.1.jar:
           $CASTOR_HOME/castor-1.1.2.1-XML.jar:
           $CASTOR_HOME/lib/xerces-J_1.4.0.jar:
           $CASTOR_HOME/lib/commons-logging-1.1.jar
export CVS_RSH=ssh
export PS1="[`whoami`:w] "
export CLASSPATH=$XALAN_HOME/xalan.jar:$XALAN_HOME/XML-apis.jar:
         $XALAN_HOME/xercesImpl.jar:
         ~/lib/mclaughlin-XML.jar:$CASTOR_CLASSES:.

  請確保將所有這些文件都放到了類路徑中,接下來將做一個快速測試。

測試安裝

  首先構建一個非常 簡單的類,然後構建一個實用程序將其在 XML 和 Java 之間來回轉換。這裡並不會演示 Castor 的所有功能,而只是一個非常基本的測試。清單 1 顯示了我將使用的一個 CD 類。輸入這些源代碼並保存為 CD.Java(或者從 參考資料 下載這些代碼)。

  清單 1. CD 類(用於測試)

package ibm.XML.castor;
import Java.util.ArrayList;
import Java.util.List;
/** A class to represent CDs */
public class CD implements Java.io.Serializable {
 /** The name of the CD */
 private String name = null;
 /** The artist of the CD */
 private String artist = null;
 /** Track listings */
 private List tracks = null;
 /** Required no-args constructor */
 public CD() {
  super();
 }
 /** Create a new CD */
 public CD(String name, String artist) {
  super();
  this.name = name;
  this.artist = artist;
 }
 public void setName(String name) {
  this.name = name;
 }
 public String getName() {
  return name;
 }
 public void setArtist(String artist) {
  this.artist = artist;
 }
 public String getArtist() {
  return artist;
 }
 public void setTracks(List tracks) {
  this.tracks = tracks;
 }
 public List getTracks() {
  return tracks;
 }
 public void addTrack(String trackName) {
  if (tracks == null) {
   tracks = new ArrayList();
  }
  tracks.add(trackName);
 }
}


 

 現在需要一個類處理編組。如清單 2 所示。

  清單 2. 用於測試編組的類

package ibm.XML.castor;
import Java.io.FileWriter;
import org.exolab.castor.XML.Marshaller;
public class MarshalTester {
 public static void main(String[] args) {
  try {
   CD sessions = new CD("Sessions for Robert J", "Eric Clapton");
   sessions.addTrack("Little Queen of Spades");
   sessions.addTrack("Terraplane Blues");
   FileWriter writer = new FileWriter("cds.XML");
   Marshaller.marshal(sessions, writer);
  } catch (Exception e) {
   System.err.println(e.getMessage());
   e.printStackTrace(System.err);
  }
 }
}

  最後一個類如清單 3 所示,是一個用於解組的類。

  清單 3. 用於測試解組的類

package ibm.XML.castor;
import Java.io.FileReader;
import Java.util.Iterator;
import Java.util.List;
import org.exolab.castor.XML.Unmarshaller;
public class UnmarshalTester {
 public static void main(String[] args) {
  try {
   FileReader reader = new FileReader("cds.XML");
   CD cd = (CD)Unmarshaller.unmarshal(CD.class, reader);
   System.out.println("CD title: " + cd.getName());
   System.out.println("CD artist: " + cd.getArtist());
   List tracks = cd.getTracks();
   if (tracks == null) {
    System.out.println("No tracks.");
   } else {
    for (Iterator i = tracks.iterator(); i.hasNext(); ) {
     System.out.println("Track: " + i.next());
    }
   }
  } catch (Exception e) {
   System.err.println(e.getMessage());
   e.printStackTrace(System.err);
  }
 }
}


 

 像下面這樣編譯這些類:

[bmclaugh:~/Documents/developerworks/castor] javac -d . *.Java
Note: CD.Java uses unchecked or unsafe Operations.
Note: Recompile with -Xlint:unchecked for details.

  如果使用的是 Java 5 或更高的版本,而在 CD.Java 中沒有使用參數化的類型,就會出現上面的警告。不要擔心,這不會有什麼影響。現在需要運行編組程序測試類。

[bmclaugh:~/Documents/developerworks/castor] Java ibm.XML.castor.MarshalTester

  找到並打開 cds.XML。其內容應該像這樣:

<?XML version="1.0" encoding="UTF-8"?>
<CD>
 <artist>Eric Clapton</artist>
 <name>Sessions for Robert J</name>
 <tracks xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:type="java:Java.lang.String">Little Queen of Spades</tracks>
 <tracks xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:type="java:Java.lang.String">Terraplane Blues</tracks>
</CD>

  這些內容可讀性不太好,但是應該能在 XML 文檔中看到在 MarshalTester 類中創建的 CD 的所有信息。

  現在需要確保可以將 XML 文檔轉換回 Java。運行解組測試程序:

[bmclaugh:~/Documents/developerworks/castor] Java ibm.XML.castor.UnmarshalTester
CD title: Sessions for Robert J
CD artist: Eric Clapton
Track: Little Queen of Spades
Track: Terraplane Blues

  這些代碼非常簡單,無需解釋。如果你獲得了這樣的輸出,就說明已經用 Castor 打開了 XML 文件,並且已經將其轉換為一個 Java 類。

  現在 — 我們假設您已經用 UnmarshalTester 獲得了相同的 cds.XML 和輸出 — 您安裝的 Castor 能夠正常運行。您還沒有使用 Castor 做任何比較復雜的工作,只是確保了它能正常運行、正確設置了 JAR 文件以及 Castor 能夠根據需要實現不同的功能。

  結束語

  現在,您有了一個能夠正常運行的 Castor 環境。清單 1、2 和 3 讓您對 Castor 的工作原理有了一定的了解。看看自己能否實現編組和解組功能吧。在下一篇文章中,您將會更進一步了解 Castor 的 XML 特性,以及如何使用映像文件。到那時,請繼續體驗 Castor 的功能。

XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved