<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 14, comments - 15, trackbacks - 0, articles - 0
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理
    用JavaBean-XML映射組件輕松實現JavaBeans到XML的相互轉換

    翻譯作者:-matrix開源技術-flashspy

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

       為了靈活的滿足Web應用和Web services需求的變化,Java和XML的輕便性和可擴展性使它們成為解決這一問題的理想選擇。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領域內的相關技術。本文集合了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 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類提供了兩個方法來實現從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文件的映射關系
    IMG http://www.javaworld.com/javaworld/javatips/images/jw-javatip138f1-thumb.jpg[/IMG]

    從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文件。
    IMG http://www.javaworld.com/javaworld/javatips/images/jw-javatip138f2.jpg[/IMG]

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

    圖3 顯示ContactInfo的XML文件,對應的ContactInfo類及通過fromXML()方法產生的ContactInfo類實例。
    IMG http://www.javaworld.com/javaworld/javatips/images/jw-javatip138f3.jpg[/IMG]

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

    圖4 在線銀行的歷史帳務頁面。
    IMG http://www.javaworld.com/javaworld/javatips/images/jw-javatip138f4.jpg[/IMG]

    圖5顯示類AccountHistory的類圖, 列表3顯示該類通過toXML()方法產生的XML文件。
    IMG http://www.javaworld.com/javaworld/javatips/images/jw-javatip138f5-thumb.jpg[/IMG]

    列表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()方法。
    IMG http://www.javaworld.com/javaworld/javatips/images/jw-javatip138f6-thumb.jpg[/IMG]

    圖7在線銀行請求歷史帳務的頁面。帳號和日期顯示在該頁面上;列表4用XML封裝該顯示信息。
    IMG http://www.javaworld.com/javaworld/javatips/images/jw-javatip138f7.jpg[/IMG]

    列表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相關的類庫。

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

    matrix開源技術javaworld授權翻譯并發布.
    如果你對此文章有任何看法或建議,請到Matrix論壇發表您的意見.
    注明: 如果對matrix的翻譯文章系列感興趣,請點擊oreilly和javaworld文章翻譯計劃查看詳細情況
    您也可以點擊-flashspy查看翻譯作者的詳細信息.
    我要啦免费统计
    主站蜘蛛池模板: 91av免费观看| 一级毛片在线免费观看| 国产高清免费在线| 亚洲一级毛片视频| 免费国产作爱视频网站| 亚洲Av高清一区二区三区| 成人免费福利视频| 2020久久精品亚洲热综合一本| 67194成是人免费无码| 亚洲国产精品成人午夜在线观看| 成人五级毛片免费播放| 亚洲av色香蕉一区二区三区| 国产成人在线观看免费网站| 国产亚洲视频在线观看| 亚洲国产一区明星换脸| 好紧我太爽了视频免费国产| 久久亚洲美女精品国产精品 | 亚洲理论电影在线观看| 美女无遮挡拍拍拍免费视频 | 成人免费毛片观看| 综合一区自拍亚洲综合图区| 亚洲日韩在线中文字幕第一页 | 亚洲成av人在线视| 最近在线2018视频免费观看| 亚洲综合小说另类图片动图 | 国产成人精品免费视频大全| 国产亚洲精品无码成人| 无码av免费毛片一区二区| 亚洲av日韩综合一区久热| 久久精品国产亚洲7777| 99免费在线观看视频| 亚洲Aⅴ在线无码播放毛片一线天| 亚洲国产成人乱码精品女人久久久不卡 | 亚洲精品无码不卡在线播放| 免费国产真实迷j在线观看| 国产做国产爱免费视频| 亚洲综合丁香婷婷六月香| 亚洲AV无码不卡在线观看下载| 永久在线观看免费视频| 亚洲色少妇熟女11p| 亚洲成AV人片在|