偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

通過(guò)Java編程處理XML服務(wù)定義

開(kāi)發(fā) 后端
Java技術(shù)為SOA設(shè)計(jì)和實(shí)現(xiàn)提供了經(jīng)過(guò)優(yōu)化的解決方案。通過(guò)使用簡(jiǎn)單的基于XML文件的服務(wù)配置,您可以輕松地在網(wǎng)絡(luò)中移動(dòng)客戶機(jī)數(shù)據(jù)??蛻魴C(jī)可以查看并修改這些數(shù)據(jù),然后使用這些數(shù)據(jù)更新服務(wù)。本文中的服務(wù)由ISP提供,但是任何提供商都可以使用這種方法。

自助服務(wù)趨勢(shì)

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

清單 1. 一個(gè)簡(jiǎn)單的基于 XML 的服務(wù)描述

<ServiceInstance>
<Customer>Josephine Bloggs</Customer>
<Package>Internet</Package>
<Bandwidth>1mbps</Bandwidth>
<DownloadLimit>1Gbyte</DownloadLimit>
<Uptime>95</Uptime>
</ServiceInstance>

代碼解釋了這個(gè)用戶 XML 服務(wù)模型。該模型包括:

◆ 一個(gè)服務(wù)實(shí)例

◆ 客戶名字

◆ 服務(wù)包的名稱(chēng)

◆ 已配置的帶寬量

◆ 每月允許的下載限度

◆ 提供商正常運(yùn)行時(shí)間保證

無(wú)疑,服務(wù)定義可以比此處的例子復(fù)雜很多。其他內(nèi)容可能包括客戶地址、賬單明細(xì)、往返延遲、加密和服務(wù)信用信息等。重點(diǎn)是,越來(lái)越多的提供商提供如 清單 1 所示的 Web 訪問(wèn)細(xì)節(jié)。某種程度上講,這種嘗試可以減少支持電話的花銷(xiāo)和發(fā)生頻度。有趣的是,這種基于 Web 的服務(wù)可以使用戶覺(jué)得為他們提供服務(wù)的是較為先進(jìn)的提供商。這實(shí)現(xiàn)了雙贏的局面,因?yàn)榭蛻艨梢愿玫卦L問(wèn)他們的服務(wù)數(shù)據(jù),而提供商可以銷(xiāo)售無(wú)需他們插手的服務(wù)包。授權(quán)的用戶可以修改如 清單 1 所示的一些服務(wù)參數(shù) — 例如,配置的帶寬。隨之修改的是用戶每月的訂購(gòu)費(fèi)用。

因此,清單 1 中的代碼形成了基于 XML 的服務(wù)模型的基礎(chǔ)。通過(guò)簡(jiǎn)單地與在線表單進(jìn)行交互,用戶可以修改可寫(xiě)的服務(wù)元素(例如帶寬)。通過(guò)在線表單進(jìn)行的修改將被記錄,然后反映到可由用戶配置文件修改的后端服務(wù)中。這是一種實(shí)現(xiàn)自助服務(wù)的標(biāo)準(zhǔn)方法。

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

#p#

將服務(wù)定義 XML 文檔傳輸給使用 Java 技術(shù)的客戶機(jī)

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

清單 2 中的內(nèi)容摘取自本文附帶的 Java 文件 encodeXML.java.(相關(guān)文件可從 下載 部分獲得)。encodeXML.java 類(lèi)對(duì) XMLEncoder 類(lèi)的對(duì)象進(jìn)行了實(shí)例化。如您所見(jiàn),這個(gè)對(duì)象隨后在當(dāng)前目錄中創(chuàng)建了名為 xmldata.xml 的文件。下一步是將 XML 數(shù)據(jù)值插入到文件中,這可以通過(guò)調(diào)用一連串的 writeObject() 方法實(shí)現(xiàn)(清單 2 對(duì)此進(jìn)行了說(shuō)明)。顯然,在生產(chǎn)環(huán)境中,清單 2 中硬編碼的文本字符串將來(lái)自數(shù)據(jù)庫(kù)這樣的持久性存儲(chǔ)。無(wú)論何種情況,可以看到 XML 數(shù)據(jù)文件的創(chuàng)建非常簡(jiǎn)單。

