亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

通過Java編程處理XML 服務SOA

2019-11-17 04:17:20
字體:
來源:轉載
供稿:網友

    很多大型軟件供應商還在開發各自的 SOA 產品。因此,SOA 領域目前綜合了各種技術,包括 java Business Integration (JBI)、Intelligent Event PRocessing 和 Business Process Execution Language (BPEL) 服務器。因此,在將各種技術融入到一個解決方案之前,想要從 SOA 中受益的用戶組織很可能需要進行大量投資。通過對 SOA 布置如此高的復雜性,行業提前為實現供應商定位鋪好了道路,即使 SOA 其中的一項承諾是實現基于標準、面向組件、獨立于供應商的計算。在開始代價高昂的遷移過程前,用戶組織能夠獲得一些實用的 SOA 使用體驗嗎?

    為回答這個問題,本文通過簡單的 xml 和一些 Java 代碼演示了幾個重要的 SOA 原理。本文并不打算介紹 SOA 領域中的所有內容;相反,我們只介紹其中的一些關鍵部分。例如,您可以考慮使用 rss 發布 XML 服務定義。但是,在本文的例子中,傳輸機制使用的是 Java 工具。

    Java 技術和 XML

    Java 技術和 XML 幾乎成為了同義詞。實際上,我通過 IBM 工具對整篇文章應用了 XML 格式。盡管 XML 取得了顯而易見的巨大成功,仍需注意 XML 是一種相當笨拙的技術,例如 和 標簽會增加大量帶寬并在通過網絡傳輸數據時處理系統開銷。然而,忽略這種特性,XML 確實提供了一些強大的處理工具。這些工具(本文將探討其中的兩種)基本上解決了數據表示和解析問題(后者長久以來一直難以解決)?,F在,通過使用 XML 工具,各種技術級別的程序員都可以實現專業的標準化解析。

    Java 技術為 XML 數據處理提供了一些真正強大的工具(請參見側欄 Java 技術和 XML)。如果將 清單 1 中的內容看作是給定數據集的基于 XML 的呈現,那么您還可以使用其他方式進行呈現。構成 清單 1 基本內容的原始數據一般保存在數據庫中。因此,您如何將這些數據打包成 XML?

    這種聚焦式方法的優點就是用戶組織中的 Java 開發人員可以使用其中的理念構建自己的簡單的試驗性 SOA。這種試驗模式有助于組織實現 SOA 的商業效益。后者包含對業務服務建模,例如計算服務、用戶自助服務、更好的自動化服務和更具響應性的服務。您可以將上述的遷移作為一個獨立試驗實現,與現有業務流程并行運作。

    用戶組織不需要進行大型投資就可實現一個試驗性質的 SOA。通過這種方式,陳述特定于組織的 SOA 需求時可以脫離任何供應商實現。實際上,某些較小的用戶組織可以繼續使用他們的試驗性 SOA 模式,只在后期遷移到軟件供應商提供的大型商用解決方案。

    自助服務趨勢

    對于大多數服務提供商來說,自助服務正在發展為一種趨勢 — 特別是那些資金緊張的 ISP。因此,如果您需要更多帶寬(進行下載或玩在線游戲),您可以登錄到提供商的 Web 站點并通過 Web 頁面自動升級與提供商的連接。讓我們看一個具體的例子:清單 1 展示了一個簡單的基于 XML 的用戶服務配置文件。

    清單 1. 一個簡單的基于 XML 的服務描述

    < ServiceInstance>

    < Customer>Josephine Bloggs< /Customer>

    < Package>Internet< /Package>

    < Bandwidth>1mbps< /Bandwidth>

    < DownloadLimit>1Gbyte< /DownloadLimit>

    < Uptime>95< /Uptime>

    < /ServiceInstance>

    代碼解釋了這個用戶 XML 服務模型。該模型包括:

    一個服務實例

    客戶名字

    服務包的名稱

    已配置的帶寬量

    每月允許的下載限度

    提供商正常運行時間保證

    無疑,服務定義可以比此處的例子復雜很多。其他內容可能包括客戶地址、賬單明細、往返延遲、加密和服務信用信息等。重點是,越來越多的提供商提供如 清單 1 所示的 Web 訪問細節。某種程度上講,這種嘗試可以減少支持電話的花銷和發生頻度。有趣的是,這種基于 Web 的服務可以使用戶覺得為他們提供服務的是較為先進的提供商。這實現了雙贏的局面,因為客戶可以更好地訪問他們的服務數據,而提供商可以銷售無需他們插手的服務包。授權的用戶可以修改如 清單 1 所示的一些服務參數 — 例如,配置的帶寬。隨之修改的是用戶每月的訂購費用。

    因此,清單 1 中的代碼形成了基于 XML 的服務模型的基礎。通過簡單地與在線表單進行交互,用戶可以修改可寫的服務元素(例如帶寬)。通過在線表單進行的修改將被記錄,然后反映到可由用戶配置文件修改的后端服務中。這是一種實現自助服務的標準方法。

    然而,您將要了解的是另一種更加松散耦合的自助服務 — 使用這種服務,用戶可以通過在網絡中傳輸 清單 1 中的 XML 內容修改數據。在這種場景中,所傳輸的 XML 內容可通過一個 Java 客戶機進行修改,后者可運行在臺式機、筆記本電腦、甚至某種資源受限的設備上(例如手機),然后將數據發回給網絡服務提供商。這種機制超越了基本的 HTML 頁面模型并采納了 SOA 思想。

    將服務定義 XML 文檔傳輸給使用 Java 技術的客戶機

    清單 2 中的內容摘取自本文附帶的 Java 文件 encodeXML.java.(相關文件可從 下載 部分獲得)。encodeXML.java 類對 XMLEncoder 類的對象進行了實例化。如您所見,這個對象隨后在當前目錄中創建了名為 xmldata.xml 的文件。下一步是將 XML 數據值插入到文件中,這可以通過調用一連串的 writeObject() 方法實現(清單 2 對此進行了說明)。顯然,在生產環境中,清單 2 中硬編碼的文本字符串將來自數據庫這樣的持久性存儲。無論何種情況,可以看到 XML 數據文件的創建非常簡單。

    清單 2. 使用 XML 格式編碼數據

    XMLEncoder e = new XMLEncoder(

    new BufferedOutputStream(

    new FileOutputStream("xmldata.xml")));

    e.writeObject("Josephine Bloggs");

    e.writeObject("Internet");

    e.writeObject("1mbps");

    e.writeObject("Gbyte");

    e.writeObject("295");

    e.close();


    執行 清單 2 中的程序后,程序的執行目錄中將出現一個名為 xmldata.xml 的文件。清單 3 解釋了新創建文件包含的內容。

    清單 3. 生成的 XML 數據

    < ?xml version="1.0" encoding="UTF-8"?>

    < java version="1.5.0_06" class="java.beans.XMLDecoder">

    < string>Josephine Bloggs< /string>

    < string>Internet< /string>

    < string>1mbps< /string>

    < string>Gbyte< /string>

    < string>295< /string>

    < /java>


    您可以通過網絡將 清單 3 中的文件傳輸給等待狀態中的客戶機 — 使用 Java 技術即可創建。清單 4 展示了一個簡單的例子。

    清單 4. 跨越網絡傳輸文件

    byte[] bytes = new byte[BUFFER_SIZE];

    FileInputStream inputFile = null;

    try

    {

    File file = new File("xmldata.xml");

    if (file.exists())

    {

    inputFile = new FileInputStream(file);

    int ch = inputFile.read(bytes, 0, BUFFER_SIZE);

    while (ch != -1)

    {

    output.write(bytes, 0, ch);

    ch = inputFile.read(bytes, 0, BUFFER_SIZE);

    }

    }

    清單 4 中的代碼創建了一個長度緩沖區 BUFFER_SIZE。 BUFFER_SIZE 常量的值可以是 1024 或更高。通過調用 inputFile.read() 方法將輸入文件(xmldata.xml)的內容讀取到緩沖區中。進行緩沖之后,output.write() 方法將文件數據寫入到 OutputStream 對象的套接字中。最后一步將數據通過網絡發送到等待中的客戶機中。這些功能居然只需要這么少的代碼!

    接下來,您需要使客戶機處理傳入的 XML 數據。

    接收數據的 Java 客戶機獲得 XML 內容(并不是 XML 文件)

    客戶機如何接收 XML 數據?同樣,對于 Java 技術來說這只是小事一樁。數據接收通過一個套接字對象完成。清單 5 展示的代碼將接收傳入的數據并將數據推入到 ArrayList 類的對象中。

    客戶機現在必須解決兩個與所接收數據項的數量有關的問題。由于這是一個松散耦合的場景,您必須假定客戶機并不清楚服務配置文件(即 清單 1 中的代碼)中包含了多少 XML 數據項。因此,您必須確定一些方法來接收和處理精確的數據項數量。第二個問題比較容易解決,就是如何保存處理過的數據。您將看到,清單 5 同時解決了這兩個問題。

    清單 5. 提取嵌入的 XML 數據

    XMLDecoder d = new XMLDecoder(input);

    try

    {

    while (true)

    ArrayList< Object[]> rowList = new ArrayList< Object[]>();

    {

    String dataItem = (String)d.readObject();

    System.out.println("XML decoded data: " + dataItem);

    rowList.add(dataItem);

    }

    }

    }

    catch (Exception exc)

    {

    if (exc instanceof ArrayIndexOutOfBoundsException)

    {

    // No more records to process

    System.out.println("Parsed all XML records - " +

    "threw exception. Number of rows: " + rowList.size());

    }

    }

    d.close();


    通過一個有限循環 while (true),您可以確定期望的到來數據項的數量。該代碼將一直執行循環,直到接收到最后一個數據項,此時將拋出一個異常(ArrayIndexOutOfBoundsException)。您必須使用這種異常機制,除非客戶機已經了解期望的數據項數量。

    從InputStream 對象接收的 XML 數據被保存在 ArrayList 類的一個對象中。該類對于此類應用程序非常有用。完成類定義之后,ArrayList 具有一個特定的容量,總是匹配底層列表的大小。在添加元素時,ArrayList 對象的容量將自動擴展。因此,您無需擔心會超過數組的極限,因為該類將為您處理這一問題。

    此時,客戶機具有 清單 1 中數據的副本??蛻魴C現在可以將帶寬元素修改為所需的值,然后反向執行文件傳輸過程,從客戶機發送到服務器。通過將 XML 文件從服務器移動到客戶機,客戶機實際上使用了這一服務。更新后的數據被發送回服務器以完成事務。當然,服務提供商必須驗證傳入的數據并提供所需的帶寬更改。

    本文描述的這種模式首先將一個 XML 文件通過網絡傳輸到客戶機??蛻魴C將文件數據作為流進行接收,然后將其解析為一個內存駐留對象??蛻魴C隨后對內存駐留對象進行更改,然后反向執行傳輸過程,將對象發回到服務器。

    還存在一種服務,其中 XML 數據被完整無缺地從服務器傳輸到客戶機。這種場景中,客戶機使用某種形式的文件傳輸協議(例如 FTP)獲得完整的文件副本。由于文件傳輸是一種標準技術,這里不作過多介紹,您只需了解客戶機將下載 清單 1 中服務配置數據的一個文件副本。此時,客戶機需要解析并修改文件,然后傳輸回服務器,這種模式的工作原理是什么?

    一種基于 XML 文件的 Java 機制

    客戶機現在將服務配置文件的副本保存在磁盤中。必須對該文件進行解析以提取 XML 數據。讓人意外的是,這實現起來有些難度,對于較大的文件尤其如此。解決問題的關鍵是使用合適的解析工具。本文中使用的工具是 dom4j,該工具允許您將 XML 數據解析為一個 Java 對象。您還可以使用一個基于 Simple API for XML (SAX) 的解析器,但是 SAX 是一種較低級的技術。您將看到,dom4j 工具僅需要很少的工作即可完成解析。清單 6 引用自本文附帶的ProcessEventXml.java 文件,展示了使用 dom4j 解析文件所需的主要元素。

    清單 6. dom4j 處理 XML 數據

    try

    {

    handler.treeWalk(handler.parse(new File(argv[0])));

    }

    catch (Throwable t)

    {

    t.printStackTrace();

    }

    }

    public Document parse(File url)

    throws DocumentException

    {

    SAXReader reader = new SAXReader();

    Document document = reader.read(url);

    return document;

    }

    public void treeWalk(Document document)

    throws Exception

    {

    treeWalk(document.getRootElement());

    }


    基本上只需要兩種方法:parse() 和 treeWalk()。當我運行經過編譯的類時,我獲得了如 清單 7 所示的輸出。如果您希望親自運行代碼,請確保下載、安裝 dom4j 副本,并添加到 CLASSPATH 中(最后一步就是將相應的 JAR 文件添加到您的 CLASSPATH 變量中)。然后,編譯 ProcessEventXml.java 文件并使用以下命令運行程序:

    java ProcessEventXml ServiceDefinition.xml

    清單 7. 使用 dom4j 處理 XML 文件

    java ProcessEventXml ServiceDefinition.xml

    Josephine Bloggs Internet 1mbps 1Gbyte 95

    正如您看到的,僅需少量工作即可整潔地顯示 XML 數據。這些工作都是由 dom4j 處理的。事實上,大部分工作是通過 treeWalk() 方法完成的,這是一種只有到達文件末尾才進行調用的遞歸式方法。這里向您展示了 dom4j 的一個功能:在內存中進行處理。需要注意的是,該技術不適合用于特別大型的 XML 文件,特別是如果您的 Java 設備非常小的話。然而,在本文的例子中,XML 數據集非常小,因此使用這個功能不會產生問題。

    您的基于文件的客戶機現在已經成功訪問了 XML 數據??蛻魴C可以根據需要修改數據并編寫新的 XML 文件。然后將其傳輸回服務器進行處理。像上文一樣,客戶機在這一過程中使用了該服務。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
