`
zydky
  • 浏览: 87629 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

【旧文】web service与axis(三)

阅读更多

五、利用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)

    ### MyEclipse下开发Web Service(Axis):深入解析与实践指南 #### 一、环境配置与准备 在深入探讨如何使用Apache Axis在MyEclipse环境下构建Web Services之前,首要任务是确保拥有一个完整的开发环境。这包括但不...

    Axis开发Web Service实例

    本文将详细介绍如何使用Apache Axis创建Web Service,并将重点介绍三种不同的方法:动态调用接口(Dynamic Invocation Interface,DII)、Stubs方式和动态代理(Dynamic Proxy)方式。 #### 二、环境搭建与配置 在...

    MyEclipse下开发Web Service(Axis)2

    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 WebService Axis一个完整的客户端代码

    web service axis项目实例

    标题中的"web service Axis项目实例"表明我们将探讨使用Axis框架来创建和使用Web服务。Axis提供了从WSDL(Web Services Description Language)到Java代码的绑定,以及从Java类到WSDL的自动生成,简化了Web服务的...

    Web Service(Axis) + Excel(Office 2003)

    【标题】:“Web Service(Axis) + Excel(Office 2003)”结合使用详解 在信息技术领域,Web服务是一种通过互联网交换数据的方式,它允许不同系统之间的应用程序进行交互。Apache Axis是Java环境中广泛使用的Web...

    web service axis 1.6

    Web服务Axis 1.6是Apache软件基金会开发的一个开源工具,专门用于构建和部署Web服务。它是基于Java的,能够使开发者轻松地将现有业务逻辑转换为Web服务,或者消费其他发布的Web服务。在本文中,我们将深入探讨Axis ...

    Web Service Axis完整的实例

    在这个"Web Service Axis1.4 完整的实例"中,我们将深入探讨Axis1.4版本的相关知识点。 首先,了解Axis1.4的基础概念至关重要。它是Apache Axis的第1.4个版本,主要支持SOAP(Simple Object Access Protocol)协议...

    基于AXIS2实现Web Service开发

    基于AXIS2实现Web Service开发是一项常见的任务,尤其在企业级应用中,Web Service作为不同系统间通信的重要桥梁。AXIS2是Apache软件基金会提供的一个轻量级、高性能的Web Service框架,它提供了完整的Web Service...

    Axis2与Eclipse整合开发的Web Service的服务端

    【标题】:Axis2与Eclipse整合开发的Web Service服务端详解 【描述】:本文将详细介绍如何在Eclipse环境中利用Axis2框架开发一个Web Service服务端,包括计算器服务CalculateService的实现步骤。 【标签】:Axis2,...

    web service axis 总结文档 相关实例说明

    本文档将对Web Service Axis进行详细总结,并提供相关实例说明。 1. Web Service简介 Web服务是通过HTTP协议传输数据的一种方式,它利用SOAP(Simple Object Access Protocol)作为消息传输格式,WSDL(Web ...

    Web Service (Axis 1.1) step by step.ppt

    Web Service (Axis 1.1) step by step.ppt 用AXIS开发webservice一步

    web service axis1.4 jar

    Axis1.4可以与EJB(Enterprise JavaBeans)、Spring框架、JMS(Java Message Service)等其他Java技术无缝集成,扩大了Web服务的使用范围。 10. **性能优化**: 虽然Axis1.4相较于现代的Web服务框架(如Apache ...

    axis web Service

    【Axis Web Service】是一种基于Java的开源Web服务框架,它由Apache软件基金会开发,主要用于创建和部署Web服务。Axis提供了一种简单的方式来实现SOAP(Simple Object Access Protocol)通信,允许不同平台上的应用...

    MyEclipse下开发Web Service(Axis2)

    在MyEclipse中,选择"File" -> "New" -> "Other",然后在弹出的窗口中找到并选择"MyEclipse" -> "Web" -> "Axis2 Web Service"。在向导中填写项目名称,选择项目的保存位置,然后点击"Finish"。 4. **编写业务逻辑...

    axis2 web service完整教学

    【Apache Axis2 Web Service 教程】 Apache Axis2 是一个流行的开源Web服务框架,用于创建、部署和管理高性能的Web服务。本教程将详细介绍如何在Eclipse环境中利用Apache Axis2搭建Web服务及其客户端。 **环境配置...

Global site tag (gtag.js) - Google Analytics