監(jiān)理公司管理系統(tǒng) | 工程企業(yè)管理系統(tǒng) | OA系統(tǒng) | ERP系統(tǒng) | 造價咨詢管理系統(tǒng) | 工程設(shè)計管理系統(tǒng) | 甲方項目管理系統(tǒng) | 簽約案例 | 客戶案例 | 在線試用
X 關(guān)閉

Java Web Services的遠端調(diào)用

申請免費試用、咨詢電話:400-8352-114

AMTeam.org

Java Web Services的遠端調(diào)用

微軟公司提出.Net概念后很快就被認為是以后網(wǎng)絡(luò)服務(wù)的發(fā)展方向,其中的Web service概念更被認為是將來的工業(yè)標準(其中的SOAP、WSDL、UDDI已經(jīng)是標準了)。而作為微軟公司的老對手SUN公司自然不甘心落后,不久就開發(fā)了SUN-ONE(Sun[tm] Open Net Environment)用來開發(fā)Web Services,并提供了Java WSDP(Java Web Services Developer Pack)工具包。

Web Services簡單的來說就是網(wǎng)絡(luò)服務(wù),譬如一個商業(yè)客戶在網(wǎng)絡(luò)上通過SOAP協(xié)議發(fā)送一個請求,服務(wù)端接收這個請求并處理它,然后發(fā)送一個響應(yīng)給客戶端。Web Service程序在服務(wù)端需要用容器配置,這個容器可以是一個Servlet容器,如:Tomcat或者是基于EJB之上的J2EE 容器。Web Service還用WSDL(Web Service Description Language)描述自己,這種描述包括Web Service的名字、可以被調(diào)用的方法名、這些方法的參數(shù)以及發(fā)送請求的位置等,這樣用戶就可以方便地通過WSDL去發(fā)現(xiàn)Web Service并取得服務(wù),然后利用Java API for XML-based RPC(JAX-RPC)實現(xiàn)對Web Service的調(diào)用。

舉一個典型的例子,如有個商家想訂購商品,他可以直接到去每一家供貨商詢問,但有一個方便的方法是通過UDDI(Universal Description,Discovery and Integration)注冊中心去查找供貨商,發(fā)現(xiàn)哪些才是自己要找的供貨商。因為供貨商在注冊中心注冊他們的Web Service,這樣就能被網(wǎng)絡(luò)潛在的客戶所發(fā)現(xiàn)。

JAX-RPC中有一個工具:xrpcc,它可以根據(jù)WSDL產(chǎn)生一個stub類作為客戶端的代理,以及一個tie類作為服務(wù)端的代理。JAX-RPC將客戶端調(diào)用轉(zhuǎn)換成一個基于HTTP請求的SOAP消息發(fā)送給服務(wù)器,服務(wù)器收到客戶請求,把SOAP消息轉(zhuǎn)換成方法調(diào)用并調(diào)用服務(wù)器的Web Service方法,再通過JAX-RPC將結(jié)果包裝成SOAP消息形式返回給客戶。

用JAX-RPC開發(fā)Web Service非常的容易。一個Web Service有兩個文件:一個是接口,用來定義Web Service的遠端可以調(diào)用的方法;另外一個實現(xiàn)了這個接口方法的類。

如定義了Web Service方法的接口:

package coffees;


import java.rmi.Remote;

import java.rmi.RemoteException;


public interface CoffeeOrderIF extends Remote {

public Coffee [] getPriceList() file://Web Service方法

throws RemoteException;

public String orderCoffee(String coffeeName, int quantity) file://Web Service方法

throws RemoteException;

}

實現(xiàn)了上述接口的類如:

package coffees;


public class CoffeeOrderImpl implements CoffeeOrderIF {

public Coffee [] getPriceList() throws RemoteException; {

file://方法內(nèi)容

}


public String orderCoffee(String coffeeName, int quantity)

throws RemoteException; {

file://方法內(nèi)容

}

}

定義了Web Service,客戶就可以進行遠端調(diào)用了。一個典型的客戶調(diào)用程序如下:

package coffees;


public class CoffeeClient {

public static void main(String[] args) {

try {

CoffeeOrderIF coffeeOrder = new

CoffeeOrderServiceImpl().getCoffeeOrderIF();//調(diào)用服務(wù)端的Web Service方法

Coffee [] priceList =

coffeeOrder.getPriceList()://調(diào)用服務(wù)端的Web Service方法

for (int i = 0; i < priceList.length; i++) {

System.out.print(priceList.getName() + " ");

System.out.println(priceList.getPrice());

}

} catch (Exception ex) {

ex.printStackTrace();

}

}

}


