国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

JavaBean-XML組件輕松實(shí)現(xiàn)JavaBeans到XML的相互轉(zhuǎn)換

2019-11-18 16:20:52
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
摘要
    不用復(fù)雜的代碼,就可以讓您的javaBeans自己控制到xml文件的相互轉(zhuǎn)化。本文展示了怎樣通過(guò)寫(xiě)組件來(lái)實(shí)現(xiàn)從JavaBeans到XML文件的相互轉(zhuǎn)換。

   為了靈活的滿(mǎn)足Web應(yīng)用和Web services需求的變化,Java和XML的輕便性和可擴(kuò)展性使它們成為解決這一問(wèn)題的理想選擇。SAX (Simple API for XML), DOM (Document Object Model), XSL (Extensible Stylesheet Language), XSLT (XSL Transformations), SOAP (Simple Object access PRotocol), and BML (Bean Markup Language)是XML領(lǐng)域內(nèi)的相關(guān)技術(shù)。本文集合了Java和XML輕便和可擴(kuò)展的優(yōu)點(diǎn),但又不需要開(kāi)發(fā)人員了解上述的相關(guān)技術(shù)。
   在Java分布式應(yīng)用中使用遠(yuǎn)程方法調(diào)用(RMI),而不是直接用底層的socket或其它網(wǎng)絡(luò)鏈接代碼。EJB技術(shù)也使開(kāi)發(fā)人員從transaction,recovery, activation等底層機(jī)制中解放出來(lái)。同樣,使用本文的JavaBean-XML映射組件,開(kāi)發(fā)人員也不用直接處理與XML有關(guān)的APIs。

組件的編寫(xiě)
   BeanXMLMapping組件實(shí)現(xiàn)了從JavaBean到XML文件的相互轉(zhuǎn)換。借助于JavaBean的內(nèi)省機(jī)制,XML解析器和DOM APIs,您可以編寫(xiě)toXML()方法來(lái)實(shí)現(xiàn)從JavaBean到XML文件的轉(zhuǎn)換,以及fromXML()方法實(shí)現(xiàn)從XML文件到JavaBean的轉(zhuǎn)換.
      列表1展示BeanXMLMapping組件一種可能的實(shí)現(xiàn)。程序中使用JOX(Java Objects in XML)類(lèi)庫(kù)。當(dāng)然您也可以使用其它的APIs來(lái)實(shí)現(xiàn)BeanXMLMapping組件,這里選用JOX是因?yàn)楸容^簡(jiǎn)單并且可以重用。

列表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 String 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類(lèi)提供了兩個(gè)方法來(lái)實(shí)現(xiàn)從JavaBean到XML文件的相互轉(zhuǎn)換:
toXML(): 產(chǎn)生bean實(shí)例相應(yīng)的XML格式字符串
fromXML(): 用XML格式的字符串創(chuàng)建bean實(shí)例

組件的使用    列表2展示名為AccountHistoryContext的JavaBean,該類(lèi)中的toXML()和fromXML()方法只是簡(jiǎn)單的調(diào)用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類(lèi)和其對(duì)應(yīng)XML文件的映射關(guān)系
JavaBean-XML組件輕松實(shí)現(xiàn)JavaBeans到XML的相互轉(zhuǎn)換(圖一)

從javabean轉(zhuǎn)換到xml
    XML文件的第一行是XML版本的申明,在上例中指定為1.0版(<?xml version="1.0" encoding="ISO-8859-1"?>)。
下面一行定義XML文件的根接點(diǎn),例子中為JavaBean的類(lèi)名(<Bean>)。

    再下面就是定義跟節(jié)點(diǎn)的子節(jié)點(diǎn)。節(jié)點(diǎn)名為bean中通過(guò)get方法可以訪(fǎng)問(wèn)的屬性。如果屬性為基本類(lèi)型(比如String,int),就直接用屬性的名字生成節(jié)點(diǎn)。如果屬性是另一個(gè)bean,則產(chǎn)生相應(yīng)的嵌套節(jié)點(diǎn).

圖2 顯示ContactInfo類(lèi)實(shí)例,ContactInfo類(lèi)及由toXML()方法產(chǎn)生的XML文件。
JavaBean-XML組件輕松實(shí)現(xiàn)JavaBeans到XML的相互轉(zhuǎn)換(圖二)