清單 2. 使用 XML 格式編碼數(shù)據(jù)

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();

執(zhí)行 清單 2 中的程序后,程序的執(zhí)行目錄中將出現(xiàn)一個(gè)名為 xmldata.xml 的文件。清單 3 解釋了新創(chuàng)建文件包含的內(nèi)容。

清單 3. 生成的 XML 數(shù)據(jù)

<?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>

您可以通過(guò)網(wǎng)絡(luò)將 清單 3 中的文件傳輸給等待狀態(tài)中的客戶機(jī) — 使用 Java 技術(shù)即可創(chuàng)建。清單 4 展示了一個(gè)簡(jiǎn)單的例子。

清單 4. 跨越網(wǎng)絡(luò)傳輸文件

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 中的代碼創(chuàng)建了一個(gè)長(zhǎng)度緩沖區(qū) BUFFER_SIZE。 BUFFER_SIZE 常量的值可以是 1024 或更高。通過(guò)調(diào)用 inputFile.read() 方法將輸入文件(xmldata.xml)的內(nèi)容讀取到緩沖區(qū)中。進(jìn)行緩沖之后,output.write() 方法將文件數(shù)據(jù)寫(xiě)入到 OutputStream 對(duì)象的套接字中。***一步將數(shù)據(jù)通過(guò)網(wǎng)絡(luò)發(fā)送到等待中的客戶機(jī)中。這些功能居然只需要這么少的代碼!

接下來(lái),您需要使客戶機(jī)處理傳入的 XML 數(shù)據(jù)。

#p#

接收數(shù)據(jù)的 Java 客戶機(jī)獲得 XML 內(nèi)容(并不是 XML 文件)

客戶機(jī)如何接收 XML 數(shù)據(jù)?同樣,對(duì)于 Java 技術(shù)來(lái)說(shuō)這只是小事一樁。數(shù)據(jù)接收通過(guò)一個(gè)套接字對(duì)象完成。清單 5 展示的代碼將接收傳入的數(shù)據(jù)并將數(shù)據(jù)推入到 ArrayList 類(lèi)的對(duì)象中。

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

清單 5. 提取嵌入的 XML 數(shù)據(jù)

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();

通過(guò)一個(gè)有限循環(huán) while (true),您可以確定期望的到來(lái)數(shù)據(jù)項(xiàng)的數(shù)量。該代碼將一直執(zhí)行循環(huán),直到接收到***一個(gè)數(shù)據(jù)項(xiàng),此時(shí)將拋出一個(gè)異常(ArrayIndexOutOfBoundsException)。您必須使用這種異常機(jī)制,除非客戶機(jī)已經(jīng)了解期望的數(shù)據(jù)項(xiàng)數(shù)量。

從 InputStream 對(duì)象接收的 XML 數(shù)據(jù)被保存在 ArrayList 類(lèi)的一個(gè)對(duì)象中。該類(lèi)對(duì)于此類(lèi)應(yīng)用程序非常有用。完成類(lèi)定義之后,ArrayList 具有一個(gè)特定的容量,總是匹配底層列表的大小。 在添加元素時(shí),ArrayList 對(duì)象的容量將自動(dòng)擴(kuò)展。因此,您無(wú)需擔(dān)心會(huì)超過(guò)數(shù)組的極限,因?yàn)樵擃?lèi)將為您處理這一問(wèn)題。

此時(shí),客戶機(jī)具有 清單 1 中數(shù)據(jù)的副本。客戶機(jī)現(xiàn)在可以將帶寬元素修改為所需的值,然后反向執(zhí)行文件傳輸過(guò)程,從客戶機(jī)發(fā)送到服務(wù)器。通過(guò)將 XML 文件 從服務(wù)器移動(dòng)到客戶機(jī),客戶機(jī)實(shí)際上使用了這一服務(wù)。更新后的數(shù)據(jù)被發(fā)送回服務(wù)器以完成事務(wù)。當(dāng)然,服務(wù)提供商必須驗(yàn)證傳入的數(shù)據(jù)并提供所需的帶寬更改。

