原文地址:
http://java.sun.com/developer/technicalArticles/scripting/javafxpart3/
文章索引(Articles Index)
本系列文章的第一部分向Java开发者介绍了JavaFX Script语言的语法和语义。接下来的第二部分演示了如何使用Java的远程方法调用(RMI)技术利用助手类实现简单的客户端-服务器连接。
RMI是一个很好的原始工具,但是在真实世界的使用中它也具有自己的缺陷。在Internet上创建客户端-服务器工具的通常解决方案是利用面向服务架构(SOA),例如Java API for XML Web Services(JAX-WS)。本文将采用本系列前一篇文章向你展示如何使用RMI的方式,向你展示如何利用JAX-WS2.1使用JavaFX Script访问web服务。
使用NetBeans IDE 5.5.1导出一个服务器类作为Web服务(Exporting a Server Class as a Web Service Using NetBeans IDE 5.5.1)
由使用JAX-WS 2.1创建一个简单web服务开始这个任务。你首先需要一个类,它包含了一个或多个你希望导出为一个web服务的方法 。为了简单期间,你可以使用该系列文章第二部分中的服务器代码,如代码示例1所示:
Code Example 1
为了导出这个方法,你需要做两件事情:添加一个导入
javax.jws.WebService的语句;以及在开始处增加
@WebService注释,告诉Java解释器你打算把这个类的方法发布为一个web服务。这些新增的代码在代码示例2中粗体显示:
Code Example 2
这时,就可以将web服务发布到应用服务器上。本文讨论如何在NetBeans IDE 5.5.1中发布web服务。如果你想使用Java SE 6内嵌的服务器创建web服务,IDE除外,那么可以浏览这篇文章《
Introducing JAX-WS 2.0 With the Java SE 6 Platform, Part1》。
1、选择File→New Project,应该可以看到如图1所示的对话框:
图1 NetBeans IDE 5.5.1 NewProject对话框
2、在Categories栏中,选择Web。在Projects子窗口中,选择Web Application。点击Next,应该看到如图2所示页面:
图2 New Web Application对话框
3、在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子窗口
4、接下来,左键点击WebServiceExample项目的名称以选中。也就是,点击左侧的图标为小地球的根节点。右键点击,选择New→Web Service...你应该看到如图4所示的对话框。
图4 New Web Service对话框
5、在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服务的方式。然而,功能和默认的仍旧是一致。
6、将类的源代码改为和代码示例3一样。
Code Example 3
7、部署这个例子,在Projects子窗口中再次右击WebServiceExample,如图3所示,这次选择Deploy Project菜单项。这将会启动应用服务器,编译web服务,并部署它。当一切完成时,打开浏览器,输入如下的地址:
http://localhost:8084/WebServiceExample/ExampleService
注意NetBeans IDE 5.5.1默认的应用服务器是Apache Tomcat,其默认发布端口是8084,并不是其他web服务器经常使用的8080。浏览器定位到这个URL后,应该在其中看到类似图5的表格,表示web服务处于活动状态。
图5 运行在本地计算机上的示例Web服务
你还可以点击链接显示web服务的Web Service Definition Language(WSDL)文件。不用担心,你是否可以理解该WSDL文件的内容。在完成本指南时,并不需要。
使用GlassFish服务器或者Sun Java System Application Server 9(Using the GlassFish Server or Sun Java System Application Server 9)
如果你想使用GlassFish服务器或者Sun Java System Application Server 9(SJSAS 9)代替默认的Tomcat服务器,请确保已经事先在NetBeans IDE中下载、安装并注册了该服务器。在 这篇出色的文章后面的部分,你可以找到如何逐步设置GlassFish服务器。针对本文的目的,是保证在New Web Application对话框的Server域中指定合适的应用服务器,如图2所示。注意默认的端口根据服务器的不同而不同。更多细节可以查看服务器的文档。
在NetBeans IDE 5.5.1中创建一个JavaFX Web Services客户端(Creating a JavaFX Web Services Client in NetBeans IDE 5.5.1)
此时,你可以在NetBeans IDE 5.5.1中执行下面的步骤,创建一个web服务客户端的类库。当创建客户端时,无论你使用Java SE 6 mini-web服务器、NetBeans IDE内置的Tomcat服务器,还是SJSAS 9 或者GlassFish服务器都没有关系。然而,服务器一定要在运行中,要让NetBeans IDE 5.5.1可以访问WSDL文件。
1、选择File→New Project。你应该看到类似图6的对话框。从Projects类别中选择Java Class Library,点击Next。
图6 创建一个新的Java项目
2、在Project Name域中,输入JavaFXWebServiceClient,如图7所示。注意,在NetBeans IDE 5.5中有一个bug,可能会阻止你在项目文件中创建路径包含空格的web服务客户端。所以,例如,路径不能是 C:/Documents and Settings/...然后点击Finish。
图7 创建一个新的Java类库
3、这将会在Projects子窗口中创建一个JavaFXWebServiceCilent项目,如先前图3所示。右键点击项目节点,选择New→Web Service Client。为了定位WSDL选择Project,点击Project域右边的Browse按钮。你应该看到类似图8的对话框。
图8 浏览在WebServicesExample项目中的Web服务
浏览你希望使用的web服务。选择web服务ExampleService,点击OK。你将会看到图9所示的对话框。注意,你可以手动指定一个本地文件或者WSDL位置的URL。
图9 New Web Service Client对话框
在Package域中输入ws,点击Finish。Projects子窗口显示新的web服务客户端,如图10所示。
图10 在Projects子窗口中的新的Web服务客户端项目
接着,在ws包里,创建一个名为ConnectionHelper的Java文件,如代码示例4所示。
Code Example 4
你可以重用本系列第二部分中同样的JavaFX Script代码,以同样的方式创建一个名为
ws.MyClient.fx的文件。即,在ws包上点击右键,选择New→JavaFX File打开图11所示的对话框。
图11 创建一个新的JavaFX Script文件
事实上,唯一的变化是对 ConnectionHelper类的静态 getWSConnection()方法的调用,以及显示的文本。代码示例5给出了源代码,变化使用粗体标出。
文章索引(Articles Index)
本系列文章的第一部分向Java开发者介绍了JavaFX Script语言的语法和语义。接下来的第二部分演示了如何使用Java的远程方法调用(RMI)技术利用助手类实现简单的客户端-服务器连接。
RMI是一个很好的原始工具,但是在真实世界的使用中它也具有自己的缺陷。在Internet上创建客户端-服务器工具的通常解决方案是利用面向服务架构(SOA),例如Java API for XML Web Services(JAX-WS)。本文将采用本系列前一篇文章向你展示如何使用RMI的方式,向你展示如何利用JAX-WS2.1使用JavaFX Script访问web服务。
使用NetBeans IDE 5.5.1导出一个服务器类作为Web服务(Exporting a Server Class as a Web Service Using NetBeans IDE 5.5.1)
由使用JAX-WS 2.1创建一个简单web服务开始这个任务。你首先需要一个类,它包含了一个或多个你希望导出为一个web服务的方法 。为了简单期间,你可以使用该系列文章第二部分中的服务器代码,如代码示例1所示:
Code Example 1
package
server;
import java.io. * ;
public class ServerImpl ... {
private String name;
public ServerImpl() ...{
super();
}
public String ping(String s) ...{
return "Hello " + s;
}
}
import java.io. * ;
public class ServerImpl ... {
private String name;
public ServerImpl() ...{
super();
}
public String ping(String s) ...{
return "Hello " + s;
}
}
Code Example 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;
}
}
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;
}
}
1、选择File→New Project,应该可以看到如图1所示的对话框:
图1 NetBeans IDE 5.5.1 NewProject对话框
2、在Categories栏中,选择Web。在Projects子窗口中,选择Web Application。点击Next,应该看到如图2所示页面:
图2 New Web Application对话框
3、在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子窗口
4、接下来,左键点击WebServiceExample项目的名称以选中。也就是,点击左侧的图标为小地球的根节点。右键点击,选择New→Web Service...你应该看到如图4所示的对话框。
图4 New Web Service对话框
5、在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服务的方式。然而,功能和默认的仍旧是一致。
6、将类的源代码改为和代码示例3一样。
Code Example 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;
}
}
* 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;
}
}
http://localhost:8084/WebServiceExample/ExampleService
注意NetBeans IDE 5.5.1默认的应用服务器是Apache Tomcat,其默认发布端口是8084,并不是其他web服务器经常使用的8080。浏览器定位到这个URL后,应该在其中看到类似图5的表格,表示web服务处于活动状态。
图5 运行在本地计算机上的示例Web服务
你还可以点击链接显示web服务的Web Service Definition Language(WSDL)文件。不用担心,你是否可以理解该WSDL文件的内容。在完成本指南时,并不需要。
使用GlassFish服务器或者Sun Java System Application Server 9(Using the GlassFish Server or Sun Java System Application Server 9)
如果你想使用GlassFish服务器或者Sun Java System Application Server 9(SJSAS 9)代替默认的Tomcat服务器,请确保已经事先在NetBeans IDE中下载、安装并注册了该服务器。在 这篇出色的文章后面的部分,你可以找到如何逐步设置GlassFish服务器。针对本文的目的,是保证在New Web Application对话框的Server域中指定合适的应用服务器,如图2所示。注意默认的端口根据服务器的不同而不同。更多细节可以查看服务器的文档。
在NetBeans IDE 5.5.1中创建一个JavaFX Web Services客户端(Creating a JavaFX Web Services Client in NetBeans IDE 5.5.1)
此时,你可以在NetBeans IDE 5.5.1中执行下面的步骤,创建一个web服务客户端的类库。当创建客户端时,无论你使用Java SE 6 mini-web服务器、NetBeans IDE内置的Tomcat服务器,还是SJSAS 9 或者GlassFish服务器都没有关系。然而,服务器一定要在运行中,要让NetBeans IDE 5.5.1可以访问WSDL文件。
1、选择File→New Project。你应该看到类似图6的对话框。从Projects类别中选择Java Class Library,点击Next。
图6 创建一个新的Java项目
2、在Project Name域中,输入JavaFXWebServiceClient,如图7所示。注意,在NetBeans IDE 5.5中有一个bug,可能会阻止你在项目文件中创建路径包含空格的web服务客户端。所以,例如,路径不能是 C:/Documents and Settings/...然后点击Finish。
图7 创建一个新的Java类库
3、这将会在Projects子窗口中创建一个JavaFXWebServiceCilent项目,如先前图3所示。右键点击项目节点,选择New→Web Service Client。为了定位WSDL选择Project,点击Project域右边的Browse按钮。你应该看到类似图8的对话框。
图8 浏览在WebServicesExample项目中的Web服务
浏览你希望使用的web服务。选择web服务ExampleService,点击OK。你将会看到图9所示的对话框。注意,你可以手动指定一个本地文件或者WSDL位置的URL。
图9 New Web Service Client对话框
在Package域中输入ws,点击Finish。Projects子窗口显示新的web服务客户端,如图10所示。
图10 在Projects子窗口中的新的Web服务客户端项目
接着,在ws包里,创建一个名为ConnectionHelper的Java文件,如代码示例4所示。
Code Example 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;
}
}
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;
}
}
图11 创建一个新的JavaFX Script文件
事实上,唯一的变化是对 ConnectionHelper类的静态 getWSConnection()方法的调用,以及显示的文本。代码示例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
} ;
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
} ;
使用本系列第二部分中同样的步骤修改JavaFXWebServiceClient属性,在执行项目是运行JavaFX Script客户端。步骤如下:
1、在Project窗口中,右键点击项目节点,选择Properties。
2、在Properties对话框的Categories面板中选择Run。
3、确保Main Class是net.java.javafx.FXShell。
4、在Argument域中输入脚本的名称,ws.MyClient。点击OK。
作为参考,图12是Project Properties对话框中Run的屏幕截图。
图12 Project Properties对话框中Run
最后,右键点击项目节点,选择Run Project。输出窗口应该如图13所示。
图13 运行JavaFX Script Web服务客户端项目
此时,你应该有一个完好的理解,对于如何在NetBeans IDE 5.5.1使用JavaFX Script与服务器跨网络通信,无论是通过JAX-WS 2.1,还是RMI。如果你想了解更多利用JavaFX Script创建GUI的信息,可以参考本文For More Information部分中针对Swing程序员的指南。另外,记住JavaFX规范仍然在开发中,因此过一段时间语言的参数可能会发生改变。可以参考OpenJFX和OpenJFX Compiler网站获得最新的消息。
For More Information
- Learning JavaFX Script, Part 1: An Introduction to JavaFX Script for Java Programmers.
- Learning JavaFX Script, Part 2: Remote Communication Using RMI
- Download the NetBeans IDE 5.5.1 JavaFXWebServiceClient project from this article.
- Download the NetBeans IDE 5.5.1 WebServiceExample project from this article.
- The OpenJFX Web Site -- The official site for JavaFX technology.
- The OpenJFX Compiler Web Site -- The OpenJFX Compiler will focus on creating a JavaFX compiler to translate JavaFX scripts into JVM class files.
- Getting Started With the JavaFX Script Language (for Swing Programmers) -- This excellent tutorial shows you how to use the graphical widgets in the JavaFX scripting language. Because many of these widgets map directly to the underlying Swing components, readers who are familiar with programming Swing will be able to read quickly through this document.
- JavaFX Script 2D Graphics Tutorial -- Similar to JavaFX Pad, this JNLP will help you learn to use the 2D graphics functionality inside JavaFX technology.
- The JavaFX Script Programming Language Reference -- The official reference for the programming language.
- Learning Curve Journals, Part 1: Exploring JavaFX Script -- This article by John O'Conner introduces the UI libraries in the JavaFX platform