到目前开发webservice有很多的插件了,比如:axis2,mf等,我个人觉还是axis2比较好用一些。可以从网站上下载axis2:
Apache Axis2 是Axis的后续版本,是新一代的SOAP引擎。Axis2的主要特点有:
1)采用名为 AXIOM(AXIs Object Model)的新核心 XML 处理模型,利用新的XML解析器提供的灵活性按需构造对象模型。
2)支持不同的消息交换模式。目前Axis2支持三种模式:In-Only、Robust-In和In-Out。In-Only消息交换模式只有 SOAP请求,而不需要应答;Robust-In消息交换模式发送SOAP请求,只有在出错的情况下才返回应答;In-Out消息交换模式总是存在 SOAP请求和应答。
3)提供阻塞和非阻塞客户端 API。
4)支持内置的 Web服务寻址 (WS-Addressing) 。
5)灵活的数据绑定,可以选择直接使用 AXIOM,使用与原来的 Axis 相似的简单数据绑定方法,或使用 XMLBeans、JiBX 或 JAXB 2.0 等专用数据绑定框架。
6)新的部署模型,支持热部署。
7)支持HTTP,SMTP,JMS,TCP传输协议。
8)支持REST (Representational State Transfer)。
5.Axis2 支持的规范包括:
-SOAP 1.1 and 1.2
-Message Transmission Optimization Mechanism (MTOM), XML Optimized Packaging (XOP) and SOAP with Attachments
-WSDL 1.1, including both SOAP and HTTP bindings
-WS-Addressing (submission and final)
-WS-Policy
-SAAJ 1.1
1、怎么使用axis2网上有很多的资料,我在这里就不多加说明了,随便一搜一大堆。在这里想说明的就是耶可以不借助eclipse插件耶可以打包(*.aar)部署。
把axis2.war包解压可以看到 :
+-example
|-------- +-sample
|------- ×××.class【是生成的.class文件不是.java 文件目录】
|---------+-META-INF
|------- services.xml
2、其中有一个services.xml
services.xml 此文件用于注册服务器端程序中的公有对外方法类型,以及描述信息,典型地,一个services.xml的文档结构如下:
xml 代码
<service name="HelloWorldService" scope="application">
<description>Hello World Service</description>
<operation name="getHelloWorldMs">
<messageReceiver class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver" />
</operation>
<operation name="setHelloWorldMs">
<messageReceiver class="org.apache.axis2.receivers.RawXMLINOnlyMessageReceiver" />
</operation>
<operation name="getDownloadConfirm">
<messageReceiver class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver" />
</operation>
<parameter name="ServiceClass">samples.helloworld.service.axiom.HelloWorldService</parameter>
</service>
其中的ServiceClass是必须参数,用来指明operation所在的ServiceClass(<!-- ServiceClass指定Java Class的位置,即实现服务的类。 -->)
<parameter name="ServiceClass">samples.helloworld.service.axiom.HelloWorldService</parameter>
其中的messageReceiver类型可以分为2类,如果ServiceClass 中的方法有返回值则messageReceiver 采用IN-OUT模式,如果没有返回值则采用IN模式,相应地其客户端的调用方式也会有所不同。在IN-OUT模式下,采用sendReceive方法将数据发送到服务器段,服务器端在收到信息后将处理后的结果交给sendReceive ;在IN模式下,使用 fireAndForget 方法,调用此方法后,服务器端不会将处理结果返回给客户端
xml 代码
<!-- operation 与Java Class中方法名对应。 -->
<operation name="getHelloWorldMs">
<messageReceiver class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver" />
</operation>
<operation name="setHelloWorldMs">
<messageReceiver class="org.apache.axis2.receivers.RawXMLINOnlyMessageReceiver" />
</operation>
<operation name="getDownloadConfirm">
<messageReceiver class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver" />
</operation>
3、一个WSDL文件,该文件是传输过程中数据的Data Structure描述。可以使用Axis2提供的工具java2wsdl自动生成。
通常在定义好一个ServiceClass的框架后,尽管每个业务可能还没有完全实现,但是就已经可以用来直接生成Data Structure描述文件。
services.xml 此文件用于注册服务器端程序中的公有对外方法类型,以及描述信息,典型地,一个services.xml的文档结构如下:
xml 代码
<service name="HelloWorldService" scope="application">
<description>Hello World Service</description>
<operation name="getHelloWorldMs">
<messageReceiver class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver" />
</operation>
<operation name="setHelloWorldMs">
<messageReceiver class="org.apache.axis2.receivers.RawXMLINOnlyMessageReceiver" />
</operation>
<operation name="getDownloadConfirm">
<messageReceiver class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver" />
</operation>
<parameter name="ServiceClass">samples.helloworld.service.axiom.HelloWorldService</parameter>
</service>
其中的ServiceClass是必须参数,用来指明operation所在的ServiceClass
<parameter name="ServiceClass">samples.helloworld.service.axiom.HelloWorldService</parameter>
4、我们可以通过ant来把我们所写的代码打包成aar。然后部署导axis2下执行。就把我所写的ant分享给大家吧。
<?xml version="1.0" encoding="UTF-8"?>
<project name="webservice" default="dist">
<property name="name" value="webservice" />
<property name="version" value="0.1" />
<property name="author" value="xipei(
[email protected])" />
<property name="build" value="build" />
<property name="build.classes" value="${build}/classes" />
<property name="dist" value="dist" />
<property name="src" value="src" />
<property name="lib" value="lib" />
<property name="conf" value="conf" />
<path id="project.class.path">
<fileset dir="${lib}">
<include name="*.jar" />
<include name="/${conf}/*.*" />
</fileset>
</path>
<target name="init">
<delete dir="${build}" />
<delete dir="${dist}" />
<mkdir dir="${build}" />
<mkdir dir="${build.classes}" />
<mkdir dir="${dist}" />
</target>
<target name="compile" depends="init">
<javac debug="true" srcdir="${src}" destdir="${build.classes}">
<classpath refid="project.class.path" />
</javac>
</target>
<target name="dist" depends="compile">
<jar jarfile="${dist}/${name}.aar">
<manifest>
<attribute name="Main-Class" value="**.**.service"/>
<attribute name="Classpath" value="*.jar;*.xml;*.MF"/>
</manifest>
<zipfileset dir="${build.classes}"/>
<zipfileset dir="${conf}" excludes="*.properties"/>
</jar>
</target>
<target name="clean">
<delete dir="${build}" />
<delete dir="${dist}" />
</target>
</project>