五、利用axis开发客户端web服务
如果要使用对方提供的web服务,首先必须要有该web服务WSDL的URL,类似http://localhost:8090/webserviceTest/services/wstest?wsdl ,并对WSDL有着一定的了解。
axis支持三种web服务客户端的开发方式,分别是:
Ø 动态调用接口(Dynamic Invocation Interface)
Ø 动态代理服务(Dynamic Proxy)
Ø 静态票根(static stub)
下面分别给予介绍。
1. 动态调用接口
首先看示例代码:
package com.ufgov.webservice.client;
import java.net.URL;
import javax.xml.namespace.QName;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
public class WsTestClient {
private String UrlString = "http://localhost:8090/webserviceTest/services/wstest?wsdl";
private String nameSpaceUri = "http://localhost:8090/webserviceTest/services/wstest";
public String getNameDII(){
try{
Service service = new Service();
Call call = (Call) service.createCall();
call.setOperationName(new QName(nameSpaceUri,"getName"));
call.setTargetEndpointAddress(new URL(UrlString));
String name = (String) call.invoke(new Object[]{});
return name;
}
catch(Exception e){
e.printStackTrace();
}
return null;
}
public static void main(String[] args){
String name = "";
WsTestClient wsTestClient = new WsTestClient();
name = wsTestClient.getNameDII();
System.out.println("getName():" + name);
}
}
几点说明:
a. 在编写web服务客户端代码时,我们需要获得WSDL的URL,如http://localhost:8090/webserviceTest/services/wstest?wsdl ;需要获得web服务的URL,如http://localhost:8090/webserviceTest/services/wstest;需要获得web服务的名称,如WsTestService;需要获得web服务的端口,如wstest。
WSDL的URL一般由合作伙伴提供;web服务的URL一般是把WSDL的URL去掉后面的参数(即:“?wsdl”字样);web服务的名称对应WSDL文档里service元素的name属性;web服务的端口对应prot元素的name属性。
b. call.setOperationName()方法接受一个QName类型的参数,实例化一个QName对象需要提供web服务的URL和要调用的web服务方法。
c. call.invoke()方法接受一个Object数组参数,数组各个成员是传递给要调用的web服务方法的参数列表。
d. 如果要调用的web服务方法返回一个自定义对象,那么在客户端也需要注册自定义对象的序列化/反序列化器,代码如下:
Service service = new Service();
Call call = (Call) service.createCall();
QName qn = new QName("urn:BeanService","WsBean");
call.registerTypeMapping(WsBean.class,qn,new BeanSerializerFactory(WsBean.class,qn),new BeanDeserializerFactory(WsBean.class,qn));
call.setOperationName(new QName(nameSpaceUri,"getWsBean"));
call.setTargetEndpointAddress(new URL(UrlString));
WsBean bean = (WsBean) call.invoke(new Object[]{"myname",new Integer(20)});
2. 动态代理服务
首先需要编写代理接口,这个接口必须继承java.rmi.Remote接口,接口提供的方法是web服务提供的所有方法的声明,并且每个接口都要抛出java.rmi.RemoteException异常,如:
package com.ufgov.webservice.client;
public interface WsTest extends java.rmi.Remote {
public java.lang.String getName() throws java.rmi.RemoteException;
public com.ufgov.webservice.client.WsBean getWsBean(java.lang.String name, int age) throws java.rmi.RemoteException;
}
编写客户端代码,使用动态代理服务访问web服务,示例代码如下:
package com.ufgov.webservice.client;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.rpc.ServiceFactory;
import javax.xml.rpc.Service;
public class WsTestClient {
private String UrlString = "http://localhost:8090/webserviceTest/services/wstest?wsdl";
private String nameSpaceUri = "http://localhost:8090/webserviceTest/services/wstest";
private String serviceName = "WsTestService";
private String portName = "wstest";
public String getNameDynamicProxy(){
try{
URL serverUrl = new URL(UrlString);
ServiceFactory serviceFactory = ServiceFactory.newInstance();
javax.xml.rpc.Service service = serviceFactory.createService(serverUrl,new QName(nameSpaceUri,serviceName));
WsTest wsTest = (WsTest)service.getPort(new QName(nameSpaceUri,portName),WsTest.class);
String name = wsTest.getName();
return name;
}
catch(Exception e){
e.printStackTrace();
}
return null;
}
public static void main(String[] args){
String name = "";
WsTestClient wsTestClient = new WsTestClient();
name = wsTestClient.getNameDynamicProxy ();
System.out.println("getName():" + name);
}
说明:
代理接口可以自己手工编写,这需要对WSDL比较熟悉,能够从中抽象出web服务所提供的所有方法及其参数列表、返回值类型等。还有一种选择是利用axis提供的工具生成代理接口,具体方法参见静态票根部分。
如何用动态代理的方法调用返回自定义对象的web服务方法,暂无相关资料。
3. 静态票根
要使用静态票根方法访问web服务,首先必须借助axis生成客户端代码。打开命令行窗口,转到AXIS目录下的WEB-INF子目录。确保Tomcat服务已经处于启动状态,键入命令 :
Java org.apache.axis.wsdl.WSDL2Java http://localhost:8090/webserviceTest/services/wstest?wsdl
该命令执行的结果是在当前所在目录下产生一个子目录,localhost\webserviceTest\services\wstest,该目录下有4个java源文件,分别是:
Ø WsTest.java:定义了web服务代理接口,提供了web服务提供的所有方法的声明参见动态代理服务部分。
Ø WsTestService.java:定义了用于获取Web服务接口的方法。
Ø WsTestServiceLocator.java:接口WsTestService的具体实现。
Ø WstestSoapBindingStub.java:Web服务客户端票根,通过该类与服务器交互。
命令执行后,在当前所在目录还产生一个子目录,BeanService,该目录下有自定义对象的源文件:
ü WsBean.java:web服务提供者自定义的类。
将自动生成的java源文件拷贝到项目合适的地方,并编译。
编写代码访问服务,如下:
package com.ufgov.webservice.client;
public class WsTestClient {
public String getNameStaticStub(){
try{
WsTestService service = new WsTestServiceLocator();
WsTest wsTest = service.getwstest();
String name = wsTest.getName();
return name;
}
catch(Exception e){
e.printStackTrace();
}
return null;
}
public static void main(String[] args){
String name = "";
WsTestClient wsTestClient = new WsTestClient();
name = wsTestClient.getNameStaticStub();
System.out.println("getName():" + name);
}
}
说明:
a. 执行WSDL2Java命令自动生成的子目录结构不是固定的,跟WSDL的URL有关系;
b. 自动生成的java源文件的名称不是固定的,跟web服务的名称有关系。
c. 在示例中我将自动生成的代码放在了跟客户端代码WsTestClient.java同样的包中,所以不必引入自动生成的类,否则,需要引入自动生成的类。
d. 使用静态票根调用返回自定义对象的web服务方法时,代码与调用返回XML Schema内置简单类型的方法无任何不同。
六、其他
axis还支持所谓的自动部署,自动部署相当简单,但是限制也较多,网上有许多资料可以参考。个人感觉在真正的项目开发中,恐怕很少有人使用自动部署,更多的是选择通过WSDD自定义部署,也就是我们在第四部分介绍的。
(未完待续……)
分享到:
相关推荐
### MyEclipse下开发Web Service(Axis):深入解析与实践指南 #### 一、环境配置与准备 在深入探讨如何使用Apache Axis在MyEclipse环境下构建Web Services之前,首要任务是确保拥有一个完整的开发环境。这包括但不...
本文将详细介绍如何使用Apache Axis创建Web Service,并将重点介绍三种不同的方法:动态调用接口(Dynamic Invocation Interface,DII)、Stubs方式和动态代理(Dynamic Proxy)方式。 #### 二、环境搭建与配置 在...
MyEclipse下开发Web Service(Axis)2 一、环境准备 在使用 Axis 开发 Web Service 时,需要准备 web 服务器和 Axis API。本文使用的 Web container 是 Tomcat5.5,Axis API 采用版本 2。为便于开发,需要 downloads...
Web Service WebService Axis一个完整的客户端代码
标题中的"web service Axis项目实例"表明我们将探讨使用Axis框架来创建和使用Web服务。Axis提供了从WSDL(Web Services Description Language)到Java代码的绑定,以及从Java类到WSDL的自动生成,简化了Web服务的...
【标题】:“Web Service(Axis) + Excel(Office 2003)”结合使用详解 在信息技术领域,Web服务是一种通过互联网交换数据的方式,它允许不同系统之间的应用程序进行交互。Apache Axis是Java环境中广泛使用的Web...
Web服务Axis 1.6是Apache软件基金会开发的一个开源工具,专门用于构建和部署Web服务。它是基于Java的,能够使开发者轻松地将现有业务逻辑转换为Web服务,或者消费其他发布的Web服务。在本文中,我们将深入探讨Axis ...
在这个"Web Service Axis1.4 完整的实例"中,我们将深入探讨Axis1.4版本的相关知识点。 首先,了解Axis1.4的基础概念至关重要。它是Apache Axis的第1.4个版本,主要支持SOAP(Simple Object Access Protocol)协议...
基于AXIS2实现Web Service开发是一项常见的任务,尤其在企业级应用中,Web Service作为不同系统间通信的重要桥梁。AXIS2是Apache软件基金会提供的一个轻量级、高性能的Web Service框架,它提供了完整的Web Service...
【标题】:Axis2与Eclipse整合开发的Web Service服务端详解 【描述】:本文将详细介绍如何在Eclipse环境中利用Axis2框架开发一个Web Service服务端,包括计算器服务CalculateService的实现步骤。 【标签】:Axis2,...
本文档将对Web Service Axis进行详细总结,并提供相关实例说明。 1. Web Service简介 Web服务是通过HTTP协议传输数据的一种方式,它利用SOAP(Simple Object Access Protocol)作为消息传输格式,WSDL(Web ...
Web Service (Axis 1.1) step by step.ppt 用AXIS开发webservice一步
Axis1.4可以与EJB(Enterprise JavaBeans)、Spring框架、JMS(Java Message Service)等其他Java技术无缝集成,扩大了Web服务的使用范围。 10. **性能优化**: 虽然Axis1.4相较于现代的Web服务框架(如Apache ...
【Axis Web Service】是一种基于Java的开源Web服务框架,它由Apache软件基金会开发,主要用于创建和部署Web服务。Axis提供了一种简单的方式来实现SOAP(Simple Object Access Protocol)通信,允许不同平台上的应用...
在MyEclipse中,选择"File" -> "New" -> "Other",然后在弹出的窗口中找到并选择"MyEclipse" -> "Web" -> "Axis2 Web Service"。在向导中填写项目名称,选择项目的保存位置,然后点击"Finish"。 4. **编写业务逻辑...
【Apache Axis2 Web Service 教程】 Apache Axis2 是一个流行的开源Web服务框架,用于创建、部署和管理高性能的Web服务。本教程将详细介绍如何在Eclipse环境中利用Apache Axis2搭建Web服务及其客户端。 **环境配置...