【Java Web Service客户端实现详解】 Java Web Service是一种基于标准的、平台无关的、用于构建分布式应用程序的技术,它允许服务提供者和服务消费者通过网络进行通信。客户端实现Java Web Service主要包括三种方式:生成的Stub、动态代理和动态调用接口。本文将深入探讨这三种方式,并以生成Stub为重点。 1. **生成的Stub** Stub(存根)是Java Web Service客户端与服务端通信的关键组件。它是通过JAX-RPC(Java API for XML-Based RPC)编译器解析WSDL(Web Service Description Language)文档生成的。WSDL文档定义了服务接口、消息格式、服务位置等信息。Stub的主要任务是将客户端对服务接口的调用转换为SOAP(Simple Object Access Protocol)消息,发送给服务器,并处理服务器返回的SOAP响应,将其转化为方法的返回值。如果服务器返回SOAP fault,Stub会将其转换为客户端的异常。 Stub需要实现endpoint接口,同时还要实现或继承`javax.xml.rpc.Stub`接口或其子类。`javax.xml.rpc.Stub`接口提供了设置和获取网络通信和认证相关属性的机制,如ENDPOINT_ADDRESS_PROPERTY(服务的互联网地址)、PASSWORD_PROPERTY(认证密码)、USERNAME_PROPERTY(认证用户名)以及SESSION_MAINTAIN_PROPERTY(是否保持HTTP会话)等。下面是一段`javax.xml.rpc.Stub`接口的代码片段: ```java package javax.xml.rpc; import java.util.Iterator; public interface Stub { // ... public static String ENDPOINT_ADDRESS_PROPERTY; public static String PASSWORD_PROPERTY; public static String USERNAME_PROPERTY; public static String SESSION_MAINTAIN_PROPERTY; // ... public Object _getProperty(java.lang.String name); public Iterator _getPropertyNames(); public void _setProperty(java.lang.String name, java.lang.Object value); } ``` 2. **动态代理** 动态代理机制允许在运行时创建实现特定接口的对象,无需预先编写Stub类。这种方式灵活性更高,但可能比使用Stub稍微复杂一些,因为它需要在运行时动态构造SOAP消息。 3. **动态调用接口** 动态调用接口(Dynamic Invocation Interface, DII)提供了更底层的访问方式,允许直接构造和发送SOAP消息,而不依赖于预先生成的Stub。这种方式对开发者的要求较高,但提供了最大的控制力。 **JAX-RPC中的Service接口** JAX-RPC编译器还会生成一个与WSDL中的`service`元素相对应的Service接口。这个接口聚合了多个port,即多个Stub。Service接口继承自`javax.xml.rpc.Service`,在J2EE环境中,通常通过JNDI(Java Naming and Directory Interface)查找来获取Service实例。以下是一个在J2EE环境中使用生成的Stub的示例代码: ```java package com.jwsbook.jaxrpc; import javax.servlet.http.*; import javax.servlet.*; import javax.naming.InitialContext; public class BookQuoteServlet_1 extends javax.servlet.http.HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, java.io.IOException { try{ String isbn = req.getParameter("isbn"); InitialContext jndiContext = new InitialContext(); BookQuoteService service = (BookQuoteService) jndiContext.lookup("java:comp/env/service/BookQuoteService"); BookQuote bookQuote = service.getBookQuotePort(); float price = bookQuote.getBookPrice( isbn ); // ... } catch (Exception e) { // Handle exceptions } } } ``` 在这个例子中,首先通过JNDI查找获取`BookQuoteService`,然后通过`getBookQuotePort()`方法得到具体的Stub对象,最后调用`getBookPrice()`方法来获取书籍的价格。 总结来说,Java Web Service客户端实现的选择取决于项目的具体需求,包括灵活性、性能和开发效率等因素。生成的Stub适合大多数情况,而动态代理和DII则适用于更复杂的场景或者需要高度定制的通信需求。理解并掌握这些技术对于有效地开发和集成Java Web Service至关重要。
- wellgujia2015-07-28文档写的还不错
- 粉丝: 16
- 资源: 9
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助