JavaFX的重点是在客户端,目的是提高Java GUI的外观和感觉这样使用户体验更有吸引力的用户界面。当然,许多用户的应用程序需要用远程服务器来交互信息。如今,HTTP协议和XML作为交互信息 的最佳选择而被普遍接受,所以我们想要去展示的是在JavaFX中处理HTTP交流细节是多么简单的事情,并且展示我们如何从一个XML数据结构中分析和提取信息的。
在本文中我们假设你已经熟悉了JavaFX语言的基本概念。
JavaFX基础语言概念
虽然是一个汇编语言,JavaFX混合了一些从Java继承下来的脚本语言的特征。脚本语言用于快速简洁的应用程序开发,而JavaFX基于Java所继承的特征使它成为一个更全面的语言。
JavaFX提出了一个新的编码模式:作为一个声明语言,它迫使我们去描述我们是多么的想要应用程序在没有描述特定的控制流下工作的,尽管我们 用必要的语言来做这样的事情。当我们需要开发GUI的时候这个模式是真的很强大。基本的想法就是在JavaFX GUI开发模式的背后是你要“describe” 你的用户界面是什么样子的。在代码和"visual structure."之间有严格的关系。此外,在代码中,用于声明对象的命令反应了用于展现他们的命令。总体的结果就是它是一个简洁的方法用几行的代码 就能创建一个GUI。这使应用程序易于理解和维护。
另外一个JavaFX的有趣的特征就是它是一个静态类型语言,这就意味着每个变量的数据类型,函数等等被称为compile-time。针对这一特征的JavaFX 教程可以链接Resources section。
JavaFX HTTP & XML Package Overview
为了用HTTP协议和XML开发一个应用程序,JavaFX提供了一些包,如下:
· javafx.io.http for handling HTTP communication
· javafx.data.pull and javafx.data.xml for XML parsing
在Figure1中的图解显示了包括这些包的分类:
HTTP &JavaFX
处理HTTP协议时,我们在javafx.io.http 包中可以使用HttpRequest 类别。这个类别可以使异步HTTP请求到达支持HTTP协议的一台远程服务器中。目前支持HTTP方法有:
· GET
· POST
· PUT
· DELETE
这个类别在数据交换中是保持中立的,所以我们可以调用一台远程服务器并且发送我们想要发送的任何信息类型,只要我们可以提供一个OutputStream其中包括必须用POST 或是PUT HTTP方法发送的数据。
与每一个HTTP支持方法有关的HttpRequest操作有特定的循环周期。就HTTP GET 方法来说,我们关注在的是循环周期。对于其他的方法(POST, PUT, DELETE),循环周期是相同的。如果是HTTP GET 请求,循环周期如Figure 2所示:
Figure 2: HTTP GET method request lifecycle
正如以上我们所看到的,每一块循环周期的描述都被HttpRequest class的内部变量的特定值所定义。
关于每个变量的转换,有一个相应的方法叫做during the transition itself,这样我们能够控制和处理不同的在HTTP 循环周期的状态。这些方法都有相应变量的相同的名字,前缀用on。例如,我们想在请求连接到服务器时来追踪,就使用onConnecting函数。
是时候为我们的JavaFX客户端进行编码了。首先我们必须声明一个包括URL的变量:
def url : String = "http://www.java.net"; |
然后创建HTTP请求并且规定callback函数,当HTTP请求开始连接的时候可以呼叫。
HttpRequest { location: url; onConnecting: function() { java.lang.System.out.println("Connecting"); } }.enqueue(); |
注意生成这个请求的方法enqueue()。 现在我们想要读取反应部分。我们可以使用onInput 功能提供的InputStream。我们需要添加这条代码到客户端。
onInput: function(is: InputStream) { try { var responseSize : Integer = is.available(); java.lang.System.out.println("Response size {responseSize}"); } finally { is.close(); } } |
最后一步是处理在HTTP请求期间发生的任何的异常情况。HTTPRequest有一个功能叫做无论何时所发生的异常(whenever an exception occurs)。所以我们可以为客户端添加异常处理的代码。
onException: function(ex : Exception) { System.out.println("Error: {ex.getMessage()}"); } |
如果用NetBeans运行客户端,你可以看到类似Figure 3的输出:
Figure 3: Client log
在javafx.io.http包,中,有其他两个类别叫HttpHeaders 和 HttpStatus。第一个类别定义一组常量对应相应的HTTP header 值名字。第二个类别定义一组常量对应可能的HTTP 反应代码。
[1] [2] 下一页