|
本系列文章的 第 1 部分 向 Java 技术的程序员介绍了 JavaFX Script 编程语言的语法和语义。接下来的 第 2 部分 演示了如何使用 Java 的远程方法调用(RMI)技术利用助手类实现简单的客户机-服务器连接。
RMI 是一个很好的原始工具,但是在真实世界的使用中它确实有一些局限性。在 Internet 上创建客户机-服务器工具更加常见的解决方案是利用针对服务架构(SOA),例如 用于 XML Web 服务的 Java API (JAX-WS)。本文将采用本系列前一篇文章向您展示的如何使用 RMI 的相同方式,利用 JAX-WS2.1 使用 JavaFX Script 如何访问 web 服务。
使用 NetBeans IDE 5.5.1 导出一个服务器类作为 Web 服务
由使用 JAX-WS 2.1 创建一个简单 web 服务开始这个任务。你首先需要一个类,它包含了一个或多个您希望导出 web 服务的方法 。为了简单起见,你可以使用该系列文章第 2 部分中的服务器代码,如代码示例 1 所示:
代码示例1
package server;
import java.io.*;
public class ServerImpl {
private String name;
public ServerImpl() {
super();
}
public String ping(String s) {
return "Hello " + s;
}
}
|
为了导出这个方法,你需要做两件事情:添加一个导入 javax.jws.WebService 包的语句,以及在开始处添加 @WebService 注释,告诉 Java 解释器你打算把这个类的方法发布为一个 web 服务。这些新增的代码在代码示例 2 中以粗体显示:
代码示例2
package server;
import java.io.*;
import javax.jws.WebService;
@WebService
public class ServerImpl {
private String name;
public ServerImpl() {
super();
}
public String ping(String s) {
return "Hello " + s;
}
}
|
这时,就可以将 web 服务发布到应用服务器上。本文讨论如何在 NetBeans IDE 5.5.1 中发布 web 服务。如果你想在 Java SE 6 平台中在 IDE 之外,使用内嵌的服务器创建 web 服务,那么可以浏览这篇文章 《 在 Java SE 6 平台上的 JAX-WS 2.0 介绍,第 1 部分》 。
- 选择 File > New Project 选项。应该可以看到如图 1 所示的对话框:
图 1. NetBeans IDE 5.5.1 NewProject 对话框
|
- 在 Categories 栏中,选择 Web。在 Projects 子窗口中,选择 Web Application。单击 Next 按钮,应该看到如图 2 所示页面:
图 2. New Web Application 对话框
|
- 在 Project Name 字段中,键入
WebServiceExample。注意将 web 应用程序的上下文根改为同样的名字。另外,如果 Set Source Level to 1.4 是选中状态,则取消对其选择源代码的级别必须是 1.5 或者更高,这样才能把 web 服务添加到项目中。最后,单击 Finish 按钮。如果不小心点击了 Next 按钮,NetBeans IDE 会向您提供选择不同的框架。只需忽略这些框架,按下 Finish 按钮即可。
此时对话框应该关闭,你应该看到 WebServiceExample 项目被添加到了左上方的 Projects 子窗口中,如图 3 所示:
图 3. 包含 WebServiceExample 项目的 NetBeans IDE 5.5.1 Projects 子窗口
|
- 接下来,左键单击 WebServiceExample 项目的名称以选中。也就是,单击左侧图标为小地球的根节点。右键单击,然后选择 New -> Web Service...... 应该可以看到如图 4 所示的对话框:
图 4. New Web Application 对话框
|
- 在 Web Service Name 字段中,键入
ExampleService。在 Package 字段中,键入 ws。选中 Create an Empty Web Servie 单选按钮,单击 Finish 按钮。NetBeans IDE 将会产生空的 web 服务源代码。
假如使用 JAX-WS 2.0,您也许会注意到 NetBeans IDE 创建的注释比本文前面介绍的 @WebService 注释稍微复杂一些。请不用担心 —— 这些参数和附加注释将帮助您完善 Java SE 6 或 JAX-WS 2.0 发布 web 服务的方式。然而,功能与默认的仍旧一致。
- 更改类的源代码以便和代码示例 3 相匹配。
代码示例3
/*
* ExampleService.java
*
* Created on August 17, 2007, 2:03 PM
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package ws;
import java.io.*;
import javax.jws.WebService;
@WebService
public class ExampleService {
private String name;
public ExampleService() {
super();
}
public String ping(String s) {
return "Hello " + s;
}
}
|
- 要部署本示例,在 Projects 子窗口中再次右键单击 WebServiceExample,如图 3 所示,这次选择 Deploy Project 菜单项。这将会启动应用服务器,编译 web 服务,并部署它。当一切成功完成时,打开浏览器,输入如下的地址:
http://localhost:8084/WebServiceExample/ExampleService
注意 NetBeans IDE 5.5.1 默认的应用服务器是 Apache Tomcat,其默认的部署端口是 8084,并不是许多 web 服务器使用的 8080。浏览器设置为本地主机 URL 后,应该在 web 浏览器中看到类似图 5 的表格,表示 web 服务处于活动状态。
图 5. 运行在本地计算机上的示例 Web 服务
|
您还可以单击链接,显示 web 服务的 Web Service Definition Language(WSDL)文件。如果您不理解该 WSDL 文件的内容,也不必为此而担心。完成本指南并不需要理解它。
|
WSDL 是什么?
Web 服务定义语言 ( WSDL,经常拼为 “whiz-dull” ) 文件是创建可以与 web 服务通信的客户机的工具。WSDL 描述了 web 服务的公共接口。它是一个为协议而提供的基于 XML 的服务描述,以及要求与其目录中列出的 web 服务相交互的消息格式。所支持的操作和消息被抽象地描述,并被绑定到具体网络协议和消息格式。
|
使用 GlassFish 服务器或者 Sun Java 系统应用服务器 9
如果你想使用 GlassFish 服务器或者 Sun Java 系统应用服务器 9 (SJSAS 9) 代替默认的 Tomcat 服务器,请确保已经事先在 NetBeans IDE 中下载、安装并注册了该服务器。在 本篇出色的文章 后面的部分,你可以找到如何逐步设置 GlassFish 服务器的说明。针对本文的目的,是保证在 New Web Applications 对话框的 Server 字段中指定合适的应用服务器,如图 2 所示。注意默认的端口根据应用服务器的不同而不同。要了解更多细节,请查看应用服务器的文档。
在 NetBeans IDE 5.5.1 中创建一个 JavaFX Web 服务客户机
此时,你可以在 NetBeans IDE 5.5.1 中执行下面的步骤,创建 web 服务客户机的库。当创建客户机时,无论你使用 Java SE 6 mini-web 服务器、与 NetBeans IDE 绑定的 Tomcat 服务器,还是 SJSAS 9 或者 GlassFish 服务器都没有关系。然而,服务器 一定要在运行中 ,以便让 NetBeans IDE 5.5.1 可以访问 WSDL 文件。
- 选择 File > New Project 选项。你应该看到类似图 6 的对话框。从 Projects 类别中选择 Java Class Library,单击 Next 按钮。
图 6. 创建一个新的 Java 项目
|
- 在 Project Name 字段中,键入
JavaFXWebServiceClient,如图 7 所示。注意,在 NetBeans IDE 5.5 中有一个缺陷,可能会阻止您在项目文件中创建路径包含空格的 web 服务客户机。所以,例如,路径不能是 C:\Documents and Settings\...。然后单击 Finish 按钮。
图 7. 创建一个新的 Java 类库
|
- 这将会在 Projects 子窗口中创建一个 JavaFXWebServiceClient 项目,如先前图 3 所示。右键单击项目节点,选择 New -> Web Service Client 选项。选择 WSDL 作为 Project 的位置,单击 Project 条目字段右边的 Browse 按钮。您应该可以看到图 8 中所示的对话框:
图 8. 浏览在 WebServicesExample 项目中的 Web 服务
|
- 浏览您希望使用的 web 服务。选择 web 服务 ExampleService,并单击 OK 按钮。然后您将会看到图 9 所示的对话框。注意,你还可以手动指定一个本地文件或者 WSDL 位置的 URL。
图 9. 新的 Web 服务客户机对话框
|
- 在 Package 字段中键入
ws,单击 Finish 按钮。Projects 子窗口显示新的 web 服务客户机,如图 10 所示。
图 10. 在 Projects 子窗口中的新的 Web 服务客户机项目
|
- 接下来,在
ws 包里创建一个称作 ConnectionHelper 的 Java 文件,如代码示例 4 所示。
代码示例4
package ws;
public class ConnectionHelper {
public static ws.ExampleService getWSConnection() {
try {
ws.ExampleServiceService service = new ws.ExampleServiceService();
return service.getExampleServicePort();
} catch (Exception ex) {
// TODO handle custom exceptions here
}
return null;
}
}
|
- 你可以重用在 本系列第二部分 中的相同 JavaFX Script 代码,以同样的方式创建一个称作
ws.MyClient.fx 的文件。也就是,在 ws 包上左键单击,选择 New→JavaFX File,打开图 11 所示的对话框。
图 11. 创建一个新的 JavaFX Script 文件
|
- 事实上,唯一的变化是对
ConnectionHelper 类的静态 getWSConnection() 方法的调用,以及显示的文本。代码示例 5 给出了源代码,变化使用粗体标出。
代码示例5
import java.lang.*;
import javafx.ui.*;
import java.rmi.*;
import ws.ExampleService;
import ws.ConnectionHelper;
class ButtonClickModel {
attribute numClicks: Number;
}
var model = new ButtonClickModel();
var win = Frame {
width: 200
content: GridPanel {
border: EmptyBorder {
top: 30
left: 30
bottom: 30
right: 30
}
rows: 3
columns: 1
vgap: 10
cells:
[ Button {
text: "Click to make Web Services connection!"
mnemonic: I
action: operation() {
do { // Do statements are executed off the EDT
try {
var remoteServer:ExampleService =
ConnectionHelper.getWSConnection();
var results = remoteServer.ping("Test");
System.out.println("response: {results}");
model.numClicks++;
} catch (e:Exception) {
System.out.println("exception: {e}");
}
}
}
},
Label {
text: bind "Number of WS connections: {model.numClicks}"
}
]
}
visible: true
};
|
- 使用 本系列第 2 部分中 同样的步骤修改
JavaFXWebServiceClient 属性以便在执行项目时运行 JavaFX Script 客户机。步骤如下:
- 在 Project 窗口中,右键单击项目节点,选择 Properties 选项。
- 在 Properties 对话框的 Categories 面板中选择 Run 选项。
- 确保引用的 Main Class 是
net.java.javafx.FXShell。
- 在 Arguments 字段中输入脚本的名称
ws.MyClient。并单击 OK 按钮。
作为参考,图 12 显示了 Project Properties 对话框的 Run 类别的屏幕截图。
图 12. Project Properties 对话框的 Run 类别
|
- 最后,右键单击项目节点,然后选择“Run Project”。输出窗口现在应该如图 13 所示。
图 13. 运行 JavaFX Script Web 服务客户机项目
|
此时,对于 JavaFX 脚本如何与 NetBeans IDE 5.5.1 结合使用以达到与服务器跨网络通信,无论是通过 JAX-WS 2.1,还是 RMI,你都应该有一个深入的理解了。如果你想了解更多利用 JavaFX Script 创建 GUI 的信息,可以参考本文 更多详细信息 部分中针对 Swing 程序员的教程。另外,记住 JavaFX 规范仍然在开发中,因此语言的参数可能不时会发生改变。请参看 OpenJFX 和 OpenJFX Compiler 网站获得最新的消息。
更多详细信息
|