首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2SE

Java 客戶端調用 Web 服務(四):存根、動態代理與 DII 訪問模式詳解

     編輯:J2SE

三種訪問模式概覽

獲得 JAX-RPC Service 後,可透過三種方式訪問 Web 服務:

  1. 存根
  2. 動態代理
  3. 動態調用介面(DII)

前兩者使用服務端點介面(SEI),即 WSDL portType 的 Java 映射,定義客戶端與 Web 服務互動的方法。SEI 由 WSDL-to-Java 映射工具(如 Apache Axis 的 Java2WSDL 或 IBM WSDK 的 WSDL2Client)生成。

存根模式

存根是在編譯階段由映射工具生成的平台特定類別,實作 SEI,故又稱「靜態存根」。生成的客戶端構件包括 SEI、存根、Holder、序列化器、反序列化器及工具類。JAX-RPC 建議存根綁定特定協議與傳輸(如 SOAP)。

步驟:

  1. 獲取 JAX-RPC Service
  2. 獲得存根實例
  3. 在存根上調用 Web 服務操作

程式碼範例(清單 4):

Hello myStub = (Hello) service.getHello();
System.out.println(myStub.getGreeting("Jane"));

優點:代碼極簡(兩行)。
缺點:需預知開發時的 WSDL URL 並運行映射工具;存根不可攜帶,依賴實作類別,不應打包進應用程式。

動態代理模式

代理同樣實作 SEI,但於運行時由 JAX-RPC Service.getPort() 動態生成,故稱「動態代理」。

步驟:

  1. 獲取 JAX-RPC Service
  2. 調用 getPort(portQName, SEI.class) 獲得代理
  3. 透過代理調用操作

程式碼範例(清單 5):

String namespace = "https://Hello.com";
String portName = "Hello";
QName portQN = new QName(namespace, portName);

Hello myProxy = service.getPort(portQN, Hello.class);
System.out.println(myProxy.getGreeting("Jane"));

優點:可編寫可攜帶、廠商無關的代碼。
缺點:仍需開發時的 WSDL URL 並預先運行映射工具;若 WSDL URL 可能變動或不可知,應改用 DII。

DII 模式

DII 不需預先知道 WSDL,僅需在運行時指定服務名稱與操作參數,適合高度動態的場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved