自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

JavaFX HTTP網(wǎng)絡(luò)和XML分析

開(kāi)發(fā) 后端
本文展示了在JavaFX中處理HTTP交流以及從一個(gè)XML數(shù)據(jù)結(jié)構(gòu)中分析和提取信息的方法。JavaFX是一個(gè)匯編語(yǔ)言,不過(guò)由于其混合了一些從Java繼承下來(lái)的腳本語(yǔ)言的特征,使JavaFX成為了一個(gè)比較全面的語(yǔ)言。

JavaFX的重點(diǎn)是在客戶端,目的是提高Java GUI的外觀和感覺(jué)這樣使用戶體驗(yàn)更有吸引力的用戶界面。當(dāng)然,許多用戶的應(yīng)用程序需要用遠(yuǎn)程服務(wù)器來(lái)交互信息。如今,HTTP協(xié)議和XML作為交互信息 的***選擇而被普遍接受,所以我們想要去展示的是在JavaFX中處理HTTP交流細(xì)節(jié)是多么簡(jiǎn)單的事情,并且展示我們?nèi)绾螐囊粋€(gè)XML數(shù)據(jù)結(jié)構(gòu)中分析和提取信息的。

在本文中我們假設(shè)你已經(jīng)熟悉了JavaFX語(yǔ)言的基本概念。

JavaFX基礎(chǔ)語(yǔ)言概念

雖然是一個(gè)匯編語(yǔ)言,JavaFX混合了一些從Java繼承下來(lái)的腳本語(yǔ)言的特征。腳本語(yǔ)言用于快速簡(jiǎn)潔的應(yīng)用程序開(kāi)發(fā),而JavaFX基于Java所繼承的特征使它成為一個(gè)更全面的語(yǔ)言。

JavaFX提出了一個(gè)新的編碼模式:作為一個(gè)聲明語(yǔ)言,它迫使我們?nèi)ッ枋鑫覀兪嵌嗝吹南胍獞?yīng)用程序在沒(méi)有描述特定的控制流下工作的,盡管我們 用必要的語(yǔ)言來(lái)做這樣的事情。當(dāng)我們需要開(kāi)發(fā)GUI的時(shí)候這個(gè)模式是真的很強(qiáng)大?;镜南敕ň褪窃贘avaFX GUI開(kāi)發(fā)模式的背后是你要“describe” 你的用戶界面是什么樣子的。在代碼和"visual structure."之間有嚴(yán)格的關(guān)系。此外,在代碼中,用于聲明對(duì)象的命令反應(yīng)了用于展現(xiàn)他們的命令。總體的結(jié)果就是它是一個(gè)簡(jiǎn)潔的方法用幾行的代碼 就能創(chuàng)建一個(gè)GUI。這使應(yīng)用程序易于理解和維護(hù)。

另外一個(gè)JavaFX的有趣的特征就是它是一個(gè)靜態(tài)類型語(yǔ)言,這就意味著每個(gè)變量的數(shù)據(jù)類型,函數(shù)等等被稱為compile-time。針對(duì)這一特征的JavaFX 教程可以鏈接Resources section。

JavaFX HTTP & XML Package Overview

為了用HTTP協(xié)議和XML開(kāi)發(fā)一個(gè)應(yīng)用程序,JavaFX提供了一些包,如下:

· javafx.io.http for handling HTTP communication

· javafx.data.pull and javafx.data.xml for XML parsing

在Figure1中的圖解顯示了包括這些包的分類:

HTTP &JavaFX

處理HTTP協(xié)議時(shí),我們?cè)趈avafx.io.http 包中可以使用HttpRequest 類別。這個(gè)類別可以使異步HTTP請(qǐng)求到達(dá)支持HTTP協(xié)議的一臺(tái)遠(yuǎn)程服務(wù)器中。目前支持HTTP方法有:

· GET

· POST

· PUT

· DELETE

這個(gè)類別在數(shù)據(jù)交換中是保持中立的,所以我們可以調(diào)用一臺(tái)遠(yuǎn)程服務(wù)器并且發(fā)送我們想要發(fā)送的任何信息類型,只要我們可以提供一個(gè)OutputStream其中包括必須用POST 或是PUT HTTP方法發(fā)送的數(shù)據(jù)。

