程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> JavaBeans至XML的相互轉換

JavaBeans至XML的相互轉換

編輯:關於JAVA

摘要

  不用復雜的代碼,就可以讓您的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文件的根接點,例子中為JavaBean的類名()。

再下面就是定義跟節點的子節點。節點名為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封裝的歷史帳務信息

-$1,150.00

3/10/2002

Check Number: 213

$3,340.50

-$151.50

3/7/2002

ATM Withdrawal 350 SAN JOSE CA

$3,189.00

$4,060.40

3/5/2002

ACH DEPOSIT - MyCompany

$7,249.40

-$20.00

2/26/2002

JC'S BBQ AND DELI SAN JOSE CA

$7,229.40

Paulo Caroli

checkings

316614-10

Monday, March 11, 2002

Monday, February 25, 2002

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

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

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

Paulo Caroli

checkings

316614-10

Monday, March 11, 2002

Monday, February 25, 2002

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

AccountHistoryContext類對象。

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved