java

位置:IT落伍者 >> java >> 浏览文章

JavaFX HTTP网络和XML分析


发布日期:2024年04月23日
 
JavaFX HTTP网络和XML分析

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反应的客户端是多么简单的事情这是个简单的例子但是通过添加其他特征可以进行延展例如连接一个站点或是检索图片

上一篇:Java 与Ruby on Rails对接

下一篇:Flex与java交互之数据库数据读取