本系列文章的第一部分向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
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 package server;
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 import java.io.*;
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 public class ServerImpl ...{
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 private String name;
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 public ServerImpl() ...{
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 super();
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 }
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 public String ping(String s) ...{
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 return "Hello " + s;
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 }
為了導出這個方法,你需要做兩件事情:添加一個導入javax.jws.WebService的語句;以及在開始處增加@WebService注釋,告訴Java解釋器你打算把這個類的方法釋出為一個web服務。這些新增的代碼在代碼示例2中粗體顯示:
Code Example 2
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 import javax.jws.WebService;
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 @WebService
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 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
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 /**//*
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 * ExampleService.java
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 *
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 * Created on August 17, 2007, 2:03 PM
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 * To change this template, choose Tools | Template Manager
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 * and open the template in the editor.
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 */
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 package ws;
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 public class ExampleService ...{
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 public ExampleService() ...{
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 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)
在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,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 public class ConnectionHelper ...{
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 public static ws.ExampleService getWSConnection() ...{
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 try ...{
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 ws.ExampleServiceService service = new ws.ExampleServiceService();
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 return service.getExampleServicePort();
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 } catch (Exception ex) ...{
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 // TODO handle custom exceptions here
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 }
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 return null;
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 }
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 你可以重用本系列第二部分中同樣的JavaFX Script代碼,以同樣的方式建立一個名為ws.MyClient.fx的檔案。即,在ws包上點選右鍵,選擇New→JavaFX File打開圖11所示的對話框。
圖11 建立一個新的JavaFX Script檔案
事實上,唯一的變化是對ConnectionHelper類的靜态getWSConnection()方法的調用,以及顯示的文本。代碼示例5給出了源代碼,變化使用粗體标出。
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 import java.lang.*;
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 import javafx.ui.*;
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 import java.rmi.*;
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 import ws.ExampleService;
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 import ws.ConnectionHelper;
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 class ButtonClickModel ...{
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 attribute numClicks: Number;
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 var model = new ButtonClickModel();
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 var win = Frame ...{
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 width: 200
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 content: GridPanel ...{
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 border: EmptyBorder ...{
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 top: 30
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 left: 30
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 bottom: 30
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 right: 30
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 rows: 3
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 columns: 1
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 vgap: 10
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 cells:
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 [ Button ...{
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 text: "Click to make Web Services connection!"
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 mnemonic: I
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 action: operation() ...{
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 do ...{ // Do statements are executed off the EDT
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 try ...{
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 var remoteServer:ExampleService =
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 ConnectionHelper.getWSConnection();
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 var results = remoteServer.ping("Test");
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 System.out.println("response: {results}");
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 model.numClicks++;
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 } catch (e:Exception) ...{
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 System.out.println("exception: {e}");
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 }
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 }
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 }
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 },
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 Label ...{
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 text: bind "Number of WS connections: {model.numClicks}"
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 }
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 ]
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 visible: true
學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信 };
使用本系列第二部分中同樣的步驟修改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服務用戶端項目
For More Information
<a href="http://java.sun.com/developer/technicalArticles/scripting/javafxpart1/">Learning JavaFX Script, Part 1: An Introduction to JavaFX Script for Java Programmers.</a>
<a href="http://java.sun.com/developer/technicalArticles/scripting/javafxpart2/">Learning JavaFX Script, Part 2: Remote Communication Using RMI</a>