`
damiao_cn
  • 浏览: 87735 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

使用Axis2开发webservice

    博客分类:
  • J2EE
阅读更多
最近公司的项目中有一个应用:网络银行系统向网银中绑定动态口令成功的客户发一条短信息,而我所在的银行为了集成各个渠道的应用访问,开发了一套EAI系统,将需要的接口都以webservice的形式发布到EAI上,供银行统一规划调度。
进过这段时间开发中的瞎摸乱撞,对使用axis2开发webservice有了一点初步的认识:

首先,本篇博客对于webservice和axis2的文字解释就不再赘述,google百度有很多,也很官方,我只是说一下我自己的理解:
webservice是目前实现异构系统之间相互调用和访问的机制(传输的协议是SOAP,传输内容的格式是xml),.NET框架已经封装了WebService实现,axis和axis2是基于java语言的开源WebService实现(axis1.3是soap1.2协议的一个实现框架)
对于你而言,你不用太关注webservice本身的理论和核心机制,你如果用.net,只需要看看Visual Studio中webservice是如何编程实现的即可,如果用J2EE,只需要看看Axis的部署说明就可以了

好,我们言归正传,我下面的文章建立在对上面两个概念有一个初步认识的前提下,一步步的开发一个基于axis2的webservice实例应用
J2SE SDK 1.3 or 1.4: 我使用 1.4.2 ,Tomcat 5.0

1搭建axis2环境
把axis2.war拷贝到Tomcat 5.0\webapps\目录下
启动Tomcat,访问http://localhost:8080/axis2/
显示Welcome to the new generation of Axis. If you can see this page you have successfully deployed the Axis2 Web Application
在此页面点击Validate,将到达 Axis2 Happiness Page,则说明你的axis2部署成功

2开发工具
环境搭建好了,下面就该是找到一个合适的开发利器了,我使用的是MyEclipse6.0.1,在这里我之所以废话说我开发的IDE,原因有2:首先,我比较懒,懒得连插件都不想去下载安装,MyEclipse中自带的Ant能很大程度上减少我们程序员的重复代码量,而且Ant通过build.xml生成的文件又标准又容易控制,第二,对于服务器而言,我们公司通用的开发IDE是IBM的WSAD6.0也叫RAD(Rational Application Developer),使用他开发起来实在是麻烦,而且集成的WebSphere远远不如Tomcat对初学者来说使着顺手快捷

3配置好build.xml
我这个例子的配置文件如下:
<!--
  ~ Licensed to the Apache Software Foundation (ASF) under one
  ~ or more contributor license agreements. See the NOTICE file
  ~ distributed with this work for additional information
  ~ regarding copyright ownership. The ASF licenses this file
  ~ to you under the Apache License, Version 2.0 (the
  ~ "License"); you may not use this file except in compliance
  ~ with the License. You may obtain a copy of the License at
  ~
  ~ http://www.apache.org/licenses/LICENSE-2.0
  ~
  ~ Unless required by applicable law or agreed to in writing,
  ~ software distributed under the License is distributed on an
  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  ~ KIND, either express or implied. See the License for the
  ~ specific language governing permissions and limitations
  ~ under the License.
  -->
<project name="quickstartadb" basedir="." default="generate.service">

    <property environment="env"/>
    <property name="AXIS2_HOME" value="D:\workspace_MyEclipse6.0.1\BWS"/>

	
	<property name="service.target" value="build/service"/>
    <property name="client.target" value="build/client"/>

    <property name="build.dir" value="build"/>
	<property name="wsdl.uri" value="${build.dir}/TestQuery.wsdl"/>

    <path id="axis2.classpath">
        <fileset dir="${AXIS2_HOME}/lib">
            <include name="*.jar"/>
        </fileset>
    </path>
    <path id="client.class.path">
        <fileset dir="${AXIS2_HOME}/lib">
            <include name="*.jar" />
        </fileset>
        <fileset dir="${build.dir}/client/build/lib" >
            <include name="*.jar" />
        </fileset>
    </path>

    <target name="init">
        <mkdir dir="${build.dir}"/>
        <mkdir dir="${build.dir}/service"/>
        <mkdir dir="${build.dir}/client"/>
    </target>
	
	<target name="compile.pojo">
	        <mkdir dir="${build.dir}"/>
	        <mkdir dir="${build.dir}/classes"/>

	        <!--First let's compile the classes-->
	        <javac debug="on" 
	               fork="true"
	               destdir="${build.dir}/classes" 
	               srcdir="${basedir}/src"
	               classpathref="axis2.classpath">
	        </javac>
	</target>
	
    <target name="generate.wsdl" depends="compile.pojo">
        <taskdef name="java2wsdl"
                 classname="org.apache.ws.java2wsdl.Java2WSDLTask"
                 classpathref="axis2.classpath"/>
        <java2wsdl className="cn.com.leadmind.cbhb.webservice.server.TestQuery"
                   outputLocation="${build.dir}"
                   targetNamespace="http://server.webservice.cbhb.leadmind.com.cn"
                   schemaTargetNamespace="http://server.webservice.cbhb.leadmind.com.cn">
            <classpath>
                <pathelement path="${axis2.classpath}"/>
                <pathelement location="${build.dir}/classes"/>
            </classpath>
        </java2wsdl>
    </target>

	<target name="generate.service">
        <delete dir="${service.target}"/>
        <mkdir dir="${service.target}"/>
        <mkdir dir="${service.target}/classes"/>
        <java classname="org.apache.axis2.wsdl.WSDL2Java" fork="true" classpathref="axis2.classpath">
            <arg line="-uri ${wsdl.uri}"/>
			<arg line="-s"/>
            <arg line="-ss"/>
            <arg line="-sd"/>
			<arg line="-ssi"/>
            <arg line="-ap"/>
			<arg line="-ns2p http://quickstart.samples/xsd=samples.quickstart.service.adb.xsd"/>
			<arg line="-l java"/>
            <arg line="-p cn.com.leadmind.cbhb.webservice.server"/>
            <arg line="-d adb"/>
            <arg line="-o ${build.dir}/service"/>
        </java>
        		<mkdir dir="${service.target}/src/META-INF"/>
                <!--ant dir="${build.dir}/service">
            <property name="axis2.home" value="../../${AXIS2_HOME}"/>
        </ant> 
		<copy file="${basedir}/build/service/build/lib/StockQuoteService.aar"
              toDir="${basedir}/../../repository/services"
              overwrite="yes">
        </copy-->
    </target>
	
	
	   <target name="compile.service" >
	   	<!--depends="generate.service"-->
	        <mkdir dir="${service.target}/classes"/>
	        <!--First let's compile the classes-->
	        <javac debug="on" 
	               fork="true"
	               destdir="${service.target}/classes" 
	               srcdir="${service.target}/src"
	               classpathref="axis2.classpath">
	        </javac>
	   		<mkdir dir="${service.target}/classes/META-INF"/>
	   	    <copy file="${service.target}/resources/services.xml"
	   	          toDir="${service.target}/classes/META-INF"
	   	          overwrite="yes">
	   	    </copy>
	   </target>
	
	 <target name="aar.service" depends="compile.service">
	        <!--aar them up -->
	        <jar destfile="${build.dir}/billService.aar">
	            <fileset excludes="**/Test.class" dir="${service.target}/classes"/>
	        </jar>
	 </target>
	
	

    <target name="generate.client">
		<delete dir="${client.target}"/>
		<mkdir dir="${client.target}"/>
         <java classname="org.apache.axis2.wsdl.WSDL2Java" fork="true" classpathref="axis2.classpath">
            <arg line="-uri ${wsdl.uri}"/>
			<arg line="-s"/>
         	<arg line="-u"/>
            <arg line="-ns2p http://quickstart.samples/xsd=samples.quickstart.service.adb.xsd"/>
			<arg line="-l java"/>
            <!--arg line="-p samples.quickstart.service.adb"/-->
            <arg line="-d adb"/>
            <arg line="-o ${build.dir}/client"/>
        </java>
        <!--copy file="${basedir}/src/samples/quickstart/clients/ADBClient.java"
              toDir="${build.dir}/client/src/samples/quickstart/clients/"
              overwrite="yes">
        </copy-->
        <!--ant dir="${build.dir}/client">
            <property name="axis2.home" value="../../${AXIS2_HOME}"/>
        </ant-->
		
    </target>

    <target name="generate.all" depends="generate.service, generate.client"/>

    <target name="run.client" depends="generate.client">
        <java classname="samples.quickstart.clients.ADBClient">
            <classpath refid="client.class.path" />
        </java>
    </target>

    <target name="clean">
        <delete dir="${build.dir}"/>
    </target>
</project>


别看他挺长挺吓人的,其实仔细看起来并不复杂,无外乎就是些你axis2的lib包的路径,或是你生成wsdl文件对应的java类的路径之类的

4生成wsdl文件
一个基本的pojo类A,含一些成员和方法(将来会在客户端调这几个方法),在build.xml的Outline视图中右键generate.wsdl,按要求修改wsdl文件,比如修改生成的客户端或服务端的类名等
我这里的pojo例子如下:
package cn.com.leadmind.cbhb.webservice.server;

public class TestQuery {
	String billno;

	public String getBillno() {
		return billno;
	}

	public void setBillno(String billno) {
		this.billno = billno;
	}
}


5生成server端的.java文件
在build.xml的Outline视图中右键generate.service,控制台显示build successful后会生成对应于A的一些service提供类(服务提供类包括目录结构也和A完全一样)
在例子中,我们生成了如下的一些类:
ExtensionMapper.java
GetBillnoResponse.java
SetBillno.java
SetBillno.java
TestQueryMessageReceiverInOnly.java
TestQueryMessageReceiverInOut.java
TestQuerySkeletonInterface.java
TestQuerySkeleton.java
嘿嘿,是不是爽啊,一个字不敲,生成了这么多服务端的类,替你完成了很多工作,比如拆解soap信封,对象封装之类,而你需要关注的,也只有一个类:那就是TestQuerySkeleton.java,下面,就轮到我们程序员出马拉~~

6webservice服务端编程
我们先来个简单的HAxis2 Hello例子
TestQuerySkeleton.java代码如下:
package cn.com.leadmind.cbhb.webservice.server;

public class TestQuerySkeleton implements TestQuerySkeletonInterface {

    public void setBillno(
        cn.com.leadmind.cbhb.webservice.server.SetBillno setBillno1) {
    }

    public cn.com.leadmind.cbhb.webservice.server.GetBillnoResponse getBillno() {
    	GetBillnoResponse s = new GetBillnoResponse();
    	s.set_return("TestQuerySkeleton.java Say:Axis2 Hello!");
    	return s;
    }
}


7将服务程序打包为aar文件并部署在服务器上
在build.xml的Outline视图中右键aar.service,会在项目中生成service提供类的aar文件,启动服务器(前提是已经在服务器中部署了axis2的环境),然后访问IE:http://localhost:8080/axis2/,点击页面的Administration,输入用户名admin密码axis2,选择左侧的Tools中的Upload Service,Upload刚才生成的aar文件(忙活半天其实就是把这个aar文件拷贝到Tomcat服务器目录的Tomcat 5.0\webapps\axis2\WEB-INF\services目录下),这样,webservice的service端就已经就绪

8生成client端的.java文件
服务已经提供好了,下面该是如何调用这个服务了
在build.xml的Outline视图中右键generate.client,控制台显示build successful后会生成对应于A的一些webservice服务的客户端调用类(目录结构和A完全一样)。在client端建立一个项目(什么都行),将刚才生成的webservice服务的客户端调用类连同目录结构一并拷贝过来,然后开始webservice客户端编程

9webservice客户端编程
在生成的服务调用类中,最重要的是*Stub.java类,其他生成的类都是对应与这个类中的各个方法的,将生成的所有服务调用类放于client端的项目中,Stub就相当于一个存根,当client端调用webservice端的方法时,首先会调用client端本地项目的Stub.java中的对应方法,然后Stub在通过soap以信封xml的方式通过网络发到服务器即server端,aar文件中对应于刚才调用方法名字的*Skeleton.java类的对应方法就会执行,如果方法是InOut模式,还将返回一个值给客户端
例子中,我的调用测试类如下:
package cn.com.leadmind.cbhb.webservice.server;

public class Test {
	public static void main(String[] args)throws Exception{
		TestQueryStub tqs = new TestQueryStub();
		GetBillnoResponse s = tqs.getBillno();
		System.out.println(s.get_return());
		
	}
}


10成果
刚才的步骤5已经将webservice服务的aar文件发布到Tomcat中去了,现在启动Tomcat,相当于webservice服务已经开启。在客户端运行的你的程序,调用你本地项目的*Stub.java类的方法,这个过程就完成了webservice通讯
7
0
分享到:
评论
7 楼 damiao_cn 2009-02-08  
jiao_098 写道

我是一个axis2的初学者,最近也是要写java的WebService. 我想问一下,那个build.xml是生成的吗? 怎么生成的啊? 不会是手写的吧? 我查到有另外一种写法是说,先写好服务端程序,然后通过axis2生成.arr文件,然后发布成wsdl,再通过一个命令,命令如下: D:\tools\axis2-1.4.1\bin&gt; wsdl2java.bat -uri http://localhost:8080/axis2/services/HelloUser?wsdl -o D:\workspace\WSjava 然后生成两个文件分别是: *Stub和*CallbackHandler 还有一个build.xml文件 客户端调用的时候也是像LZ写的那样,通过*Stub对象调用. 我试了一下,客户端调用结果正确 但是LZ那生成了那么多类(ExtensionMapper.java GetBillnoResponse.java SetBillno.java SetBillno.java TestQueryMessageReceiverInOnly.java TestQueryMessageReceiverInOut.java TestQuerySkeletonInterface.java TestQuerySkeleton.java )这些都有用吗? 我那种方法不知道对不对? 还请LZ回复一下,谢谢


我个人理解build.xml文件的作用是方便我们统一通过Ant等工具部署发布应用(即没有这个文件我们照样可以通过其他方式来完成build.xml所做的工作),例子中build.xml文件是从其他webservice例子中抄过来修修补补而成的,呵呵,我可没能力手写这玩意。至于兄弟的另一种写法来实现webservice完全没有问题,好像webservice最初的开发就是这样生成存根的。至于生成那么一堆类有没有用,我觉得生成的那一堆类是对最后我们调用的stub类中的一些类的上层封装,你直接写webservice,不使用那些封装类的话,生成的那一堆别的类就没什么用
6 楼 jiao_098 2009-02-04  
不好意思,补充一下.
*Stub和*CallbackHandler都是java文件
5 楼 jiao_098 2009-02-04  
我是一个axis2的初学者,最近也是要写java的WebService.
我想问一下,那个build.xml是生成的吗? 怎么生成的啊? 不会是手写的吧?

我查到有另外一种写法是说,先写好服务端程序,然后通过axis2生成.arr文件,然后发布成wsdl,再通过一个命令,命令如下:
D:\tools\axis2-1.4.1\bin> wsdl2java.bat -uri http://localhost:8080/axis2/services/HelloUser?wsdl -o D:\workspace\WSjava
然后生成两个文件分别是:
*Stub和*CallbackHandler
还有一个build.xml文件

客户端调用的时候也是像LZ写的那样,通过*Stub对象调用.
我试了一下,客户端调用结果正确
但是LZ那生成了那么多类(ExtensionMapper.java
GetBillnoResponse.java
SetBillno.java
SetBillno.java
TestQueryMessageReceiverInOnly.java
TestQueryMessageReceiverInOut.java
TestQuerySkeletonInterface.java
TestQuerySkeleton.java )这些都有用吗?

我那种方法不知道对不对? 还请LZ回复一下,谢谢
4 楼 damiao_cn 2008-12-20  
dragonccc 写道

错误改正了&nbsp; 但是我看别的文章都有OMELEMENT 这个&nbsp; 楼主为什么没用到呢??能不能回复我 或者联系我呢 QQ 372572941

OMELEMENT对象是webservice比较底层的一个对象,也是一个axis必须用到的对象。自己在类里写完全可以,只是我在工作中发现很少有公司会自己手写这些,而是绝大多数代码都通过build.xml文件生成,把精力都放在业务逻辑的开发上。我这个例子并非没有OMELEMENT对象,只是通过build.xml把代码已经生成好了,呵呵,例子的第8步骤,生成client端的.java文件,其中有一个比较重要的类TestQueryStub,里面就有你说的OMElement,只不过生成的代码很标准,都是org.apache.axiom.om.OMElement
3 楼 dragonccc 2008-12-19  
错误改正了  但是我看别的文章都有OMELEMENT 这个  楼主为什么没用到呢??能不能回复我 或者联系我呢 QQ 372572941
2 楼 dragonccc 2008-12-19  
我出现了几个错误 郁闷着呢
1 楼 czwlucky 2008-11-03  
非常不错,找了这么多例子,您的是惟一能运行的例子

相关推荐

    使用axis2 开发webservice

    知识点:使用Apache Axis2开发高质量Web服务 一、Apache Axis2简介 Apache Axis2是Apache软件基金会维护的一个开源Web服务框架,它支持多种协议(如SOAP/HTTP, SOAP/JMS, REST/HTTP等),并提供了丰富的特性,如...

    axis2包 使用axis2开发webservice需要的jar包

    本篇文章将详细解释如何使用Axis2来开发Web服务,并围绕提供的jar包进行深入讨论。 首先,了解 Axis2 的核心概念。Axis2 是基于 Axis1 进行优化和改进的,它采用了模块化的设计,允许开发者根据需求选择必要的组件...

    axis2_WebService_开发指南

    Axis2_WebService_开发指南详细介绍了如何使用Axis2开发WebService。 首先,在进行Axis2的准备工作时,需要下载Axis2的相关jar包,这些依赖包可以在Axis2的官方网站上找到。截至文档提供的信息,最新的版本是1.5.4...

    Axis2开发webservice总结

    Axis2开发webservice总结,资源一般,希望对大家有用

    Java-tomcat-axis2开发webservice返回json数据

    标题“Java-tomcat-axis2开发webservice返回json数据”涉及的是使用Java、Tomcat服务器以及Axis2框架来创建Web服务,并返回JSON格式的数据。这是一个常见的技术组合,用于构建RESTful API或者提供服务化接口。下面...

    axis2开发webservice

    标题 "Axis2 开发 WebService" 指的是使用 Apache Axis2 框架在 Eclipse 集成开发环境中创建和部署 WebService 的过程。Apache Axis2 是一个强大的 WebService 引擎,它提供了高性能、灵活且可扩展的架构,支持多种...

    axis2发布webservice和调用axis2服务接口

    1. **创建WebService**:在Axis2中,可以通过编写一个简单的Java类并暴露其方法作为Web服务接口。这个类通常会遵循SOAP协议,定义服务操作。例如,你可以创建一个名为`HelloWorldService`的类,包含一个`sayHello`...

    基于axis2实现的webservice简单实现(客户端+服务端)。

    【标题】中的“基于axis2实现的webservice简单实现(客户端+服务端)”表明了本文将探讨如何使用Apache Axis2框架来创建和消费Web服务。Apache Axis2是Apache软件基金会开发的一个Web服务引擎,它提供了高效且灵活的...

    Axis2开发webservice总结.doc

    【摘要】:本文档主要总结了使用Axis2框架开发Web服务的相关知识,包括Web服务技术介绍、开发流程、必要的开发前准备以及具体的开发实例。 【详细内容】: 1. **Web Service技术介绍** Web服务是一种基于互联网的...

    axis2开发webservice(二)

    资源包含了:axis2-1.7.4-bin.zip、axis2-1.7.4-war.zip、axis2-eclipse-...备注:资源超过了70M 分成了3部分 见axis2方式开发webservice(一)和 axis2方式开发webservice(二)、 axis2方式开发webservice(三)

    axis2组建webservice,客户端必须的jar包

    - `axiom-impl-1.2.12.jar`:AXIOM(Abstract eXtensible Information Model)是Axis2使用的XML信息模型,用于处理SOAP消息。 - `XmlSchema-1.4.7.jar`:实现了XML Schema解析器,用于验证XML文档是否符合指定的...

    eclipse axis webservice 开发

    eclipse axis webservice 开发 eclipse下使用axis2 开发webservice系统

    Spring集成axis2实现webservice所用到的包

    4. **部署和发布服务**:如果我们要在Spring中发布一个Web服务,可以使用Axis2的`SpringServiceDeployer`。这需要将服务类和相关的配置文件打包成一个Axis2模块(.aar文件),然后部署到Axis2服务器上。 5. **测试...

    axis2开发webservice心得

    ### Axis2 开发WebService心得 在进行WebService的开发过程中,特别是在使用Axis2框架时,往往会遇到各种挑战与难题。本文将结合实践经验,分享在使用Axis2进行WebService开发时的一些心得和解决方案,希望能够帮助...

    axis2实现webservice

    ### Axis2实现WebService知识点 #### 一、Axis2简介 - **定义**:Apache Axis2是基于Java的一个开源的WebService框架,它支持...这为开发者提供了一个清晰的指南,帮助他们更好地理解和使用Axis2进行WebService开发。

Global site tag (gtag.js) - Google Analytics