一区二区三区国产在线观看| 国内精品久久久久久久| 中文字幕亚洲综合久久| 欧美精品一区二区三区国产精品| 亚洲最大福利网| 久久久久久久久久久免费精品| 国产精品免费视频久久久| 国产婷婷成人久久av免费高清| 海角国产乱辈乱精品视频| 日韩av免费看| 久久99亚洲热视| 国产精品中文字幕久久久| 久久久久久网址| 97在线精品国自产拍中文| 久久久伊人日本| 亚洲专区在线视频| 亚洲黄色免费三级| 国产成人欧美在线观看| 91日韩在线视频| 川上优av一区二区线观看| 色婷婷亚洲mv天堂mv在影片| 欧美有码在线观看| 影音先锋欧美精品| 亚洲乱亚洲乱妇无码| 日韩欧美精品网站| 色哟哟亚洲精品一区二区| 国产精品久久在线观看| 国产一区二中文字幕在线看| 在线一区二区日韩| 久久97精品久久久久久久不卡| www.亚洲一区| 久久免费视频在线| 一区二区欧美在线| 成人在线视频网| 亚洲全黄一级网站| 国产精品久久久久91| 国产精品免费在线免费| 精品无码久久久久久国产| 精品中文字幕在线2019| 亚洲已满18点击进入在线看片| 亚洲一区制服诱惑| 91精品国产777在线观看| 国产精品麻豆va在线播放| 国产精品自拍小视频| 欧美激情第6页| 欧美黄色小视频| 亚洲男人天堂九九视频| 国产精品福利网站| 亚洲欧美日韩中文视频| 国产精品成人aaaaa网站| 最近2019年手机中文字幕| 91精品国产高清久久久久久91| 日韩欧美中文第一页| 欧美猛交免费看| 亚洲成人久久网| 热99精品只有里视频精品| 日韩一区av在线| 欧美激情视频一区二区三区不卡| 久久久欧美一区二区| 亚洲男人的天堂网站| 欧美激情精品久久久久久免费印度| 久久久免费精品视频| 57pao成人永久免费视频| xvideos亚洲人网站| 亚洲成色999久久网站| 91免费在线视频网站| 亚洲欧洲在线观看| 国产日韩欧美在线视频观看| 日韩一中文字幕| 尤物yw午夜国产精品视频明星| 精品国产一区二区三区久久久狼| 中文字幕在线视频日韩| 欧美精品久久久久久久| 国模精品系列视频| 欧美日韩黄色大片| 色偷偷888欧美精品久久久| 日韩电影免费观看在线| 中文国产成人精品| 亚洲成色777777在线观看影院| 亚洲国产精品成人精品| 亚洲第一福利在线观看| 久久久精品视频成人| 欧美电影免费观看网站| 久久理论片午夜琪琪电影网| 精品久久久在线观看| 97热在线精品视频在线观看| 成人免费网站在线观看| 亚洲精品乱码久久久久久金桔影视| 日韩在线视频观看正片免费网站| 黄色成人av网| 狠狠久久亚洲欧美专区| 国产精品69av| 日韩中文字幕视频| 国产在线a不卡| 国产不卡在线观看| 国产精品成人国产乱一区| 国产日韩av在线| 青草青草久热精品视频在线网站| 色悠悠久久久久| 亚洲2020天天堂在线观看| 亚洲国产精品一区二区久| 亚洲www视频| 成人国产精品久久久久久亚洲| 国产成人精品视频在线观看| 高跟丝袜一区二区三区| 一区二区三区 在线观看视| 亚洲欧美变态国产另类| 亚洲成人激情图| 久久久精品中文字幕| 亚洲香蕉成人av网站在线观看| 欧美高清自拍一区| 日本精品性网站在线观看| 日韩一区二区精品视频| 国产亚洲欧洲高清一区| 国产欧美一区二区白浆黑人| 91精品国产91久久久久久吃药| 91精品久久久久久久久青青| 亚洲视频自拍偷拍| 中文字幕亚洲国产| 久久国内精品一国内精品| 日韩在线观看免费| 亚洲天堂第一页| 久久久伊人欧美| 欧美日韩精品在线观看| 亚洲人成在线一二| 亚洲第一在线视频| 国产成人亚洲精品| 午夜精品一区二区三区av| 欧美猛交ⅹxxx乱大交视频| 亚洲偷欧美偷国内偷| 欧美激情在线播放| 成人久久精品视频| 高清一区二区三区四区五区| 亚洲成成品网站| 国产精品扒开腿做爽爽爽的视频| 国产做受高潮69| 亚洲国产精品福利| 欧美成人h版在线观看| 国产精品久久不能| 红桃视频成人在线观看| 国产一区二区三区高清在线观看| 美女视频黄免费的亚洲男人天堂| 日本一区二区在线播放| 91精品国产综合久久香蕉最新版| 欧美在线精品免播放器视频| 精品国产一区二区三区在线观看| 中文字幕综合一区| 欧美电影在线免费观看网站| 国产亚洲激情视频在线| 97色在线播放视频| 日韩电影大片中文字幕| 久久综合久久美利坚合众国| 美女啪啪无遮挡免费久久网站| 亚洲午夜精品久久久久久性色| 日韩hd视频在线观看| 欧美老女人bb| 91在线免费视频| 国产乱人伦真实精品视频| 国产噜噜噜噜久久久久久久久| 国产福利视频一区| 国产精品久久久久久久7电影| 亚洲91av视频| 2019中文在线观看| 亚洲三级 欧美三级|