與每一個(gè)HTTP支持方法有關(guān)的HttpRequest操作有特定的循環(huán)周期。就HTTP GET 方法來(lái)說(shuō),我們關(guān)注在的是循環(huán)周期。對(duì)于其他的方法(POST, PUT, DELETE),循環(huán)周期是相同的。如果是HTTP GET 請(qǐng)求,循環(huán)周期如Figure 2所示:

Figure 2: HTTP GET method request lifecycle

正如以上我們所看到的,每一塊循環(huán)周期的描述都被HttpRequest class的內(nèi)部變量的特定值所定義。

關(guān)于每個(gè)變量的轉(zhuǎn)換,有一個(gè)相應(yīng)的方法叫做during the transition itself,這樣我們能夠控制和處理不同的在HTTP 循環(huán)周期的狀態(tài)。這些方法都有相應(yīng)變量的相同的名字,前綴用on。例如,我們想在請(qǐng)求連接到服務(wù)器時(shí)來(lái)追蹤,就使用onConnecting函數(shù)。

是時(shí)候?yàn)槲覀兊腏avaFX客戶端進(jìn)行編碼了。首先我們必須聲明一個(gè)包括URL的變量:

def url : String = "http://www.java.net";

然后創(chuàng)建HTTP請(qǐng)求并且規(guī)定callback函數(shù),當(dāng)HTTP請(qǐng)求開(kāi)始連接的時(shí)候可以呼叫。

HttpRequest { location: url;

onConnecting: function() {

java.lang.System.out.println("Connecting");

}

}.enqueue();

注意生成這個(gè)請(qǐng)求的方法enqueue()。 現(xiàn)在我們想要讀取反應(yīng)部分。我們可以使用onInput 功能提供的InputStream。我們需要添加這條代碼到客戶端。

onInput: function(is: InputStream) { try {

var responseSize : Integer = is.available();

java.lang.System.out.println("Response size {responseSize}");

}

finally {

is.close();

}

}

***一步是處理在HTTP請(qǐng)求期間發(fā)生的任何的異常情況。HTTPRequest有一個(gè)功能叫做無(wú)論何時(shí)所發(fā)生的異常(whenever an exception occurs)。所以我們可以為客戶端添加異常處理的代碼。

onException: function(ex : Exception) { System.out.println("Error: {ex.getMessage()}");

}

如果用NetBeans運(yùn)行客戶端,你可以看到類似Figure 3的輸出:

Figure 3: Client log

在javafx.io.http包,中,有其他兩個(gè)類別叫HttpHeaders 和 HttpStatus。***個(gè)類別定義一組常量對(duì)應(yīng)相應(yīng)的HTTP header 值名字。第二個(gè)類別定義一組常量對(duì)應(yīng)可能的HTTP 反應(yīng)代碼。

#p#

XML API

正如我們所說(shuō)的,今天很多客戶端用一個(gè)XML模板來(lái)發(fā)送數(shù)據(jù)到HTTP, 而且JavaFX提供了簡(jiǎn)單解析XML文件的能力。現(xiàn)在我們關(guān)注其他兩個(gè)包,在Figure1中所示:

· javafx.data.xml

· javafx.data.pull

javafx.data.pull包含了分析一個(gè)XML文件的類別,同時(shí)javafx.data.xml 包 定義了一些常量并且處理合格的名稱。處理器是event-based(類似SAX parser)并且支持兩個(gè)不同的數(shù)據(jù)格式:

· XML

· JSON

本文我們關(guān)注在XML數(shù)據(jù)格式。

PullParser class是JavaFX的文件分析器的核心,可以接受用于控制分析器的許多屬性。首先,我們需要聲明一個(gè)我們想要分析的文件類型,使用類別屬性documentType。該字符串有兩個(gè)值:

· PullParser.XML 用于分析XML

· PullParser.JSON 用于分析JSON