從xml轉(zhuǎn)換到j(luò)avabean
    讀XML文件時(shí),根結(jié)點(diǎn)名,節(jié)點(diǎn)屬性,嵌套節(jié)點(diǎn)會(huì)分別與bean,set方法和嵌套的beans建立映射關(guān)系。因此,要完成映射,必須為每個(gè)bean提供默認(rèn)構(gòu)造函數(shù)及每個(gè)屬性的set方法(基本類(lèi)型或嵌套bean)。

圖3 顯示ContactInfo的XML文件,對(duì)應(yīng)的ContactInfo類(lèi)及通過(guò)fromXML()方法產(chǎn)生的ContactInfo類(lèi)實(shí)例。
JavaBean-XML組件輕松實(shí)現(xiàn)JavaBeans到XML的相互轉(zhuǎn)換(圖三)

使用舉例
    讓我們看一個(gè)使用BeanXMLMapping組件的例子。例子由XML文件,JavaBean類(lèi)和一個(gè)在線(xiàn)銀行的快照組成。你可以從這里下載例子的源碼.

圖4 在線(xiàn)銀行的歷史帳務(wù)頁(yè)面。
JavaBean-XML組件輕松實(shí)現(xiàn)JavaBeans到XML的相互轉(zhuǎn)換(圖四)

圖5顯示類(lèi)AccountHistory的類(lèi)圖, 列表3顯示該類(lèi)通過(guò)toXML()方法產(chǎn)生的XML文件。
JavaBean-XML組件輕松實(shí)現(xiàn)JavaBeans到XML的相互轉(zhuǎn)換(圖五)

列表3 XML封裝的歷史帳務(wù)信息
<?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 時(shí)序圖顯示怎樣找到類(lèi)AccountHistory并調(diào)用其toXML()方法。

JavaBean-XML組件輕松實(shí)現(xiàn)JavaBeans到XML的相互轉(zhuǎn)換(圖六)

圖7在線(xiàn)銀行請(qǐng)求歷史帳務(wù)的頁(yè)面。帳號(hào)和日期顯示在該頁(yè)面上;列表4用XML封裝該顯示信息。
JavaBean-XML組件輕松實(shí)現(xiàn)JavaBeans到XML的相互轉(zhuǎn)換(圖七)

列表4 XML封裝的歷史帳務(wù)請(qǐng)求信息
<?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類(lèi)的FromXML()方法將傳來(lái)的XML文件轉(zhuǎn)換成相應(yīng)的AccountHistoryContext類(lèi)對(duì)象。

    就是這么簡(jiǎn)單,根本不用復(fù)雜的代碼,就可以實(shí)現(xiàn)從JavaBean到XML文件的相互轉(zhuǎn)換。程序開(kāi)發(fā)人員使用BeanXMLMapping組件就可以不用關(guān)心底層的與XML相關(guān)的類(lèi)庫(kù)。

原文:
http://www.javaworld.com/javaworld/javatips/jw-javatip138.Html

matrix開(kāi)源技術(shù)經(jīng)javaworld授權(quán)翻譯并發(fā)布.
如果你對(duì)此文章有任何看法或建議,請(qǐng)到Matrix論壇發(fā)表您的意見(jiàn).
注明: 如果對(duì)matrix的翻譯文章系列感興趣,請(qǐng)點(diǎn)擊oreilly和javaworld文章翻譯計(jì)劃查看詳細(xì)情況
您也可以點(diǎn)擊-Flashspy查看翻譯作者的詳細(xì)信息.
原文:http://www.javaworld.com/javaworld/javatips/jw-javatip138.html

(出處:http://www.survivalescaperooms.com)



發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 左云县| 恭城| 岳西县| 金沙县| 米泉市| 灌云县| 安仁县| 二连浩特市| 双城市| 徐汇区| 寿阳县| 千阳县| 随州市| 恩平市| 肥东县| 娄烦县| 周口市| 五峰| 昌平区| 昭平县| 仲巴县| 舟曲县| 罗源县| 繁昌县| 镇平县| 涪陵区| 枝江市| 眉山市| 寿宁县| 如皋市| 社会| 贡觉县| 汝城县| 若羌县| 车致| 共和县| 同江市| 茌平县| 防城港市| 黄平县| 雅江县|