存根
動態代理
動態調用接口(Dynamic Invocation Interface,DII)
存根和動態代理方法使用服務端點接口(Service Endpoint Interface,SEI)。它基本上是 WSDL 端口類型元素中描述 Web 服務操作的 Java 表示。它是定義 Java 客戶機用來與 Web 服務進行交互的方法的 Java 接口。SEI 是由從 WSDL 到 Java 的映射工具(比如 apache Axis 的 Java2WSDL 或 IBM WSDK 的 WSDL2ClIEnt)生成的。
SEI
服務端點接口(Service Endpoint Interface,SEI)是 WSDL A is the Java representation of a WSDL port type.
存根
存根方法使用在從 WSDL 到 Java 映射階段運行之前創建的特定於平台的存根。因為存根是在運行之前創建的,所以它有時稱為 靜態存根。它是一個實現 SEI 的 Java 類。從 WSDL 到 Java 的映射工具生成所需的客戶端構件;該工具主要導入 WSDL 服務定義,然後創建相應的 Java 代碼。構件包括 SEI、存根、(可選)Holder、序列化器、反序列化器和實用程序類。JAX-RPC 建議把存根的實例綁定到特定的協議和傳輸上,比如 SOAP 綁定存根。對於存根方法,需要執行的步驟如下:
獲取一個 JAX-RPC 服務。
獲得一個存根。
在該存根上調用 Web 服務的操作。
步驟2和3顯示在 清單4中。請注意,使用 JAX-RPC Service 的 getPort 方法(在下一部分中進行描述)來獲取存根也是有可能的。
清單 4. 通過存根訪問 Web 服務
Hello myStub = (Hello) service.getHello();
System.out.println(myStub.getGreeting("Jane");
此方法的優勢在於它的簡單性。基本上指需要兩行代碼來訪問和調用 Web 服務的操作。然而,您需要知道開發時的 WSDL URL 並且運行您的從 WSDL 到 Java 的映射工具。另外,這些存根不是可移植的,因為它們依賴於實現類,並且不應該作為應用程序的一部分進行打包。可移植存根的設計超出了 JAX-RPC 1.0 和 1.1 的范圍。
動態代理
您可以使用代理從 JAX-RPC Service中調用 Web 服務的操作。代理是實現 SEI 的 Java 類。獲得代理使用的是 JAX-RPC Service 的getPort() 方法,它接受您想要調用的 Web 服務的端口的名稱(存在於 WSDL 文檔中)以及代理實現的 SEI。它之所以稱為 動態是因為該代理是在運行時創建的。動態代理客戶機的步驟如下:
獲取一個 JAX-RPC Service 。
使用 JAX-RPC Service 的 getPort() 方法來獲得一個代理以調用 Web 服務的操作。
在步驟1中,對於受管客戶機,通過把 WSDL URL 以及 Web 服務名參數傳送到 createService() 方法來獲得 JAX-RPC Service 。對於 J2EE 容器管理的客戶機,您通過 JNDI 查找來獲取 JAX-RPC Service 。清單5展示了在 Web 服務上調用“getGreeting”操作的動態代理方法(步驟2)。
清單 5. 在動態代理上調用 Web 服務的操作
String namespace = "http://Hello.com";
String portName = "Hello";
QName portQN = new QName(namespace, portName);
Hello myProxy = service.getPort(portQN, Hello.class);
System.out.println(myProxy.getGreeting("Jane"));
這是所有您為了使用動態代理方法調用 Web 服務而需要編寫的代碼。使用這種方法的優勢在於您可以編寫可移植的、廠商無關的代碼。然而,您需要知道開發時的 WSDL URL,並且需要在運行之前根據 WSDL 文檔運行您的從 WSDL 到 Java 的映射工具。如果您沒有這方面的信息,或者 WSDL URL 很可能改變,那麼您應該改為使用 DII 方法。