JNDI 服務查找
J2EE 容器管理的客戶機被打包成 Enterprise Archives(.EAR)文件,並且在 J2EE 容器中運行。除了 Java 代碼之外,描述符也打包在該歸檔文件中。下面是幾個不同類型的 J2EE 容器管理的客戶機:
應用程序客戶機容器客戶機
Web 容器客戶機:JavaBean 或 Servlet
EJB 容器客戶機:EJB
JAX-RPC 定義了受管客戶機的編程模型,而 JSR 109(“實現企業 Web 服務(Implementing Enterprise Web services)”)定義了 J2EE 容器受管的客戶機的編程模型。JSR 109 的目標之一就是它的客戶機編程模型遵循 JAX-RPC。然而,JSR 109 並沒有推薦使用 JAX-RPC ServiceFactory 。相反,它建議客戶機使用 Java 命名和目錄接口(Java Naming and Directory Interface,JNDI)來獲取服務接口(Service Interface)。這個過程包括下面兩個步驟,同時在 清單2中進行了舉例說明:
實例化本地 JNDI 上下文。
在此上下文中對 Web 服務進行 JNDI 查找。
清單 2. JNDI 服務查找
Context ic = new InitialContext();
Service service = (Service) ctx.lookup("Java:comp/env/service/HelloService");
Web 服務的名稱(在本例中為 java:comp/env/service/HelloService )是在客戶機應用程序的部署描述符中指定的。JSR 109 建議把服務引用的所有邏輯名組織在 service 子目錄中。如果客戶機環境上下文是 Java:comp/env ,您就可以以下面的代碼結束:
service name in context =
clIEnt environment context + "service" subcontext + service name.
在本例中,上下文中的服務名為:
Java:comp/env/ + service/ + HelloService.
service 子上下文(subcontext) + 服務名(例如 service/HelloService )也稱為邏輯上的服務名,是在 Web 服務客戶機應用程序的部署描述符中進行聲明的。
JNDI 查找返回 JAX-RPC Service Interface。J2EE 容器確保在部署描述符中指定的綁定通用 JAX-RPC Service 的實現。您也可以將該查找返回的對象強制轉換成您的 Web 服務的指定接口。這示於 清單3,其中 HelloService 擴展了通用的 JAX-RPC Service 接口。
清單 3. 可供選擇的 JNDI 查找
Context ic= new InitialContext();
HelloServiceInterface service =
(HelloServiceInterface) ic.lookup("Java:comp/env/service/HelloService");
然後可以使用獲得的服務接口(Service Interface)來獲取靜態存根、動態代理或 DII Call 對象,如下面的“ 服務訪問”部分所述。
服務訪問
在前面的部分中,您看到了 JAX-RPC ServiceFactory 用作 JAX-RPC Services 的工廠。同樣地,JAX-RPC Service 也用作代理和存根的工廠。一旦您實例化了服務,就擁有了三種訪問和調用 Web 服務的方法: