天天看點

學習JavaFX Script,第三部分:使用JAX-WS進行用戶端-伺服器通信

        本系列文章的第一部分向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>