`

Web Service (Axis2实现)

 
阅读更多

转载from

http://wangyaobeijing.blog.163.com/blog/static/158330320103291151337/

http://zxs19861202.iteye.com/blog/630359

 

webservice的原理及概念

 

1 webservice

所谓webservice就是定义了一套标准的调用过程:

a 服务器首先用一套标准的方法向外界描述它所提供的服务的内容,就属于WSDL

b 客户端需要以一种标准的协议来调用此服务,这属于SOAP.

c 服务提供者将服务内容放在一个公共的网址让大家查询,就属于UDDI.

2 命名空间

命名空间其主要目的通过加一个命名属性,使名称保持唯一性。WSDL有大量的使用

命名空间的地方。本质上WSDL是一个XML文件,作为一个XML文件,为了区别同名的

元素,就需要采用命名空间的概念。

3 WSDL的本质:服务内容的标准化描述

WSDL的全称是web service Description Language,是一种基于XML格式的关于web服务

的描述语言。其主要目的在于web service的提供者将自己的web服务的所有相关内

容,如所提供的服务的传输方式,服务方法接口,接口参数,服务路径等,生成相应

的完全文档,发布给使用者。使用者可以通过这个WSDL文档,创建相应的SOAP请求消息

,通过HTTP传递给webservice提供者;web服务在完成服务请求后,将SOAP返回消息

传回请求者,服务请求者再根据WSDL文档将SOAP返回消息解析成自己能够理解的内容。

4 SOAP的本质:标准的传输协议

SOAP是web service的标准通信协议,SOAP为simple object access protocoll的

缩写,简单对象访问协议. 它是一种标准化的传输消息的XML消息格式。

5 UDDI的本质:服务的公共网址

将web service进行UDDI注册发布,UDDI是一种创建注册表服务的规范,以便大家将自己的

web service进行注册发布供使用者查找.

然而当服务提供者想将自己的web service向全世界公布,以便外部找到其服务时,那么

服务提供者可以将自己的web service注册到相应的UDDI商用注册网站,目前全球有

IBM等4家UDDI商用注册网站。

因为WSDL文件中已经给定了web service的地址URI,外部可以直接通过WSDL提供的

URI进行相应的web service调用。所以UDDI并不是一个必需的web service组件,服务

方完全可以不进行UDDI的注册。

 

---------------------------------------------------------------------------------------------------

 

Axis2是一套崭新的WebService引擎,该版本是对Axis1.x重新设计的产物。Axis2不仅支持SOAP1.1SOAP1.2,还集成了非常流行的REST WebService,同时还支持SpringJSON等技术。这些都将在后面的系列教程中讲解。在本文中主要介绍了如何使用Axis2开发一个不需要任何配置文件的WebService,并在客户端使用JavaC#调用这个WebService

一、Axis2的下载和安装

    读者可以从如下的网址下载Axis2的最新版本:

    http://ws.apache.org/axis2/

    在本文使用了目前Axis2的最新版本1.4.1。读者可以下载如下两个zip包:

    axis2-1.4.1-bin.zip

    axis2-1.4.1-war.zip

    其中axis2-1.4.1-bin.zip文件中包含了Axis2中所有的jar文件, axis2-1.4.1-war.zip文件用于将WebService发布到Web容器中。

    axis2-1.4.1-war.zip文件解压到相应的目录,将目录中的axis2.war文件放到<Tomcat安装目录>\webapps目录中(本文使用的Tomcat的版本是6.x),并启动Tomcat

    在浏览器地址栏中输入如下的URL

    http://localhost:8080/axis2/

    如果在浏览器中显示出如图1所示的页面,则表示Axis2安装成功。



图1


 

二、编写和发布WebService

  对于用Java实现的服务程序给人的印象就是需要进行大量的配置,不过这一点在Axis2中将被终结。在Axis2中不需要进行任何的配置,就可以直接将一个简单的POJO发布成WebService。其中POJO中所有的public方法将被发布成WebService方法。

    下面我们来实现一个简单的POJO,代码如下:

public class SimpleService
{
    
public String getGreeting(String name)
    {
        
return "你好 " + name;
    }    
    
public int getPrice()
    {
        
return new java.util.Random().nextInt(1000);
    }    
}

 

    SimpleService类中有两个方法,由于这两个方法都是public方法,因此,它们都将作为WebService方法被发布。

    编译SimpleService类后,将SimpleService.class文件放到<Tomcat安装目录>\webapps\axis2\WEB-INF\pojo目录中(如果没有pojo目录,则建立该目录)。现在我们已经成功将SimpleService类发布成了WebService。在浏览器地址栏中输入如下的URL

http://localhost:8080/axis2/services/listServices

    这时当前页面将显示所有在Axis2中发布的WebService,如图2所示。

 

    在浏览器地址栏中输入如下的两个URL来分别测试getGreetinggetPrice方法:

http://localhost:8080/axis2/services/SimpleService/getGreeting?name=bill

http://localhost:8080/axis2/services/SimpleService/getPrice

    3和图4分别显示了getGreetinggetPrice方法的测试结果。

 

图3  getGreeting方法的测试结果



 

 

 

图4  getPrice方法的测试结果



 

 

    在编写、发布和测试0配置的WebService时应注意如下几点:

    1. POJO类不能使用package关键字声明包。

    2. Axis2在默认情况下可以热发布WebService,也就是说,将WebService.class文件复制到pojo目录中时,Tomcat不需要重新启动就可以自动发布WebService。如果想取消Axis2的热发布功能,可以打开<Tomcat安装目录>\webapps\axis2\WEB-INF\conf\axis2.xml,找到如下的配置代码:

<parameter name="hotdeployment">true</parameter>

 

 

 

    true改为false即可。要注意的是,Axis2在默认情况下虽然是热发布,但并不是热更新,也就是说,一旦成功发布了WebService,再想更新该WebService,就必须重启Tomcat。这对于开发人员调试WebService非常不方便,因此,在开发WebService时,可以将Axis2设为热更新。在axis2.xml文件中找到<parameter name="hotupdate">false</parameter>,将false改为true即可。

    3. 在浏览器中测试WebService时,如果WebService方法有参数,需要使用URL的请求参数来指定该WebService方法参数的值,请求参数名与方法参数名要一致,例如,要测试getGreeting方法,请求参数名应为name,如上面的URL所示。

    4. 发布WebServicepojo目录只是默认的,如果读者想在其他的目录发布WebService,可以打开axis2.xml文件,并在<axisconfig>元素中添加如下的子元素:

 <deployer extension=".class" directory="my" class="org.apache.axis2.deployment.POJODeployer"/>

 

 

 

    上面的配置允许在<Tomcat安装目录>\webapps\axis2\WEB-INF\my目录中发布WebService。例如,将本例中的SimpleService.class复制到my目录中也可以成功发布(但要删除pojo目录中的SimpleService.class,否则WebService会重名)。

 

三、 Java实现调用WebService的客户端程序

    WebService是为程序服务的,只在浏览器中访问WebService是没有意义的。因此,在本节使用Java实现了一个控制台程序来调用上一节发布的WebService。调用WebService的客户端代码如下:

package client;

import javax.xml.namespace.QName;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;

public class RPCClient
{
    
public static void main(String[] args) throws Exception  
    {
        
//  使用RPC方式调用WebService        
        RPCServiceClient serviceClient = new RPCServiceClient();
        Options options 
= serviceClient.getOptions();
        
//  指定调用WebService的URL
        EndpointReference targetEPR = new EndpointReference(
                
"http://localhost:8080/axis2/services/SimpleService");
        options.setTo(targetEPR);
        
//  指定getGreeting方法的参数值
        Object[] opAddEntryArgs = new Object[] {"超人"};
        
//  指定getGreeting方法返回值的数据类型的Class对象
        Class[] classes = new Class[] {String.class};
        
//  指定要调用的getGreeting方法及WSDL文件的命名空间
        QName opAddEntry = new QName("http://ws.apache.org/axis2""getGreeting");
        
//  调用getGreeting方法并输出该方法的返回值
        System.out.println(serviceClient.invokeBlocking(opAddEntry, opAddEntryArgs, classes)[0]);
        
//  下面是调用getPrice方法的代码,这些代码与调用getGreeting方法的代码类似
        classes = new Class[] {int.class};
        opAddEntry 
= new QName("http://ws.apache.org/axis2""getPrice");
        System.out.println(serviceClient.invokeBlocking(opAddEntry, 
new Object[]{}, classes)[0]);
    } 
}

 

 

 

 

运行上面的程序后,将在控制台输出如下的信息:

 

你好 超人
443

    在编写客户端代码时应注意如下几点:

    1. 客户端代码需要引用很多Axis2jar包,如果读者不太清楚要引用哪个jar包,可以在Eclipse的工程中引用Axis2发行包的lib目录中的所有jar包。

    2. 在本例中使用了RPCServiceClient类的invokeBlocking方法调用了WebService中的方法。invokeBlocking方法有三个参数,其中第一个参数的类型是QName对象,表示要调用的方法名;第二个参数表示要调用的WebService方法的参数值,参数类型为Object[];第三个参数表示WebService方法的返回值类型的Class对象,参数类型为Class[]。当方法没有参数时,invokeBlocking方法的第二个参数值不能是null,而要使用new Object[]{}

    3. 如果被调用的WebService方法没有返回值,应使用RPCServiceClient类的invokeRobust方法,该方法只有两个参数,它们的含义与invokeBlocking方法的前两个参数的含义相同。

    4. 在创建QName对象时,QName类的构造方法的第一个参数表示WSDL文件的命名空间名,也就是<wsdl:definitions>元素的targetNamespace属性值,下面是SimpleService类生成的WSDL文件的代码片段:

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:ns1="http://org.apache.axis2/xsd"
xmlns:ns
="http://ws.apache.org/axis2" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl"
xmlns:http
="http://schemas.xmlsoap.org/wsdl/http/" xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:mime
="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:soap12
="http://schemas.xmlsoap.org/wsdl/soap12/"
targetNamespace
="http://ws.apache.org/axis2"
>
    
<wsdl:types>
         
    
</wsdl:types>
     
</wsdl:definitions>

 

四、用wsdl2java简化客户端的编写

    也许有很多读者会说“有没有搞错啊,只调用两个WebService方法用要写这么多代码,太麻烦了”。

    不过幸好Axis2提供了一个wsdl2java.bat命令可以根据WSDL文件自动产生调用WebService的代码。wsdl2java.bat命令可以在<Axis2安装目录>"bin目录中找到。在使用wsdl2java.bat命令之前需要设置AXIS2_HOME环境变量,该变量值是<Axis2安装目录>

    Windows控制台输出如下的命令行来生成调用WebService的代码:

%AXIS2_HOME%\bin\wsdl2java -uri http://localhost:8080/axis2/services/SimpleService?wsdl -p client -s -o stub

    其中-url参数指定了wsdl文件的路径,可以是本地路径,也可以是网络路径。-p参数指定了生成的Java类的包名,-o参数指定了生成的一系列文件保存的根目录。在执行完上面的命令后,读者就会发现在当前目录下多了个stub目录,在."stub"src"client目录可以找到一个SimpleServiceStub.java文件,该文件复杂调用WebService,读者可以在程序中直接使用这个类,代码如下:

package client;

import javax.xml.namespace.QName;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;

public class StubClient
{
    
public static void main(String[] args) throws Exception  
    {
        SimpleServiceStub stub 
= new SimpleServiceStub();
        SimpleServiceStub.GetGreeting gg 
= new SimpleServiceStub.GetGreeting();
        gg.setName(
"比尔");
        System.out.println( stub.getGreeting(gg).get_return());
        System.out.println(stub.getPrice().get_return());
    } 
}

 

 

    上面的代码大大简化了调用WebService的步骤,并使代码更加简洁。但要注意的是,wsdl2java.bat命令生成的Stub类将WebService方法的参数都封装在了相应的类中,类名为方法名,例如,getGreeting方法的参数都封装在了GetGreeting类中,要想调用getGreeting方法,必须先创建GetGreeting类的对象实例。

五、使用C#调用WebService

    从理论上说,WebService可以被任何支持SOAP协议的语言调用。在Visual Studio中使用C#调用WebService是在所有语言中最容易实现的(VB.net的调用方法类似,也同样很简单)。

    新建一个Visual Studio工程,并在引用Web服务的对话框中输入如下的URL,并输入Web引用名为“WebService”:

    http://localhost:8080/axis2/services/SimpleService?wsdl

    然后引用Web服务的对话框就会显示该WebService中的所有的方法,如图5所示。

 

 

    在完成上面的工作后,只需要如下三行C#代码就可以调用getGreetinggetPrice方法,并显示这两个方法的返回值:

WebService.SimpleService simpleService = new WSC.WebService.SimpleService();
MessageBox.Show( simpleService.getGreeting(
"比尔"));
MessageBox.Show(simpleService.getPrice().@return.ToString());

 

 

 

    .net解析WSDL文件时直接将getGreeting方法的参数映射为String类型,因此,可以直接进行传值。
    从上面的调用过程可以看出,添加Web引用的过程就相当于在Java中调用wsdl2java.bat自动生成stub类的过程。只是在调用stub类时与C#有一定的区别,但从总体上来说,都大大简化了调用WebService的过程。



图5


 


图2


 

 

分享到:
评论

相关推荐

    web service Axis2相关jar包

    在描述中提到的"web service Axis2相关jar 里面包含了Axis2 java调用.net接口所需jar包",这意味着这些jar包是为了使Java应用程序能够与使用.NET框架的系统进行互操作而准备的。由于Java和.NET之间存在平台差异,...

    Web Service Axis2

    Web Service Axis2-1.6.2框架使用 压缩包里有:文档说明,axis2-1.6.2-bin.zip、axis2-1.6.2-war.zip、axis2-eclipse-codegen-plugin-1.6.2.zip、axis2-eclipse-service-plugin-1.6.2.zip。文档里用的所有jar压缩包...

    web service Axis2教程

    ### Web Service Axis2 教程知识点详解 #### 一、Axis2简介 - **定义**:Axis2是一款基于Apache许可的开源WebService引擎,是Axis1.x的后续版本,旨在提供更高效、更灵活的服务框架。 - **特点**: - 支持SOAP 1.1...

    web service axis项目实例

    标签中的"Java"明确了编程语言,"web service"表示我们要处理的是基于HTTP协议的远程调用,而"axis"是实现这一目标的工具。Axis是Java Web服务栈的重要组成部分,它支持SOAP(Simple Object Access Protocol)和WSDL...

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

    Axis包括 Axis Server(用于托管Web服务)、Axis Client(用于调用Web服务)和Axis2(其下一代版本,提供更多的功能和性能改进)。 3. 创建Web Service 使用Axis创建Web服务涉及以下步骤: - 编写Java服务接口和...

    Web Service Axis完整的实例

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

    web service axis 1.6

    Web服务Axis 1.6是Apache软件基金会开发的一个开源工具...尽管现在已经有了更现代的Web服务框架,如Axis 2和其他基于JAX-WS的实现,但了解和掌握Axis 1.6的基本知识仍然对于理解Web服务的原理和技术历史具有重要意义。

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

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

    web service AXIS2_1.4

    Web服务在IT行业中扮演着至关重要的角色,它允许不同系统之间的数据交换和功能调用,而Apache Axis2是实现Web服务的一种强大框架。"AXIS2_1.4"是Axis2的一个特定版本,该版本为1.4,提供了一整套工具和服务基础设施...

    web service axis1.4 jar

    总的来说,"web service axis1.4 jar"是一组包含所有必要库文件的压缩包,用于在Java环境中构建和消费Web服务。通过理解和熟练运用这些库,开发者可以创建符合WS-I Basic Profile标准的、具有互操作性的Web服务,...

    axis2 web service完整教学

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

    web service axis2 最新 完整 jar包

    2. **生成服务描述**: Axis2可以自动生成WSDL(Web Service Description Language),这是一个XML文档,描述了服务的接口、方法、输入输出参数等信息。 3. **部署服务**: 将服务部署到Axis2服务器上,这可以通过...

    用axis2开发web service

    【用Axis2开发Web Service】是本文的核心主题,轴心技术是Java开发Web服务的一种框架,相较于Axis1,其过程更为简洁。以下是关于使用Axis2开发Web Service的详细步骤和知识点: 1. **实验环境搭建**: - 首先确保...

    Axis2快速构建Web Service ppt

    【Web Service简介】 Web Service是一种基于开放标准的、自包含且自...通过以上步骤,开发者可以快速地在Axis2上构建和部署Web Service,实现跨系统的通信。轴心轴2的特性使其成为开发高效、可扩展Web服务的理想选择。

    方便Web Service开发的axis2插件

    5. **创建Web Service**:使用Axis2插件,开发者可以轻松地生成服务接口和服务实现。只需提供WSDL文件或简单的Java类,插件就能自动生成服务部署档案(.aar文件)。 6. **服务部署**:生成的服务部署档案可以直接在...

    Axis开发Web Service实例

    ### Axis开发Web Service实例详解 #### 一、概述 在探讨如何使用Apache Axis来开发Web Service之前,我们首先需要了解一些基本概念。 **Web Service**是一种标准的技术框架,用于实现不同平台之间的应用通信。它...

    WebService大讲堂之Axis2及其它web service资料

    【WebService大讲堂之Axis2及其它Web Service资料】 在IT行业中,Web Service是一种通过互联网进行应用程序间交互的标准技术。它允许不同的系统之间共享数据和服务,不受编程语言、操作系统或硬件平台的限制。本...

    用Axis2创建Web Service

    【Apache Axis2 创建 Web Service 知识点详解】 Apache Axis2 是一个强大的 Web Service 框架,由 Apache 软件基金会开发,主要用于构建和部署高性能、高效率的 Web Services。它基于 Java 语言,提供了全面的 Web ...

    基于Tomcat5.0和Axis2开发Web Service应用实例

    【标题】基于Tomcat5.0和Axis2开发Web Service应用实例 在Web服务的世界里,Axis2是一个高效且强大的工具,它允许开发者创建、部署和使用SOAP Web服务。本教程将详细介绍如何利用Apache Tomcat 5.0作为应用服务器,...

Global site tag (gtag.js) - Google Analytics