在聲明文件類型之后,我們需要提供文件輸入去分析。分析器接受一個(gè)輸入流,以后我們會(huì)看到,這是非常方便的當(dāng)我們需要去分析一個(gè)來(lái)自HTTP 請(qǐng)求的XML文件。為了聲明輸入流我們需要設(shè)置input變量的值。

所以來(lái)創(chuàng)建一個(gè)PullParser的例子,如下:

parser = PullParser { documentType: PullParser.XML;

input: xmlFileInputStream;

}

當(dāng)分析器分析文件的時(shí)候,它會(huì)產(chǎn)生一系列的條目。我們需要執(zhí)行一個(gè)callback函數(shù)來(lái)應(yīng)對(duì)這些條目的發(fā)生。這個(gè)callback 函數(shù)叫做onEvent,而其在它本身中,稍后我們會(huì)執(zhí)行我們的邏輯來(lái)從文件中提取信息。 函數(shù)簽名是onEvent(event : Event),Event類別屬于javafx.data.pull包。這個(gè)類別包括所有關(guān)于pull-parsing條目,而且可以用它來(lái)提取我們需要的信息。作為在PullParser 定義中的值之一,Type 聲明了條目的類型,我們感興趣于一下類型的條目:

· START_DOCUMENT: 這個(gè)條目在文件分析的開(kāi)始時(shí)產(chǎn)生的。

· START_ELEMENT: 這個(gè)條目是在分析器找到新的開(kāi)始元素時(shí)產(chǎn)生的。我們可以用這個(gè)條目來(lái)讀取元素屬性。

· END_ELEMENT: 這個(gè)條目是在分析器找到***的元素時(shí)產(chǎn)生的。我們可以用它來(lái)讀取元素中的文本。

· END_DOCUMENT: 這個(gè)條目是在分析器到達(dá)***的文件時(shí)產(chǎn)生的。

還有其他的條目用于JSON 文件;如果你感興趣,可以看一看PullParser文件。無(wú)論如何,這里有針對(duì)START_ELEMENT 和END_ELEMENT 條目反應(yīng)的一個(gè)框架實(shí)施:

onEvent: function(event : Event) { /* We start analyzing the different event types */

if (event.type == PullParser.START_ELEMENT) {

/* Here we implement our logic to handle the start element event,

for example to extract the attribute values and so on */

}

else if (event.type == PullParser.END_ELEMENT) {

/* Here we implement our logic to handle the end element */

}

}

在分析過(guò)程中,一些錯(cuò)誤也會(huì)產(chǎn)生。我們可以管理他們只要檢查了被分析器所產(chǎn)生的條目類型。 整合 HTTP & XML APIs

現(xiàn)在我們已經(jīng)描述了這兩個(gè)API, 該看一下最有趣的部分了: 我們?cè)鯓尤フ纤械臇|西這樣我們才能編譯一個(gè)完整的XML-over-HTTP的客戶端。這是非常有用的如果我們想要一個(gè)客戶端來(lái)用遠(yuǎn)程服務(wù)器交互信息。

讓我們假設(shè)JavaFX客戶端應(yīng)用程序調(diào)用一個(gè)可以恢復(fù)XML文件的serlet結(jié)構(gòu)如下:

﹤?xml version="1.0" encoding="UTF-8"?﹥
﹤data﹥
﹤person id="1"﹥
﹤name﹥Mikey﹤/name﹥
﹤surname﹥Mouse﹤/surname﹥
﹤/person﹥
﹤/data﹥

 

這個(gè)一個(gè)簡(jiǎn)單的XML文件,但是足夠達(dá)到示例的目的了。我們的目標(biāo)是為我們的客戶端連接到test serlet并且檢索XML內(nèi)容,然后分析它并且顯示提取的信息。為了做到這一點(diǎn),我們需要改變HttpRequest函數(shù)onInput為了當(dāng)我們開(kāi)始 接收XML文件時(shí)也可以去分析它。如何操作的代碼如下所示:

onInput: function(is: InputStream) { try {

PullParser {

input: is;

onEvent: function (event : Event) {

// We handle the event

}

}.parse();

}

finally {

is.close();

}

}

