webservice之axis

第一篇 开始axis之旅

1.下载axis.bin.zip和axis.war.zip

2.解压axis.war.zip将axis.war文件copy到你的服务器下,自动解压为axis2目录;对于java开发人员来说,这个应该知道吧。

3.在浏览器地址栏输入http://localhost:8080/axis2/,看到如下效果



 恭喜你,axis容器部署成功了!!!

4.新建一个包目录service1,在其下编写一个简单的POJO

package service1;

public class Hello
{
    public String hello(String name)
    {
        return "hello ," + name;
    }

}

进入cmd命令行, 

D:\>cd service1

D:\service1>javac Hello.java

5.新建文件夹META-INF,在其下编写service配置文件services.xml

<service name="Service1">
    <description>
        Service1
    </description>
    <messageReceivers>
        <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
            class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
        <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
            class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
    </messageReceivers>
	 <parameter name="ServiceClass">service1.Hello</parameter>
</service>

 6.新建目录temp,将上述service1和META-INF目录copy到temp。在cmd下cd temp...jar cvf hello.aar .(注意最后还有一个点),copy文件hello.aar到服务器目录\webapps\axis2\WEB-INF\services,服务器代码就OK啦!!!

看看效果吧。

浏览器地址栏输入:http://localhost:8080/axis2/services/listServices

点击相应的服务可以看到wsdl文件。

7.开始编写客户端吧

public static void main(String[] args)
    {
        try
        {
            RPCServiceClient client = new RPCServiceClient();
            Options opts = client.getOptions();
            EndpointReference epr = new EndpointReference("http://localhost:8080/axis2/services/Service1");
            opts.setTo(epr);
            Object[] param = new Object[] { "ruanzy" };
            Class[] classes = new Class[] { String.class };
            QName method = new QName("wsdl文件中的targetNamespace", "hello");
            Object[] result = client.invokeBlocking(method, param, classes);
            System.out.println(result[0]);
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }

  

控制台输出hello,ruanzy

webservice搞定啦。

第二篇 axis反向

所谓axis反向是指根据webservice的url或者wsdl文件,得到客户端和服务器端代码

先来看看怎么生成客户端代码吧。还记得第一篇下载的axis.bin.zip吗,解压后bin目录下有一些工具bat,其中wsdl2java.bat就是用来根据webservice的url或者wsdl文件,得到客户端和服务器端代码的。

为了方便调用我们需要设置环境变量AXIS_HOME=axis2的安装目录;添加path=%AXIS_HOME%/bin;

进入cmd命令行,WSDL2Java -uri  http://localhost:8080/axis2/services/Hello?wsdl或者wsdl文件的路径 -p client -s -o temp

将会在src/client下生成HelloStub.java,这个就是我们客户端调用时要用到了。

            HelloStub ss = new HelloStub();
            HelloStub.GetName gg=  new HelloStub.GetName();
            gg.setName("ruanzy");
            String ret = ss.getName(gg).get_return();
            System.out.println(ret);

 

控制台输出hello,ruanzy。和第一篇结果一样

第三篇 复合数据的处理

简单地说,axis支持数组,类和接口数据的处理。不过数组只支持一维数组,对于多维数组要变通一下。

如:String[] arr = new String[]{"a,b,c","d,e,f",...}; 

对于类和接口,最好采用序列化和反序列化来处理。先序列化为byte[],再反序列化...

 

第四篇 内部和服务之间的状态管理

   AXIS对于服务的状态管理是通过MessageContext以及

   服务内部(erviceContext)服务之间(ServiceGroupontext)来处理的。

   服务内部:service配置scope=transportsession

MessageContext messageContext = MessageContext.getCurrentMessageContext();
ServiceContext serviceContext = messageContext.getServiceContext();
通过serviceContext.setProperty(key, value)设值,通过serviceContext.getProperty(key)来取数据。

    服务之间:service配置scope=application

MessageContext messageContext = MessageContext.getCurrentMessageContext();
ServiceGroupContext serviceContext = messageContext.getServiceGroupContext();
以下和上面的设、取值一样 

第五篇 Spring和AXIS整合

    主要看一下services.xml吧

<service name= "SpringService" > 
    <description>simple spring example</description> 
    <parameter name= "ServiceObjectSupplier" > 
        org.apache.axis2.extensions.spring.receivers.SpringAppContextAwareObjectSupplier 
    </parameter> 
    <parameter name= "SpringBeanName" >springService</parameter> 
    <messageReceivers> 
        <messageReceiver mep= "http://www.w3.org/2004/08/wsdl/in-only" 
             class = "org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"  /> 
        <messageReceiver mep= "http://www.w3.org/2004/08/wsdl/in-out" 
             class = "org.apache.axis2.rpc.receivers.RPCMessageReceiver"  /> 
    </messageReceivers> 
</service>  

第六篇 ANT一键生成

<?xml version="1.0" encoding="UTF-8"?>
<project name="MyAXIS" default="wsdl2java" basedir=".">
	<property name="classes" value="../WebRoot/WEB-INF/classes/server" />
	<property name="temp" value="${basedir}/temp" />
	<property name="stub" value="${basedir}/stub" />
	<property name="services" value="D:/Program Files/apache-tomcat-5.5.26/webapps/axis2/WEB-INF/services" />
	<target name="init">
		<echo>创建临时目录</echo>
		<mkdir dir="${temp}" />
		<mkdir dir="${temp}/META-INF" />
	</target>
	<target name="aar" depends="init">
		<echo>压缩到aar包</echo>
		<copy todir="${temp}">
			<fileset dir="../WebRoot/WEB-INF/classes">
				<include name="**/**" />
			</fileset>
		</copy>
		<copy file="${basedir}/services.xml" tofile="${temp}/META-INF/services.xml" />
		<jar basedir="${temp}" destfile="${services}/service.aar" />
		<delete dir="${temp}" />
	</target>

	<target name="restar" depends="aar">
		<echo>重启服务器</echo>
		<exec dir="D:/Program Files/apache-tomcat-5.5.26/bin" executable="cmd">
			<env path="D:/Program Files/apache-tomcat-5.5.26" key="CATALINA_HOME" />
			<arg value="/C startup.bat" />
		</exec>
	</target>

	<target name="wsdl2java" depends="restar">
		<waitfor>
			<http url="http://localhost:8080/axis2/services/SayHello?wsdl" />
		</waitfor>
		<echo>生成客戶桩</echo>
		<exec dir="D:/workspace" executable="cmd">
			<arg value="/c" />
			<arg value="WSDL2Java" />
			<arg value="-uri" />
			<arg value="http://localhost:8080/axis2/services/SayHello?wsdl" />
			<arg value="-p" />
			<arg value="stub" />
			<arg value="-s" />
			<arg value="-o" />
			<arg value="wstest" />
		</exec>
		<delete file="D:/workspace/wstest/build.xml" />
	</target>
</project>

 

猜你喜欢

转载自rzy.iteye.com/blog/1084483