實現JavaBeans到XML的相互轉換


摘要

  不用複雜的代碼,就可以讓您的JavaBeans自己控制到XML文件的相互轉化。本文展示了怎樣通過寫組件來實現從JavaBeans到XML文件的相互轉換。

  爲了靈活的滿足Web應用和Web services需求的變化,Java和XML的輕便性和可擴展性使它們成爲解決這一問題的理想選擇。SAX (Simple API for XML), DOM (document.nbspObject Model),

XSL (Extensible Stylesheet Language), XSLT (XSL Transformations),

SOAP (Simple Object Access Protocol), and BML (Bean Markup Language)是XML領域內的相關技術。本文集合了Java和XML輕便和可擴展的優點,但又不需要開發人員瞭解上述的相關技術。

  在Java分佈式應用中使用遠程方法調用(RMI),而不是直接用底層的socket或其它網絡鏈接代碼。EJB技術也使開發人員從transaction,recovery, activation等底層機制中解放出來。同樣,使用本文的JavaBean-XML映射組件,開發人員也不用直接處理與XML有關的APIs。

組件的編寫

  BeanXMLMapping組件實現了從JavaBean到XML文件的相互轉換。藉助於JavaBean的內省機制,XML解析器和DOM APIs,您可以編寫toXML()方法來實現從JavaBean到XML文件的轉換,以及fromXML()方法實現從XML文件到JavaBean的轉換.

  列表1展示BeanXMLMapping組件一種可能的實現。程序中使用JOX(Java Objects in XML)類庫。當然您也可以使用其它的APIs來實現BeanXMLMapping組件,這裏選用JOX是因爲比較簡單並且可以重用。

  列表1 BeanXMLMapping組件

import com.wutka.jox.*;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

public class BeanXMLMapping {

