资源预览内容
第1页 / 共8页
第2页 / 共8页
第3页 / 共8页
第4页 / 共8页
第5页 / 共8页
第6页 / 共8页
第7页 / 共8页
第8页 / 共8页
亲,该文档总共8页全部预览完了,如果喜欢就下载吧!
资源描述
JSR101 和 JSR109用 java 实现 web services 必须遵循两个规范,他们分别是: JSR 101: 用于基于 XML 的 RPC(Remote Procedure Call) 的 Java API(Java API for XML based RPC,JAX-RPC) JSR 109: 实现企业 Web 服务(Implementing Enterprise Web services) 两个规范提供了厂商的实现的一致性和互操作性需求。 JAX-RPC Java 到 XML 和 XML 到 Java 映射 APIJAX-RPC 为基于 XML 的远程过程调用(Remote Procedure Call,RPC)和 Java 应用程序编程接口(Java Application Programming Interface,API): WSDL 到 Java 和 Java 到 WSDL 映射:例如,将 WSDL 端口类型映射到 Java 服务端点接口(Java Service Endpoint Interface,SEI)。 XML 数据类型到 Java 数据类型和 Java 数据类型到 XML 数据类型映射,包括简单类型、复杂类型和数组。 除了 XML 映射之外,JAX-RPC 还定义了服务器端编程模型和 API, AX-RPC 1.1 根据 Web 服务互操作性组织(Web Services Interoperability organization,WS-I)基本概要版本 1.0(Basic Profile version 1.0)添加了互操作性需求。 JSR 109 J2EE 环境的 APIJSR 109 指定了 Java 2 Enterprise Edition(J2EE)环境的 Web 服务编程模型和体系结构。JSR 109 构建在 SOAP 1.1 和 WSDL 1.1 的基础上,它涵盖了 J2EE 环境中 JAX-RPC 的使用( 图 2)。它还定义了 J2EE 应用程序服务器中的部署模型。JSR 109 的客户端编程模型符合 JAX-RPC。 JAX-RPC 1.1 和 JSR 109 是 J2EE 1.4 的组成部分。 在这里我不准备描述用 java 如何实现服务端,仅描述如何用 java 作为客户端如何调用 web services。获取客户端服务Java 客户端有两种获取方式,一种是基于容器管理的,一种不是基于容器管理的。基于容器管理的,可以是不同类型的 J2EE 容器管理的客户机: 应用程序客户机容器客户机 Web 容器客户机:JavaBean 或 Servlet EJB 容器客户机:EJB 他们通过 jndi 查找服务,一般是两个步骤:1实例化本地 JNDI 上下文。 2在此上下文中对 Web 服务进行 JNDI 查找。 Context ic = new InitialContext();Service service = (Service) ctx.lookup(java:comp/env/service/HelloService);然后可以使用获得的服务接口(Service Interface)来获取静态存根、动态代理或 DII Call 对象,来实现我下面描述的三种调用方式。不是基于容器管理的,就是在本地通过 java 程序直接调用服务的,服务查找是通过 JAX-RPC ServiceFactory 进行的,JAX-RPC ServiceFactory 是创建服务访问点的工厂,可以如下进行使用获取服务: javax.xml.rpc.Service service = ServiceFactory.newInstance().createService(.); 我在下面描述的客户端获取方式都是基于不是容器管理的。java 调用 webservices用 java 作为客户端调用 webservices 主要有三种方式,下面描述三种调用方式。1.DLL(Dynamic Invocation Interface)调用复杂度最高,灵活性最强的调用方式通过自己创建 Call 对象完成调用,此方法的步骤如下: 1. 获取一个 JAX-RPC Service 。 2. 使用 JAX-RPC Service 的 createCall() 方法实例化 JAX-RPC Call 。 3. 使用它的 setter 方法来配置您的 Call 实例。 4. 使用 JAX-RPC Call 的调用方法来调用 Web 服务的操作。 String namespace = http:/Hello.com;String portName = Hello;QName portQN = new QName(namespace, portName);String operationName = getGreeting;Call call = service.createCall();call.setPortTypeName(portQN);call.setOperationName(new QName(namespace, operationName);call.setProperty(Call.ENCODINGSTYLE_URI_PROPERTY, ); call.setProperty(Call.OPERATION_STYLE_PROPERTY, wrapped);call.addParameter(param1, ,ParameterMode.IN);call.setReturnType();Object inParams = new Object Jane;String ret = (String) call.invoke(inParams);使用 DII Call 接口的优势在于,客户机可以调用远程过程而无需知道开发时的 WSDL URI 或 Web 服务操作的签名。这样当 Web 服务的细节改变时,很容易对代码进行修改。使用 DII 客户机,不需要像动态代理或静态存根的情形那样由从 WSDL 到 Java 的映射工具(Emitter)生成运行时类。然而,如果您知道您想要调用的 Web 服务不可能更改,就应该使用动态代理,因为配置 Call 实例可能很复杂。我以调用一个 axis 的 webservices 为例说明 DLL 如何调用。编写服务端程序 Hellopackage com.lion.servicepublic class Hello public String sayHello(String name)return hello +name;将上面的程序发布成一个 web 服务,在 web-infoserver-config.wsdd 文件添加下列描述:客户端调用程序如下 TestHelloClient.java:import org.apache.axis.client.Call;import org.apache.axis.client.Service;import javax.xml.namespace.QName;import javax.xml.rpc.ServiceException;import java.net.MalformedURLException;import java.rmi.RemoteException;public class TestHelloClientpublic static void main(String args) try String endpoint = http:/localhost:8080/axis/Hello ;Service service = new Service();Call call = null;call = (Call) service.createCall();call.setTargetEndpointAddress(new java.net.URL(endpoint);/ 为 Call 设置服务的位置call.setOperationName(“sayHello”);String res = (String) call.invoke(new Object lion); System.out.println(return value is + res); catch (Exception ex) ex.printStackTrace();2.使用动态代理(Dynamic Proxy)调用复杂度中等,灵活性中等的调用方式您可以使用代理从 JAX-RPC Service 中调用 Web 服务的操作。代理是实现 SEI (服务端点接口 Service Endpoint Interface)的 Java 类。获得代理使用的是 JAX-RPC Service 的 getPort() 方法,它接受您想要调用的 Web 服务的端口的名称(存在于 WSDL 文档中)以及代理实现的 SEI。它之所以称为 动态 是因为该代理是在运行时创建的。动态代理客户机的步骤如下: 1. 获取一个 JAX-RPC Service 。 2. 使用 JAX-RPC Service 的 getPort() 方法来获得一个代理以调用 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 方法。仍以上面发布的 hello 服务为例子,下面是动态代理的调用代码。编写客户端代理接口/这里声明的方法一定要和服务端程序的方法名称和参数相同,最好类名也一样/而且必须继承 java.rmi.Remote 接口public interface HelloClientInterface extends java.rmi.Remote public String sayHello (String name) throws java.rmi.RemoteException;编写并执行客户端程序 TestHelloClient.javaimport javax.xml.rpc.Service;import javax.xml.rpc.ServiceFactory;import java.net.URL;import javax.xml.namespace.QName;public class TestHelloClient public static void main(String args) tryString wsdlUrl = http:/localhost:8080/axis/Hello?wsdl ;/wsdl 描述String nameSpaceUri = http:/localhost:8080/axis/HelloClient ;/ wsdl 描述里面的服务命名空间String servic
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号