JavaFX的重點是在客戶端目的是提高Java GUI的外觀和感覺這樣使用戶體驗更有吸引力的用戶界面當然許多用戶的應用程序需要用遠程服務器來交互信息如今HTTP協議和XML作為交互信息 的最佳選擇而被普遍接受所以我們想要去展示的是在JavaFX中處理HTTP交流細節是多麼簡單的事情並且展示我們如何從一個XML數據結構中分析和提取信息的
在本文中我們假設你已經熟悉了JavaFX語言的基本概念
JavaFX基礎語言概念
雖然是一個匯編語言JavaFX混合了一些從Java繼承下來的腳本語言的特征腳本語言用於快速簡潔的應用程序開發而JavaFX基於Java所繼承的特征使它成為一個更全面的語言
JavaFX提出了一個新的編碼模式作為一個聲明語言它迫使我們去描述我們是多麼的想要應用程序在沒有描述特定的控制流下工作的盡管我們 用必要的語言來做這樣的事情當我們需要開發GUI的時候這個模式是真的很強大基本的想法就是在JavaFX GUI開發模式的背後是你要describe 你的用戶界面是什麼樣子的在代碼和visual structure之間有嚴格的關系此外在代碼中用於聲明對象的命令反應了用於展現他們的命令總體的結果就是它是一個簡潔的方法用幾行的代碼 就能創建一個GUI這使應用程序易於理解和維護
另外一個JavaFX的有趣的特征就是它是一個靜態類型語言這就意味著每個變量的數據類型函數等等被稱為compiletime針對這一特征的JavaFX 教程可以鏈接Resources section
JavaFX HTTP & XML Package Overview
為了用HTTP協議和XML開發一個應用程序JavaFX提供了一些包如下
· javafxiohttp for handling HTTP communication
· javafxdatapull and javafxdataxml for XML parsing
在Figure中的圖解顯示了包括這些包的分類
HTTP &JavaFX
處理HTTP協議時我們在javafxiohttp 包中可以使用HttpRequest 類別這個類別可以使異步HTTP請求到達支持HTTP協議的一台遠程服務器中目前支持HTTP方法有
· GET
· POST
· PUT
· DELETE
這個類別在數據交換中是保持中立的所以我們可以調用一台遠程服務器並且發送我們想要發送的任何信息類型只要我們可以提供一個OutputStream其中包括必須用POST 或是PUT HTTP方法發送的數據
與每一個HTTP支持方法有關的HttpRequest操作有特定的循環周期就HTTP GET 方法來說我們關注在的是循環周期對於其他的方法(POST PUT DELETE)循環周期是相同的如果是HTTP GET 請求循環周期如Figure 所示
Figure : HTTP GET method request lifecycle
正如以上我們所看到的每一塊循環周期的描述都被HttpRequest class的內部變量的特定值所定義
關於每個變量的轉換有一個相應的方法叫做during the transition itself這樣我們能夠控制和處理不同的在HTTP 循環周期的狀態這些方法都有相應變量的相同的名字前綴用on例如我們想在請求連接到服務器時來追蹤就使用onConnecting函數
是時候為我們的JavaFX客戶端進行編碼了首先我們必須聲明一個包括URL的變量:
def url : String = ;
然後創建HTTP請求並且規定callback函數當HTTP請求開始連接的時候可以呼叫
HttpRequest { location: url;
onConnecting: function() {
javalangSystemoutprintln(Connecting);
}
}enqueue();
注意生成這個請求的方法enqueue() 現在我們想要讀取反應部分我們可以使用onInput 功能提供的InputStream我們需要添加這條代碼到客戶端
onInput: function(is: InputStream) { try {
var responseSize : Integer = isavailable();
javalangSystemoutprintln(Response size {responseSize});
}
finally {
isclose();
}
最後一步是處理在HTTP請求期間發生的任何的異常情況HTTPRequest有一個功能叫做無論何時所發生的異常(whenever an exception occurs)所以我們可以為客戶端添加異常處理的代碼
onException: function(ex : Exception) { Systemoutprintln(Error: {exgetMessage()});
如果用NetBeans運行客戶端你可以看到類似Figure 的輸出
Figure : Client log
在javafxiohttp包中有其他兩個類別叫HttpHeaders 和 HttpStatus第一個類別定義一組常量對應相應的HTTP header 值名字第二個類別定義一組常量對應可能的HTTP 反應代碼
XML API
正如我們所說的今天很多客戶端用一個XML模板來發送數據到HTTP 而且JavaFX提供了簡單解析XML文件的能力現在我們關注其他兩個包在Figure中所示
· javafxdataxml
· javafxdatapull
javafxdatapull包含了分析一個XML文件的類別同時javafxdataxml 包 定義了一些常量並且處理合格的名稱處理器是eventbased(類似SAX parser)並且支持兩個不同的數據格式
· XML
· JSON
本文我們關注在XML數據格式
PullParser class是JavaFX的文件分析器的核心可以接受用於控制分析器的許多屬性首先我們需要聲明一個我們想要分析的文件類型使用類別屬性documentType該字符串有兩個值
· PullParserXML 用於分析XML
· PullParserJSON 用於分析JSON
在聲明文件類型之後我們需要提供文件輸入去分析分析器接受一個輸入流以後我們會看到這是非常方便的當我們需要去分析一個來自HTTP 請求的XML文件為了聲明輸入流我們需要設置input變量的值
所以來創建一個PullParser的例子如下
parser = PullParser { documentType: PullParserXML;
input: xmlFileInputStream;
當分析器分析文件的時候它會產生一系列的條目我們需要執行一個callback函數來應對這些條目的發生這個callback 函數叫做onEvent而其在它本身中稍後我們會執行我們的邏輯來從文件中提取信息 函數簽名是onEvent(event : Event)Event類別屬於javafxdatapull包這個類別包括所有關於pullparsing條目而且可以用它來提取我們需要的信息作為在PullParser 定義中的值之一Type 聲明了條目的類型我們感興趣於一下類型的條目
· START_DOCUMENT: 這個條目在文件分析的開始時產生的
· START_ELEMENT: 這個條目是在分析器找到新的開始元素時產生的我們可以用這個條目來讀取元素屬性
· END_ELEMENT: 這個條目是在分析器找到最後的元素時產生的我們可以用它來讀取元素中的文本
· END_DOCUMENT: 這個條目是在分析器到達最後的文件時產生的
還有其他的條目用於JSON 文件;如果你感興趣可以看一看PullParser文件無論如何這裡有針對START_ELEMENT 和END_ELEMENT 條目反應的一個框架實施
onEvent: function(event : Event) { /* We start analyzing the different event types */
if (eventtype == PullParserSTART_ELEMENT) {
/* Here we implement our logic to handle the start element event
for example to extract the attribute values and so on */
}
else if (eventtype == PullParserEND_ELEMENT) {
/* Here we implement our logic to handle the end element */
}
在分析過程中一些錯誤也會產生我們可以管理他們只要檢查了被分析器所產生的條目類型 整合 HTTP & XML APIs
現在我們已經描述了這兩個API 該看一下最有趣的部分了 我們怎樣去整合所有的東西這樣我們才能編譯一個完整的XMLoverHTTP的客戶端這是非常有用的如果我們想要一個客戶端來用遠程服務器交互信息
讓我們假設JavaFX客戶端應用程序調用一個可以恢復XML文件的serlet結構如下
﹤?xml version= encoding=UTF?﹥
﹤data﹥
﹤person id=﹥
﹤name﹥Mikey﹤/name﹥
﹤surname﹥Mouse﹤/surname﹥
﹤/person﹥
﹤/data﹥
這個一個簡單的XML文件但是足夠達到示例的目的了我們的目標是為我們的客戶端連接到test serlet並且檢索XML內容然後分析它並且顯示提取的信息為了做到這一點我們需要改變HttpRequest函數onInput為了當我們開始 接收XML文件時也可以去分析它如何操作的代碼如下所示
onInput: function(is: InputStream) { try {
PullParser {
input: is;
onEvent: function (event : Event) {
// We handle the event
}
}parse();
}
finally {
isclose();
}
注意我們怎樣添加了PullParser到onInput函數而且我們設置了分析器輸入流到從HttpRequest接收的輸入流現在我們只需要處理以上所描述的條目
if (eventtype == PullParserSTART_ELEMENT and eventlevel == ) {
javalangSystemoutprintln(Start a new element {eventqnamename});
var qAttr : QName = QName {name : id};
var attVal : String = eventgetAttributeValue(qAttr);
javalangSystemoutprintln(Attribute ID value {attVal});
}
else if (eventtype == PullParserEND_ELEMENT) {
var nodeName : String = eventqnamename;
javalangSystemoutprintln(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 = eventtext;
javalangSystemoutprintln(Text {textVal});
}
}
一步步分析代碼是非常有用的在有PullParserSTART_ELEMENT條目的情況下我們使用eventlevel變量這個 告訴我們每個條目是在哪一個行發生的(從開始XML文件的根源)我們已經知道id屬性是在第一行所以我們只在這一行限制提取然後創建一個 QName目標設置名稱變化是根據屬性名稱然後我們應用該值
在PullParserEND_ELEMENT情況下我們想要提取節點內容為了做到這一點我們使用包括節點值的text變量
如果一切運行正常我們將會在項目控制台(console)中看到所分析的條目如Figure 所示
Figure HTTP request with XML parsing
結束語
在本文中我們探討了一些JavaFX的基本特點主要集中在兩個重要的方面XML and HTTP我們發現開發一個HTTP 請求和XML反應的客戶端是多麼簡單的事情這是個簡單的例子但是通過添加其他特征可以進行延展例如連接一個站點或是檢索圖片
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19264.html