怎样在J2EE组件中引用和查找Web服务
本文将讨论怎么在J2EE组件中引用Web服务、并且通过JNDI来查找Web服务。在内容组织上,首先把一个EJB2.1无状态会话Bean发布成Web服务,然后开发基于JSP的Web服务客户端,最后着重介绍怎么在JSP的部署时引用Web服务,并且讨论怎么通过JNDI来查找和调用Web服务。阅读本文前您需要以下的知识和工具:
J2EE1.4 SDK,并且会初步使用;
掌握基本的JAX-RPC Web服务开发技能;
了解JNDI的基本知识,能够使用它进行简单编程;
一般的Java编程知识。
Web服务客户端 我们知道,JAX-RPC Web服务客户端有以下几个类型:
基于Stub;
基于动态代理;
基于动态调用接口(DII)。
实际上,上面三种客户端都是使用Service接口来作为它们的创建工厂,Service接口中定义了诸如以下的方法:
例程1 Service接口中的某些方法
Call createCall() ;
Call createCall(QName portName,
String operationName) ;
Remote getPort(QName portName,
Class serviceEndpointInte易做图ce) ;
Remote getPort(Class serviceEndpointInte易做图ce) ;
可以看出,通过Service接口,能够创建Call对象和Remote对象,而Call或者Remote对象正是调用Web服务所需要的。通过使用Service接口,我们可以在Web服务客户端通过以下的方式来实现调用:
例程2 在客户端调用Web服务
//创建一个ServiceFactory对象。
ServiceFactory serviceFactory
= ServiceFactory.newInstance();
//通过ServiceFactory
对象创建一个调用Web服务的Service对象。
Service service =
serviceFactory.createService
(taxWsdlUrl,
new QName(nameSpaceUri,
serviceName));
//获得服务端点实例。
TaxService myProxy =
( TaxService) service.getPort
(new QName(nameSpaceUri,
portName),
TaxService.class);
//调用Web服务。
double result=myProxy.calculateTax(5000);
可以看出,在创建Service实例时,需要使用指定的WSDL文件位置、由服务名和名称空间URI组成的有效名称空间,这样使得创建这个实例时变得复杂。JAX-RPC规范推荐使用JNDI来查找服务接口。通过JNDI,使得调用Web服务时就像调用EJB一样简单。只要通过两步就可以获得Web服务接口:
初始化一个名称空间上下文;
在这个上下文中查找Web服务。
补充:Jsp教程,J2EE/EJB/服务器