国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Java Web Services的遠端調用

2019-11-18 12:54:12
字體:
來源:轉載
供稿:網友

  微軟公司提出.Net概念后很快就被認為是以后網絡服務的發展方向,其中的Web service概念更被認為是將來的工業標準(其中的SOAP、WSDL、UDDI已經是標準了)。而作為微軟公司的老對手SUN公司自然不甘心落后,不久就開發了SUN-ONE(Sun[tm] Open Net Environment)用來開發Web Services,并提供了java WSDP(Java Web Services Developer Pack)工具包。
  Web Services簡單的來說就是網絡服務,譬如一個商業客戶在網絡上通過SOAP協議發送一個請求,服務端接收這個請求并處理它,然后發送一個響應給客戶端。Web Service程序在服務端需要用容器配置,這個容器可以是一個Servlet容器,如:Tomcat或者是基于EJB之上的J2EE 容器。Web Service還用WSDL(Web Service Description Language)描述自己,這種描述包括Web Service的名字、可以被調用的方法名、這些方法的參數以及發送請求的位置等,這樣用戶就可以方便地通過WSDL去發現Web Service并取得服務,然后利用Java API for xml-based RPC(JAX-RPC)實現對Web Service的調用。
  舉一個典型的例子,如有個商家想訂購商品,他可以直接到去每一家供貨商詢問,但有一個方便的方法是通過UDDI(Universal Description,Discovery and Integration)注冊中心去查找供貨商,發現哪些才是自己要找的供貨商。因為供貨商在注冊中心注冊他們的Web Service,這樣就能被網絡潛在的客戶所發現。
  JAX-RPC中有一個工具:xrpcc,它可以根據WSDL產生一個stub類作為客戶端的代理,以及一個tie類作為服務端的代理。JAX-RPC將客戶端調用轉換成一個基于HTTP請求的SOAP消息發送給服務器,服務器收到客戶請求,把SOAP消息轉換成方法調用并調用服務器的Web Service方法,再通過JAX-RPC將結果包裝成SOAP消息形式返回給客戶。
  用JAX-RPC開發Web Service非常的輕易。一個Web Service有兩個文件:一個是接口,用來定義Web Service的遠端可以調用的方法;另外一個實現了這個接口方法的類。
  如定義了Web Service方法的接口:
  package coffees;
  import java.rmi.Remote;
  import java.rmi.RemoteException;
  public interface CoffeeOrderIF extends Remote {
  
  public Coffee [] getPRiceList() //Web Service方法
  
  throws RemoteException;
  
  public String orderCoffee(String coffeeName, int quantity) //Web Service方法
  
  throws RemoteException;
  
  }
  實現了上述接口的類如:
  package coffees;
  public class CoffeeOrderImpl implements CoffeeOrderIF {
  
  public Coffee [] getPriceList() throws RemoteException; {
  //方法內容
  }
  public String orderCoffee(String coffeeName, int quantity)
  
  throws RemoteException; {
  
  //方法內容
  
  }
  定義了Web Service,客戶就可以進行遠端調用了。一個典型的客戶調用程序如下:
  package coffees;
  public class CoffeeClient {
  public static void main(String[] args) {
  
  try {
  
  CoffeeOrderIF coffeeOrder = new
  
  CoffeeOrderServiceImpl().getCoffeeOrderIF();//調用服務端的Web Service方法
  
  Coffee [] priceList =
  
  coffeeOrder.getPriceList()://調用服務端的Web Service方法
  
  for (int i = 0; i < priceList.length; i++) {
  
  System.out.print(priceList[i].getName() + " ");
  
  System.out.println(priceList[i].getPrice());
  
  }
  
  } catch (Exception ex) {
  ex.printStackTrace();
  }
  }
  }
  JAX-RPC可以創建基于RPC(remote procedure calls)和XML的“客戶-服務”程序。因為使用的是分布的“客戶-服務”模式,RPC機制能使客戶運行其它系統的程序。
  一個遠端調用是靠基于XML技術之上的SOAP協議描述與傳輸的。SOAP協議定義消息封裝結構,編碼規則和一個描述響應的協定。這些調用和響應是靠SOAP傳輸的,目前JAX-RPC是基于SOAP1.1和HTTP1.1。
  盡管JAX-RPC是依靠復雜的協議(SOAP),但JAX-RPC的API對開發者隱藏了復雜性。在服務端,開發者指定接口中可以被遠端調用的方法,開發者可以寫一個或多個類去實現這些方法。而客戶端程序非常輕易去編寫。通過指定服務端的URI,客戶可以簡單的調用這些方法。
  使用JAX-RPC,客戶和服務器有一個非常大的優勢:平臺獨立性。并且JAX-RPC不受限制,如:一個JAX-RPC客戶能夠調用不同平臺的Web Service,反之亦然。
  因為JAX-RPC是使用W3C(World Wide Web Consortium)技術,所以具有擴展性。
  W3C包括:HTTP、SOAP和WSDL。
  下面有一個簡單的例子說明JAX-RPC的實現:
  Java Web Services的遠端調用
  1. 調用一個遠端程序:HelloClient程序調用本地stub對象中描述遠端Web Service的方法;
  2. stub對象通過JAX-RPC系統調用程序;
  3. 系統將遠端程序調用轉換成SOAP消息并通過HTTP把它傳輸到服務器去;
  4. 當服務器接收到客戶的SOAP消息,通過JAX-RPC系統將SOAP消息轉換成方法調用;
  5. 調用tie對象中的方法;
  6. tie調用實現了HelloWorld服務的方法;
  7. 系統將調用方法的結果轉換成SOAP消息響應給客戶;
  8. 客戶接收響應來的SOAP消息,分析它并取得方法調用的結果。
  服務端程序如下:
  定義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 方法,可以被客戶調用
  實現Web方法的類HelloImpl.java:
  package hello;
  public class HelloImpl implements HelloIF {
  public String message ="Hello";
  public String sayHello(String s) { //具體方法實現
  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();//實現遠端調用的對象
  
  stub._setProperty(
  
  javax.xml.rpc.Stub.ENDPOINT_ADDRESS_PROPERTY,
  
  args[0]);
  
  HelloIF hello = (HelloIF)stub;
  
  System.out.println(hello.sayHello("Duke!"));//調用服務端的方法
  
  } catch (Exception ex) {
  
  ex.printStackTrace();
  
  }
  
  }
  private static Stub createProxy() {
  
  // Note: HelloWorld_Impl is implementation-specific.
  
  return (Stub)(new HelloWorld_Impl().getHelloIFPort());
  }
  }
  當配置好服務端并編譯了客戶端HelloClient.java,可以運行客戶程序如:ant run ,假如一切正確,將顯示:
  Hello Duke!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 临城县| 辉南县| 西贡区| 嘉兴市| 金沙县| 九龙县| 得荣县| 巴东县| 永济市| 绥宁县| 安化县| 永福县| 南宁市| 四川省| 海盐县| 高要市| 铁岭市| 福泉市| 通河县| 遵义县| 浙江省| 宁津县| 泸定县| 沁源县| 嘉荫县| 安溪县| 瑞昌市| 菏泽市| 修武县| 芜湖市| 旬阳县| 文山县| 绍兴县| 类乌齐县| 宜川县| 万州区| 运城市| 高邑县| 翁牛特旗| 介休市| 兴国县|