本文描述的這種模式首先將一個(gè) XML 文件通過(guò)網(wǎng)絡(luò)傳輸?shù)娇蛻魴C(jī)??蛻魴C(jī)將文件數(shù)據(jù)作為流進(jìn)行接收,然后將其解析為一個(gè)內(nèi)存駐留對(duì)象??蛻魴C(jī)隨后對(duì)內(nèi)存駐留對(duì)象進(jìn)行更改,然后反向執(zhí)行傳輸過(guò)程,將對(duì)象發(fā)回到服務(wù)器。

還存在一種服務(wù),其中 XML 數(shù)據(jù)被完整無(wú)缺地從服務(wù)器傳輸?shù)娇蛻魴C(jī)。這種場(chǎng)景中,客戶機(jī)使用某種形式的文件傳輸協(xié)議(例如 FTP)獲得完整的文件副本。由于文件傳輸是一種標(biāo)準(zhǔn)技術(shù),這里不作過(guò)多介紹,您只需了解客戶機(jī)將下載 清單 1 中服務(wù)配置數(shù)據(jù)的一個(gè)文件副本。此時(shí),客戶機(jī)需要解析并修改文件,然后傳輸回服務(wù)器,這種模式的工作原理是什么?

#p#

一種基于 XML 文件的 Java 機(jī)制

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

清單 6. dom4j 處理 XML 數(shù)據(jù)

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()。當(dāng)我運(yùn)行經(jīng)過(guò)編譯的類(lèi)時(shí),我獲得了如 清單 7 所示的輸出。如果您希望親自運(yùn)行代碼,請(qǐng)確保下載、安裝 dom4j 副本,并添加到 CLASSPATH 中(***一步就是將相應(yīng)的 JAR 文件添加到您的 CLASSPATH 變量中)。然后,編譯 ProcessEventXml.java 文件并使用以下命令運(yùn)行程序:

java ProcessEventXml ServiceDefinition.xml

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

java ProcessEventXml ServiceDefinition.xml
Josephine Bloggs Internet 1mbps 1Gbyte 95

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

您的基于文件的客戶機(jī)現(xiàn)在已經(jīng)成功訪問(wèn)了 XML 數(shù)據(jù)??蛻魴C(jī)可以根據(jù)需要修改數(shù)據(jù)并編寫(xiě)新的 XML 文件。然后將其傳輸回服務(wù)器進(jìn)行處理。像上文一樣,客戶機(jī)在這一過(guò)程中使用了該服務(wù)。

【編輯推薦】

  1. 在ASP.NET中使用Treeview控件和XML
  2. 用XML和XSL來(lái)生成動(dòng)態(tài)頁(yè)面
  3. 如何利用Scala簡(jiǎn)化XML處理
責(zé)任編輯:楊鵬飛 來(lái)源: IBM
相關(guān)推薦

2015-03-18 09:21:53

編程Java死鎖

2010-09-28 14:27:35

SQL定義Xml

2009-08-05 16:32:25

Smooks 1.2框

2011-07-05 10:20:38

java

2013-06-08 12:49:03

Android開(kāi)發(fā)XML定義菜單

2011-03-21 09:16:52

2011-07-25 16:31:51

iOS XML 文件

2009-01-03 14:39:00

ibmdwXML

2009-02-26 13:35:10

XMLSAXParserJDOM

2009-09-09 18:00:55

C# XML編程

2009-09-09 18:20:29

C# XML編程

2013-04-07 10:01:26

Java異常處理

2013-04-01 14:35:10

Android開(kāi)發(fā)Android自定義x

2009-06-22 14:26:12

ScalaXML對(duì)象

2009-02-05 17:28:01

ScalaFriendFeedXML

2009-08-25 11:10:20

C#編程實(shí)現(xiàn)顯示XML

2009-01-18 11:45:16

PHPXML網(wǎng)站編程

2013-06-08 17:35:46

Android開(kāi)發(fā)移動(dòng)開(kāi)發(fā)XML自定義菜單

2009-01-03 14:54:40

ibmdwXML

2009-06-10 21:51:42

JavaScript XMLFirefox
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)