分享
 
 
 

Sun ONE Application Server 开发者指南(11)

王朝java/jsp·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

使用动态代理创建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);

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有