  /**
   *  Retrieves a bean object for the
   *  received XML and matching bean class
   */
  public static Object fromXML(String xml, Class className) {
    ByteArrayInputStream xmlData = new ByteArrayInputStream
    (xml.getBytes());
    JOXBeanInputStream joxIn = new JOXBeanInputStream(xmlData);
    try {
      return (Object) joxIn.readObject(className);
    } catch (IOException exc) {
      exc.printStackTrace();
      return null;
    } finally {
      try {
        xmlData.close();
        joxIn.close();
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
  }

  /**
   *  Returns an XML document.nbspString for the received bean
   */
  public static String toXML(Object bean) {
    ByteArrayOutputStream xmlData = new ByteArrayOutputStream();
    JOXBeanOutputStream joxOut = new JOXBeanOutputStream(xmlData);
    try {
      joxOut.writeObject(beanName(bean), bean);
      return xmlData.toString();
    } catch (IOException exc) {
      exc.printStackTrace();
      return null;
    } finally {
      try {
        xmlData.close();
        joxOut.close();
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
  }

  /**
   *  Find out the bean class name
   */
  private static String beanName(Object bean) {
    String fullClassName = bean.getClass().getName();
    String classNameTemp = fullClassName.substring(
        fullClassName.lastIndexOf(".") + 1,
        fullClassName.length()
        );
    return classNameTemp.substring(0, 1)
         + classNameTemp.substring(1);
  }
}


  BeanXMLMapping類提供了兩個方法來實現從JavaBean到XML文件的相互轉換:

toXML(): 產生bean實例相應的XML格式字符串
fromXML(): 用XML格式的字符串創建bean實例


組件的使用

  列表2展示名爲AccountHistoryContext的JavaBean,該類中的toXML()和fromXML()方法只是簡單的調用BeanXMLMapping組件的toXML()和fromXML()方法。

  列表2 AccountHistoryContext bean

public class AccountHistoryContext{
  private String dateFrom;
  public String getDateFrom()  { return dateFrom; }
  public void setDateFrom(String s)  { dateFrom = s;  } 
  ...
  // Other attributes with their get and set methods

  public String toXML()   {
    return BeanXMLMapping.toXML(this);
  }
  public static AccountHistoryContext fromXML (String xml)  {
      return (AccountHistoryContext)  
        BeanXMLMapping.fromXML (
           xml, AccountHistoryContext.class);
  }
}


  圖1顯示一般的JavaBean類和其對應XML文件的映射關係





從JavaBean轉換到XML

XML文件的第一行是XML版本的申明,在上例中指定爲1.0版(<?xml version="1.0" encoding="ISO-8859-1"?>)。 

   下面一行定義XML文件的根接點,例子中爲JavaBean的類名(<Bean>)。 

再下面就是定義跟節點的子節點。節點名爲bean中通過get方法可以訪問的屬性。如果屬性爲基本類型(比如String,int),就直接用屬性的名字生成節點。如果屬性是另一個bean,則產生相應的嵌套節點.

   圖2 顯示ContactInfo類實例,ContactInfo類及由toXML()方法產生的XML文件 





從XML轉換到JavaBean

  讀XML文件時,根結點名,節點屬性,嵌套節點會分別與bean,set方法和嵌套的beans建立映射關係。因此,要完成映射,必須爲每個bean提供默認構造函數及每個屬性的set方法(基本類型或嵌套bean)。

   圖3 顯示ContactInfo的XML文件,對應的ContactInfo類及通過fromXML()方法產生的ContactInfo類實例。M 





使用舉例

讓我們看一個使用BeanXMLMapping組件的例子。例子由XML文件,JavaBean類和一個在線銀行的快照組成。你可以從這裏下載例子的源碼.



  圖4 在線銀行的歷史帳務頁面


  圖5顯示類AccountHistory的類圖, 列表3顯示該類通過toXML()方法產生的XML文件。





  列表3 XML封裝的歷史帳務信息

<?xml version="1.0" encoding="ISO-8859-1"?>
<AccountHistory>
  <transactionList>
    <transaction>
      <deposit></deposit>
      <withdraw>-$1,150.00 </withdraw>
      <date>3/10/2002 </date>
      <description>Check Number: 213 </description>
      <balance>$3,340.50</balance>
    </transaction>
    <transaction>
      <deposit></deposit>
      <withdraw>-$151.50</withdraw>
      <date>3/7/2002</date>
      <description>ATM Withdrawal 350 SAN JOSE CA</description>
      <balance>$3,189.00</balance>
    </transaction>
    <transaction>
      <deposit>$4,060.40 </deposit>
      <withdraw></withdraw>
      <date>3/5/2002</date>
      <description>ACH DEPOSIT - MyCompany </description>
      <balance>$7,249.40</balance>
    </transaction>
    <transaction>
      <deposit></deposit>
      <withdraw>-$20.00</withdraw>
      <date>2/26/2002</date>
      <description>JC'S BBQ AND DELI SAN JOSE CA </description>
      <balance>$7,229.40</balance>
    </transaction>
  </transactionList>
  <accountHistoryContext>
    <account>
      <holder>Paulo Caroli</holder>
      <type>checkings</type>
      <number>316614-10</number>
    </account>
    <dateTo>Monday, March 11, 2002 </dateTo>
    <dateFrom>Monday, February 25, 2002 </dateFrom>
  </accountHistoryContext>
</AccountHistory>


  圖6 時序圖顯示怎樣找到類AccountHistory並調用其toXML()方法。





  圖7在線銀行請求歷史帳務的頁面。帳號和日期顯示在該頁面上;列表4用XML封裝該顯示信息。





  列表4 XML封裝的歷史帳務請求信息

<?xml version="1.0" encoding="ISO-8859-1"?>
<AccountHistoryContext>
  <account>
    <holder>Paulo Caroli</holder>
    <type>checkings</type>
    <number>316614-10</number>
  </account>
  <dateTo>Monday, March 11, 2002 </dateTo>
  <dateFrom>Monday, February 25, 2002 </dateFrom>
</AccountHistoryContext>


  AccountHistoryContext類的FromXML()方法將傳來的XML文件轉換成相應的

AccountHistoryContext類對象。

  就是這麼簡單,根本不用複雜的代碼,就可以實現從JavaBean到XML文件的相互轉換。程序開發人員使用BeanXMLMapping組件就可以不用關心底層的與XML相關的類庫。

下載源碼

原文

相關資源:

JOX (Java Objects in XML):http://www.wutka.com/jox.html

JOX 下載: http://www.wutka.com/joxdownload.html

DTDParser 下載: http://www.wutka.com/dtdparserdownload.html

Xerces-J 下載: http://xml.apache.org/dist/xerces-j/Xerces-J-bin.1.4.4.zip

XML標準: http://www.w3.org/XML
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章