写在前面
在工作中经常会遇到与其他系统进行数据交互的问题,一般来说,系统间常用的对接技术有1.普通HTTP/HTTPS通讯协议;2.基于HTTP/HTTPS协议的WebService或SOAP方式通讯;3.普通Socket方式通讯;4.数据库共享数据方式;5.其他方式。由于各个系统实现语言不同等问题,多数系统提供的接口会采用WebService或数据库方式。对于数据量大、占用系统资源较多的数据一般采用数据库的方式进行数据更新,例如系统中的员工信息等主数据;而对于实时性要求较高、数据量较小的数据则会使用WebService的方式,对于java开发WebService来说,现在已经有JWS、Axis/Axis2、XFire和CXF这4种很成熟的框架供我们选择。而在项目中,笔者使用了Axis2进行开发。
为什么使用Axis?
1.支持多语言。Axis除了支持java外,还支持C/C++等多种变成语言。
2.更灵活。Axis允许自己作为独立的应用来发布WebService,并且可以根据需求的增减相应的增减不同的功能。
3.开源。严格来说这一点不能算是Axis独有的优势,CXF也是开源的,这两种常用的技术在网上都有很多教程。
4.拥有实例。在同事中有过使用Axis的先例,在有经验的人的指导下,开发速度相对会很快。
开发环境
本文使用java 1.6.0_45版本,Eclipse 进行开发,Axis2使用1.4版本。
使用步骤
Axis既可以用来生成客户端调用代码,也可以发布WebService应用。
关于Axis,官方提供了四种类型的包,分别为二进制包、war包、文档包和源代码包。二进制包主要是一些jar包和相关实例程序;war包可以作为web应用部署在服务器中的服务包,它是Axis提供的服务管理的工具类web应用;文档包和源码包不再多说。
使用Axis2发布WebService应用
1.在Eclipse中新建一个Web工程AxisTestServer;
2.src目录下新建包及java类,代码如下。
package com.pansoft.axis;
public class AxisTest {
public String test(String pInputParam){
return "AxisServer:"+ pInputParam;
}
}
3.右键工程,新建一个WebService
4.在弹出的窗口中按下图选择需要发布的类。
如果需要选择要发布的方法,可点击Next进行勾选,否则直接点击Finish即可发布。
5.发布成功后会在WebContent(或WebRoot)目录下的wsdl目录生成一个.wsdl文件,文件名与发布的类名相同。
AxisTest.wsdl文件内容如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="http://axis.pansoft.com" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://axis.pansoft.com" xmlns:intf="http://axis.pansoft.com" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<!--WSDL created by Apache Axis version: 1.4
Built on Apr 22, 2006 (06:55:48 PDT)-->
<wsdl:types>
<schema elementFormDefault="qualified" targetNamespace="http://axis.pansoft.com" xmlns="http://www.w3.org/2001/XMLSchema">
<element name="test">
<complexType>
<sequence>
<element name="pInputParam" type="xsd:string"/>
</sequence>
</complexType>
</element>
<element name="testResponse">
<complexType>
<sequence>
<element name="testReturn" type="xsd:string"/>
</sequence>
</complexType>
</element>
</schema>
</wsdl:types>
<wsdl:message name="testRequest">
<wsdl:part element="impl:test" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="testResponse">
<wsdl:part element="impl:testResponse" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:portType name="AxisTest">
<wsdl:operation name="test">
<wsdl:input message="impl:testRequest" name="testRequest">
</wsdl:input>
<wsdl:output message="impl:testResponse" name="testResponse">
</wsdl:output>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="AxisTestSoapBinding" type="impl:AxisTest">
<wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="test">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="testRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="testResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="AxisTestService">
<wsdl:port binding="impl:AxisTestSoapBinding" name="AxisTest">
<wsdlsoap:address location="http://localhost:8080/AxisTestServer/services/AxisTest"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
关于wsdl文件的读法此处不再叙述,需要注意的是wsdl文件是
从下向上读的。
在wsdl文件最后可以发现wsdl的地址,启动服务后,通过访问
http://localhost:8080/AxisTestServer/services/AxisTest?wsdl
会显示此wsdl文件的内容。
如何调用这个WebService呢?除了用Axis调用之外,还可以使用工具进行调用,在这里,笔者用SOAP UI进行调用。
首先,在SOAP UI中新建一个Project,选中项目,按右键添加wsdl
在弹窗中输入wsdl地址,点击完成;
至此,使用SOAP UI调用WebService方法结束。
使用Axis调用WebService
#Axis路径
set Axis_Lib=D:\axis-1_4\lib
set Java_Cmd=java -Djava.ext.dirs=%Axis_Lib%
#输出路径
set Output_Path=D:\AxisTest
#输出的包名
set Package=com.pansoft.axis
%Java_Cmd% org.apache.axis.wsdl.WSDL2Java -o%Output_Path% -p%Package% http://localhost:8080/AxisTestServer/services/AxisTest?wsdl
这里我是用批处理命令生成客户端调用代码,Eclipse中也有相应插件,但是由于版本等问题,生成时报错,暂未找到相应的解决办法,这里就不列出使用插件调用的方式了。
生成成功之后可以看到生成的类,如下图。
其中,AxisTestSoapBindingStub类为具体实现类,AxisTest_PortType为其接口类,参数配置类为AxisTestServiceLocator,AxisTestService类为其接口类。下面是具体的调用代码:
public static void main(String[] args) throws ServiceException, RemoteException {
// TODO Auto-generated method stub
AxisTestServiceLocator locator = new AxisTestServiceLocator();
AxisTestSoapBindingStub bis = (AxisTestSoapBindingStub) locator.getAxisTest();
String pRet = bis.test("test");//输入的参数
System.out.println(pRet);
}
启动服务,执行方法后会在控制台输出服务器端返回的信息。