JAX-WS 客户机编程模型
Java™ API for XML-Based Web Services (JAX-WS) Web Service 客户机编程模型支持 Dispatch client API 和动态代理客户机 API。Dispatch client API 是动态客户机编程模型,而 JAX-WS 的静态客户机编程模型是动态代理客户机。Dispatch client 和动态代理客户机都支持同步和异步调用 JAX-WS Web Service。
- Dispatch client:当想要在 XML 消息级别工作,或者想要在 JAX-WS 级别不使用任何生成的工件工作时,请使用此客户机。
- 动态代理客户机:当想要调用基于服务端点接口的 Web Service 时,请使用此客户机。
Dispatch client
基于 XML 的 Web Service 将 XML 消息用于 Web Service 与 Web Service 客户机之间的通信。JAX-WS API 提供高级方法来简化和隐藏有关在 Java 方法调用和与它们相关联的 XML 消息之间进行转换的详细信息。但是,在某些情况下,您可能需要在 XML 消息级别工作。Dispatch client API 提供了在 XML 消息级别调用服务的支持。Dispatch client API javax.xml.ws.Dispatch 是动态 JAX-WS 客户机编程接口。要编写 Dispatch client,必须具有 Dispatch client API 和受支持的对象类型方面的专门知识,并了解关联 Web Service 描述语言 (WSDL) 文件的消息表示。Dispatch client 能够以 MESSAGE 或 PAYLOAD 方式发送数据。使用 javax.xml.ws.Service.Mode.MESSAGE 方式时,Dispatch client 负责提供整个 SOAP 包络,其中包括 <soap:Envelope>、<soap:Header> 和 <soap:Body> 元素。使用 javax.xml.ws.Service.Mode.PAYLOAD 方式时,Dispatch client 只负责提供 <soap:Body> 的内容,并且 JAX-WS 将有效内容包含在 <soap:Envelope> 元素中。
- javax.xml.transform.Source:使用 Source 对象来使客户机能够直接使用 XML API。可以将 Source 对象与 SOAP 或 HTTP 绑定配合使用。
- JAXB 对象:借助 JAXB 对象,客户机可以通过根据 XML 模式生成的 JAXB 对象,使用 JAX-WS 应用程序来创建和控制 XML。JAXB 对象只能与 SOAP 或 HTTP 绑定配合使用。
- javax.xml.soap.SOAPMessage:使用 SOAPMessage 对象,以便客户机可以处理 SOAP 消息。SOAPMessage 对象只能与 SOAP 绑定配合使用。
- javax.activation.DataSource:使用 DataSource 对象,以便客户机能够处理多用途因特网邮件扩充协议 (MIME) 消息。DataSource 只能与 HTTP 绑定配合使用。
Dispatch<Source> dispatch = … create a Dispatch<Source>
Source request = … create a Source object
Source response = dispatch.invoke(request);
Dispatch 参数值确定
invoke() 方法的返回类型。- 使用 invoke 方法对请求和响应同步调用
- 带回调或轮询对象使用 invokeAsync 方法对请求和响应异步调用
- 使用 invokeOneWay 方法单向调用
请参阅 JAX-WS 规范第 4 章第 3 节,以获取有关如何使用 Dispatch client 的更多信息。
动态代理客户机
JAX-WS 的静态客户机编程模型称为动态代理客户机。动态代理客户机根据必须提供的服务端点接口 (SEI) 调用 Web Service。动态代理客户机类似于 Java API for XML-based RPC (JAX-RPC) 编程模型中的存根客户机。虽然 JAX-WS 动态代理客户机与 JAX-RPC 存根客户机都基于从 WSDL 文件生成的服务端点接口 (SEI),但仍存在一个主要差别。动态代理客户机在运行时使用 Java 5 动态代理功能动态生成,而基于 JAX-RPC 的存根客户机是由工具生成的不可移植的 Java 文件。与 JAX-RPC 存根客户机不同,动态代理客户机不要求您在应用程序服务器上运行客户机之前针对不同的供应商重新生成存根,因为生成的接口不需要特定供应商信息。
动态代理实例扩展 java.lang.reflect.Proxy 类并利用基本 Java SE 运行时环境 (JRE) 6 中的动态代理功能。然后,客户机应用程序可以提供用于创建代理实例的接口,而运行时负责动态创建表示 SEI 的 Java 对象。
- 使用 invoke 方法对请求和响应同步调用
- 带回调或轮询对象使用 invokeAsync 方法对请求和响应异步调用
- 使用 invokeOneWay 方法单向调用
有关使用动态代理客户机的更多信息,请参阅 JAX-WS 规范的第 4 章。