獲得 JAX-RPC Service 後,可透過三種方式訪問 Web 服務:
前兩者使用服務端點介面(SEI),即 WSDL portType 的 Java 映射,定義客戶端與 Web 服務互動的方法。SEI 由 WSDL-to-Java 映射工具(如 Apache Axis 的 Java2WSDL 或 IBM WSDK 的 WSDL2Client)生成。
存根是在編譯階段由映射工具生成的平台特定類別,實作 SEI,故又稱「靜態存根」。生成的客戶端構件包括 SEI、存根、Holder、序列化器、反序列化器及工具類。JAX-RPC 建議存根綁定特定協議與傳輸(如 SOAP)。
步驟:
程式碼範例(清單 4):
Hello myStub = (Hello) service.getHello();
System.out.println(myStub.getGreeting("Jane"));
優點:代碼極簡(兩行)。
缺點:需預知開發時的 WSDL URL 並運行映射工具;存根不可攜帶,依賴實作類別,不應打包進應用程式。
代理同樣實作 SEI,但於運行時由 JAX-RPC Service.getPort() 動態生成,故稱「動態代理」。
步驟:
getPort(portQName, SEI.class) 獲得代理程式碼範例(清單 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 不需預先知道 WSDL,僅需在運行時指定服務名稱與操作參數,適合高度動態的場景。