JAX-RPC可以創(chuàng)建基于RPC(remote procedure calls)和XML的“客戶-服務(wù)”程序。因為使用的是分布的“客戶-服務(wù)”模式,RPC機制能使客戶運行其它系統(tǒng)的程序。

一個遠端調(diào)用是靠基于XML技術(shù)之上的SOAP協(xié)議描述與傳輸?shù)?。SOAP協(xié)議定義消息封裝結(jié)構(gòu),編碼規(guī)則和一個描述響應(yīng)的協(xié)定。這些調(diào)用和響應(yīng)是靠SOAP傳輸?shù)?,目前JAX-RPC是基于SOAP1.1和HTTP1.1。

盡管JAX-RPC是依靠復(fù)雜的協(xié)議(SOAP),但JAX-RPC的API對開發(fā)者隱藏了復(fù)雜性。在服務(wù)端,開發(fā)者指定接口中可以被遠端調(diào)用的方法,開發(fā)者可以寫一個或多個類去實現(xiàn)這些方法。而客戶端程序非常容易去編寫。通過指定服務(wù)端的URI,客戶可以簡單的調(diào)用這些方法。

使用JAX-RPC,客戶和服務(wù)器有一個非常大的優(yōu)勢:平臺獨立性。并且JAX-RPC不受限制,如:一個JAX-RPC客戶能夠調(diào)用不同平臺的Web Service,反之亦然。

因為JAX-RPC是使用W3C(World Wide Web Consortium)技術(shù),所以具有擴展性。

W3C包括:HTTP、SOAP和WSDL。

下面有一個簡單的例子說明JAX-RPC的實現(xiàn):

 

1. 調(diào)用一個遠端程序:HelloClient程序調(diào)用本地stub對象中描述遠端Web Service的方法;

2. stub對象通過JAX-RPC系統(tǒng)調(diào)用程序;

3. 系統(tǒng)將遠端程序調(diào)用轉(zhuǎn)換成SOAP消息并通過HTTP把它傳輸?shù)椒?wù)器去;

4. 當服務(wù)器接收到客戶的SOAP消息,通過JAX-RPC系統(tǒng)將SOAP消息轉(zhuǎn)換成方法調(diào)用;

5. 調(diào)用tie對象中的方法;

6. tie調(diào)用實現(xiàn)了HelloWorld服務(wù)的方法;

7. 系統(tǒng)將調(diào)用方法的結(jié)果轉(zhuǎn)換成SOAP消息響應(yīng)給客戶;

8. 客戶接收響應(yīng)來的SOAP消息,分析它并取得方法調(diào)用的結(jié)果。

服務(wù)端程序如下:

定義Web方法的接口HelloIF.java:

package hello;


import java.rmi.Remote;

import java.rmi.RemoteException;


public interface HelloIF extends Remote {

public String sayHello(String s) throws RemoteException; // Web 方法,可以被客戶調(diào)用

}

實現(xiàn)Web方法的類HelloImpl.java:

package hello;


public class HelloImpl implements HelloIF {


public String message ="Hello";


public String sayHello(String s) { file://具體方法實現(xiàn)

return message + s;

}

}


客戶程序HelloClient.java:

package hello;


import javax.xml.rpc.Stub;


public class HelloClient {

public static void main(String[] args) {

try {

Stub stub = createProxy();//實現(xiàn)遠端調(diào)用的對象

stub._setProperty(

javax.xml.rpc.Stub.ENDPOINT_ADDRESS_PROPERTY,

args[0]);

HelloIF hello = (HelloIF)stub;

System.out.println(hello.sayHello("Duke!"));//調(diào)用服務(wù)端的方法

} catch (Exception ex) {

ex.printStackTrace();

}

}


private static Stub createProxy() {

// Note: HelloWorld_Impl is implementation-specific.

return (Stub)(new HelloWorld_Impl().getHelloIFPort());

}

}


當配置好服務(wù)端并編譯了客戶端HelloClient.java,可以運行客戶程序如:ant run ,如果一切正確,將顯示:

Hello Duke!

發(fā)布:2007-03-25 10:37    編輯:泛普軟件 · xiaona    [打印此頁]    [關(guān)閉]
相關(guān)文章:
上海OA系統(tǒng)
聯(lián)系方式

成都公司:成都市成華區(qū)建設(shè)南路160號1層9號

重慶公司:重慶市江北區(qū)紅旗河溝華創(chuàng)商務(wù)大廈18樓

咨詢:400-8352-114

加微信,免費獲取試用系統(tǒng)

QQ在線咨詢