使用动态代理创建JAX-RPC客户端
JAX-RPC客户端能够通过动态代理与web服务进行交互。动态代理是在运行时刻动态支持服务终端的类,不需要任何提前生成的stub。客户端通过调用javax.xml.rpc.Service接口的getPort()方法创建动态代理。客户端调用它的getPort()方法,传入Java服务定义接口和相应的web服务端口名称。它会返回服务定义接口的一个动态创建并且配置好的实现——动态创建的stub。
关于动态代理的更多信息,请访问如下URL:
http://java.sun.com/j2se/1.3/docs/guide/reflection/proxy.html
下面给出的步骤解释了建立动态代理客户端的过程。
1. 确定在类路径中加入了必要的jar文件。想要了解向类路径中添加jar文件的更多信息,请参见"配置客户端环境 "。
2.创建一个使用动态代理调用服务的客户端类。
public class HelloClient {
....
....
}
3. 定义服务名称、端口名称、和包含想要访问的Web服务相关信息的WSDL名称。
String UrlString = endpoint;
String nameSpaceUri = "http://proxy.org/wsdl/HelloWorld";
String serviceName = "HelloWorld";
String portName = "HelloIFPort";
URL helloWsdlUrl = new URL(UrlString);
4. 获得默认ServiceFactory对象实现的一个实例。
ServiceFactory serviceFactory = ServiceFactory.newInstance();
Service helloService =serviceFactory.createService(helloWsdlUrl, new QName(nameSpaceUri,serviceName));
5. 为对象获得动态代理
HelloIF myProxy =(HelloIF)helloService.getPort( new QName(nameSpaceUri,portName), proxy.HelloIF.class);
在代码示例中,传入getPort()方法的是一个接口定义,它将被用作在运行时创建动态代理的模版。
6. 使用java.lang.reflect.InvocationHandler.Invoke()调用服务
System.out.println(myProxy.sayHello("Buzz"));
使用调用接口创建JAX-RPC客户端
在调用接口方法中,客户端动态地发现服务,配置远程调用,并且执行调用。客户端使用javax.xml.rpc.Call接口实现对JAX-RPC服务的动态调用。在运行时,客户端利用DII调用web服务中的远程过程。
DII调用对象方法支持两种类型的调用,即同步的请求-响应方式和单路方式。在请求-响应方式中,客户端利用调用对象的调用方法执行远程方法。然后,客户端等待直到操作完成,也就是说,直到响应被返回。在单路方式中,客户端使用调用对象的invokeOneWay方法进行远程调用。
以下步骤解释了能够通过调用接口方法调用web服务的客户端的创建过程:
1. 确定在类路径中添加了必要的jar文件。想要了解更多,请参见"配置客户端环境 "。
2. 在创建动态客户端的时候,定义想要访问的服务的名称以及端口名称。然后,利用ServiceFactory.newInstance()方法创建一个服务工厂。JAXR API支持用ServiceFactory.newInstance()方法来定义服务。想要了解更多信息,请参见
"Adding Services and Service Bindings to an Organization".
private static String qnameService = "HelloWorld";
private static String qnamePort = "HelloIF";
ServiceFactory factory = ServiceFactory.newInstance();
Service service = factory.createService(new QName(qnameService));
3. 从工厂中创建一个服务
Service service = Factory.createService(new QName(qnameService));
4. 从服务中创建一个调用对象并且传递端口名称及想要执行的操作名称作为参数。
QName port = new QName(qnamePort);
Call call = service.createCall();
call.setPortTypeName(port); call.setTargetEndpointAddress(endpoint);
5. 在执行实际方法调用之前设置属性。使用setProperty方法设置在JAX-RPC规范中列出的标准属性。
call.setProperty(Call.SOAPACTION_USE_PROPERTY, new Boolean(true));
call.setProperty(Call.SOAPACTION_URI_PROPERTY, "");
call.setProperty(ENCODING_STYLE_PROPERTY, URI_ENCODING);
QName QNAME_TYPE_STRING = new QName(NS_XSD, "string");
call.setReturnType(QNAME_TYPE_STRING);
6. 设置操作名称
call.setOperationName(new QName(BODY_NAMESPACE_VALUE,"sayHello"));
call.addParameter("String_1", QNAME_TYPE_STRING, ParameterMode.IN);
String[] params = { new String("Duke!") };
用addParameter方法添加参数和在setOperationName方法中指定的操作类型。注意这些参数来自服务的WSDL文件。
7. 使用Call.invoke()方法调用服务
String result = (String)call.invoke(params);
Invoke方法调用了利用同步请求-响应交互方式在setOperationName方法中指定的操作。方法调用为调用指定了输入参数。
利用WSDL创建JAX-RPC客户端
以下步骤讲述了使用WSDL定位web服务并调用服务的动态客户端的创建过程。
1. 利用ServiceFactory.newInstance() 方法创建一个服务工厂
ServiceFactory serviceFactory = ServiceFactory.newInstance();
2. 从工厂创建一个服务对象。传入WSDL名称作为参数。
String nameSpaceUri = "http://hello.org/wsdl";
URL helloWsdlURL = new URL(URLstring);
3. 创建一个serviceName对象,并且传递想要调用的服务名称作为参数。
String serviceName = "HelloWorld";
4. 创建一个portName对象并指定端口名称。
String portName = "HelloIFport";
5. 创建一个OperationName对象并指定想要调用的服务操作名称。
String operationName = "sayHello";
6. 创建一个服务,传递WSDL位置和想要调用的服务名称作为参数。
Service helloService = serviceFactory.createService(helloWsdlURL, new QName(nameSpaceUri, serviceName"));
7. 创建一个Call对象,传递端口名称以及想要执行的操作作为参数。
Call call = helloService.createCall(portName, operationName);
8. 通过Call.Invoke()方法调用服务。
String result = String call.Invoke(helloService);