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

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

如何輕松實(shí)現(xiàn)JavaBeans到XML的相互轉(zhuǎn)換

2019-11-18 12:49:57
字體:
供稿:網(wǎng)友

  為了靈活的滿足Web應(yīng)用和Web services需求的變化,javaxml的輕便性和可擴(kuò)展性使它們成為解決這一問題的理想選擇。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領(lǐng)域內(nèi)的相關(guān)技術(shù)。本文集合了Java和XML輕便和可擴(kuò)展的優(yōu)點(diǎn),但又不需要開發(fā)人員了解上述的相關(guān)技術(shù)。
  在Java分布式應(yīng)用中使用遠(yuǎn)程方法調(diào)用(RMI),而不是直接用底層的socket或其它網(wǎng)絡(luò)鏈接代碼。EJB技術(shù)也使開發(fā)人員從transaction,recovery, activation等底層機(jī)制中解放出來。同樣,使用本文的JavaBean-XML映射組件,開發(fā)人員也不用直接處理與XML有關(guān)的APIs。
  
  組件的編寫
  BeanXMLMapping組件實(shí)現(xiàn)了從JavaBean到XML文件的相互轉(zhuǎn)換。借助于JavaBean的內(nèi)省機(jī)制,XML解析器和DOM APIs,您可以編寫toXML()方法來實(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)類庫。當(dāng)然您也可以使用其它的APIs來實(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.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類提供了兩個(gè)方法來實(shí)現(xiàn)從JavaBean到XML文件的相互轉(zhuǎn)換:
  toXML(): 產(chǎn)生bean實(shí)例相應(yīng)的XML格式字符串
  fromXML(): 用XML格式的字符串創(chuàng)建bean實(shí)例
  
  組件的使用  列表2展示名為AccountHistoryContext的JavaBean,該類中的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類和其對(duì)應(yīng)XML文件的映射關(guān)系
  
 如何輕松實(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的類名(<Bean>)。
  
  再下面就是定義跟節(jié)點(diǎn)的子節(jié)點(diǎn)。節(jié)點(diǎn)名為bean中通過get方法可以訪問的屬性。假如屬性為基本類型(比如String,int),就直接用屬性的名字生成節(jié)點(diǎn)。假如屬性是另一個(gè)bean,則產(chǎn)生相應(yīng)的嵌套節(jié)點(diǎn).
  
  圖2 顯示ContactInfo類實(shí)例,ContactInfo類及由toXML()方法產(chǎn)生的XML文件。
  
 如何輕松實(shí)現(xiàn)JavaBeans到XML的相互轉(zhuǎn)換(圖二)

  
  從XML轉(zhuǎn)換到JavaBean
  讀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方法(基本類型或嵌套bean)。
  
  圖3 顯示ContactInfo的XML文件,對(duì)應(yīng)的ContactInfo類及通過fromXML()方法產(chǎn)生的ContactInfo類實(shí)例。
  
 如何輕松實(shí)現(xiàn)JavaBeans到XML的相互轉(zhuǎn)換(圖三)

  
  使用舉例
  讓我們看一個(gè)使用BeanXMLMapping組件的例子。例子由XML文件,JavaBean類和一個(gè)在線銀行的快照組成。你可以從這里下載例子的源碼.
  
  圖4 在線銀行的歷史帳務(wù)頁面。
  
 如何輕松實(shí)現(xiàn)JavaBeans到XML的相互轉(zhuǎn)換(圖四)

  圖5顯示類AccountHistory的類圖, 列表3顯示該類通過toXML()方法產(chǎn)生的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í)序圖顯示怎樣找到類AccountHistory并調(diào)用其toXML()方法。
  
 如何輕松實(shí)現(xiàn)JavaBeans到XML的相互轉(zhuǎn)換(圖六)

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

  列表4 XML封裝的歷史帳務(wù)請(qǐng)求信息
  <?xml version

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 丹凤县| 长春市| 措勤县| 浦县| 扎囊县| 化隆| 浠水县| 武胜县| 剑阁县| 湘潭市| 颍上县| 湖南省| 儋州市| 叙永县| 丰镇市| 洪江市| 永福县| 永康市| 饶河县| 清徐县| 武冈市| 象山县| 合作市| 东莞市| 扎赉特旗| 合山市| 神池县| 巨野县| 乌什县| 安徽省| 沁阳市| 筠连县| 库车县| 岳普湖县| 陆川县| 临西县| 扶绥县| 龙胜| 九江市| 江川县| 顺平县|