注意我們?cè)鯓犹砑恿薖ullParser到onInput函數(shù),而且我們?cè)O(shè)置了分析器輸入流到從HttpRequest接收的輸入流?,F(xiàn)在我們只需要處理以上所描述的條目:

.... if (event.type == PullParser.START_ELEMENT and event.level == 1) {

java.lang.System.out.println("Start a new element {event.qname.name}");

var qAttr : QName = QName {name : "id"};

var attVal : String = event.getAttributeValue(qAttr);

java.lang.System.out.println("Attribute ID value {attVal}");

}

else if (event.type == PullParser.END_ELEMENT) {

var nodeName : String = event.qname.name;

java.lang.System.out.println("End element {nodeName}");

// Now we extract the text only if the node is name or surname

if (nodeName == "name" or nodeName == "surname") {

var textVal : String = event.text;

java.lang.System.out.println("Text {textVal}");

}

}

....

一步步分析代碼是非常有用的。在有PullParser.START_ELEMENT條目的情況下,我們使用event.level變量。這個(gè) 告訴我們每個(gè)條目是在哪一個(gè)行發(fā)生的(從0開(kāi)始,XML文件的根源)。我們已經(jīng)知道id屬性是在***行,所以我們只在這一行限制提取。然后創(chuàng)建一個(gè) QName目標(biāo)設(shè)置,名稱變化是根據(jù)屬性名稱,然后我們應(yīng)用該值。

在PullParser.END_ELEMENT情況下,我們想要提取節(jié)點(diǎn)內(nèi)容。為了做到這一點(diǎn),我們使用包括節(jié)點(diǎn)值的text變量。

如果一切運(yùn)行正常,我們將會(huì)在項(xiàng)目控制臺(tái)(console)中看到所分析的條目,如Figure 4.所示:

Figure 4. HTTP request with XML parsing

結(jié)束語(yǔ)

在本文中,我們探討了一些JavaFX的基本特點(diǎn),主要集中在兩個(gè)重要的方面:XML and HTTP。我們發(fā)現(xiàn)開(kāi)發(fā)一個(gè)HTTP 請(qǐng)求和XML反應(yīng)的客戶端是多么簡(jiǎn)單的事情。這是個(gè)簡(jiǎn)單的例子,但是通過(guò)添加其他特征可以進(jìn)行延展,例如,連接一個(gè)站點(diǎn)或是檢索圖片。

【編輯推薦】

  1. JavaFX應(yīng)用問(wèn)題解答
  2. 使用 JavaFX Script 創(chuàng)建富應(yīng)用程序
  3. 淺談Java和JavaFX之間的互操作性
責(zé)任編輯:yangsai 來(lái)源: IT專家網(wǎng)
相關(guān)推薦

2010-09-10 15:04:40

SOAP HTTP

2009-09-21 18:00:49

Hibernate X

2015-10-27 13:37:14

瀏覽器HTTP緩存

2012-03-01 10:33:42

JavaJavaFX

2009-09-16 15:41:45

LINQ查詢XML文檔

2024-11-11 11:59:09

Rust網(wǎng)絡(luò)工具

2009-04-01 13:26:08

JavaFXFlexSilverlight

2011-05-24 14:50:44

組網(wǎng)PTN

2010-07-12 10:12:39

ibmdwXML

2015-09-15 13:48:01

網(wǎng)絡(luò)協(xié)議HTTP Client

2011-06-10 12:44:09

2017-04-10 20:21:39

Go語(yǔ)言源碼分析Handler

2017-04-10 13:26:06

Go語(yǔ)言源碼

2009-11-20 13:11:44

Oracle XML數(shù)

2010-09-09 13:12:29

XML DOM

2015-02-09 10:33:44

2009-11-17 18:44:44

2010-07-29 09:18:25

JavaFXFlexSilverlight

2009-09-14 16:21:34

LINQ To XML

2015-07-09 09:23:19

HTTP流量Ubuntu15.04Webalizer
點(diǎn)贊
收藏

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