Axis开发之工业化-ant使用

本文介绍了如何使用Ant与Axis进行Web服务的工业化开发,包括使用axis-wsdl2java和axis-java2wsdl任务生成Java源代码和WSDL文件,axis-admin任务用于服务的部署和取消部署。详细步骤包括导入axis-ant.jar,定义任务,生成并编译Java文件,部署服务,以及一个实际的开发例子展示了服务端和客户端的交互过程。

Axis开发之工业化-ant使用

 

 

 

 

 

Axis为支持Ant构建,提供了一个axis-ant.jar文件。该文件包含三个可选任务(task)的定义和实现:axis-wsdl2javaaxis-java2wsdlaxis-admin

 

 

 

 

 

1)   任务axis-wsdl2javaAxis提供的工具WSDL2Java具有同样的功能,根据web服务描述文件生成对应的Java源程序,它的属性设置与WSDL2Java的命令参数设置类似。

 

 

 

 

 

2)   任务axis-java2wsdl则相反,它与Java2WSDL工具一样,是根据已有的类文件来生成Web服务描述文件。

 

 

 

 

 

3)   axis-admin是用于web服务的部署和取消部署的,对应于AxisAminClient工具。

 

 

 

 

 

为了使用ant来建构,首先需要将axis-ant.jar包拷贝到antlib目录下。

 

 

 

 

 

一、下面是详细的步骤,列了一个12345,看起来清楚一些

 

 

 

 

 

1.   <taskdef>声明导入axis-ant.jar文件中的属性文件所定义的任务(task)列表。

 

 

 

 

 

<taskdef resource="axis-tasks.properties"  classpathref="axis.classpath"/>

 

 

 

 

 

2.   axis的包都导进来

 

 

 

 

 

<property name="axis.home" value="G:/package/axis-1_3"/>

 

 

 

 

 

<!--定义classpath-->

 

 

 

 

 

<path id="axis.classpath">

 

 

 

 

 

     <!—-这里导入的是axis的所有包-->

 

 

 

 

 

    <fileset dir="${axis.home}/lib">

 

 

 

 

 

        <include name="**/*.jar" />

 

 

 

 

 

    </fileset>

 

 

 

 

 

     <!—-

 

 

 

 

 

这里导入的是javamail的包,如果web服务有附件的时候要用到,如果没有包含进来会有一个警告

 

 

 

 

 

-->

 

 

 

 

 

    <fileset dir="G:/workpackage/j2ee">

 

 

 

 

 

        <include name="**/*.jar" />

 

 

 

 

 

    </fileset>

 

 

 

 

 

     <!—-其他的包-->

 

 

 

 

 

    <fileset dir="${basedir}">

 

 

 

 

 

        <include name="other.jar" />

 

 

 

 

 

    </fileset>

 

 

 

 

 

</path>

 

 

 

 

 

3.   生成web描述文件和根据描述文件生成java源程序

 

 

 

 

 

1

 

 

 

 

 

2

 

 

 

 

 

3

 

 

 

 

 

4

 

 

 

 

 

5

 

 

 

 

 

6

 

 

 

 

 

7

 

 

 

 

 

8

 

 

 

 

 

9

 

 

 

 

 

10

 

 

 

 

 

11

 

 

 

 

 

12

 

 

 

 

 

13

 

 

 

 

 

14

 

 

 

 

 

15

 

 

 

 

 

16

 

 

 

 

 

17

 

 

 

 

 

18

 

 

 

 

 

19

 

 

 

 

 

<target name="axis" depends="init">

 

 

 

 

 

<axis-java2wsdl

 

 

 

 

 

classname="net.wide.axis.service.SimpleObjectCreator"     location="http://localhost:8080/axis/services/SimpleObjectCreator"

 

 

 

 

 

    namespace="service.axis.wide.net"

 

 

 

 

 

    output="simpleObject.wsdl"

 

 

 

 

 

    style="RPC"

 

 

 

 

 

    extraclasses="net.wide.axis.bean.SimpleObject"

 

 

 

 

 

    />

 

 

 

 

 

    <axis-wsdl2java all="true"

 

 

 

 

 

        url="simpleObject.wsdl"

 

 

 

 

 

        deployscope="Request"

 

 

 

 

 

        output="${basedir}/src"

 

 

 

 

 

        serverside="true"

 

 

 

 

 

        skeletondeploy="false"

 

 

 

 

 

        testcase="true"

 

 

 

 

 

        noimports="false"

 

 

 

 

 

        typemappingversion="1.2"/>

 

 

 

 

 

    </target>

 

 

 

 

 

3行:我们要发布的web服务接口,需要先定义这个接口,如果是一个具体的类,下面用axis-wsdl2java来生成java文件的时候,会生成该接口和他的实现文件。

 

 

 

 

 

4行:web服务发布的位置

 

 

 

 

 

5行:namespace,这一行用红字标出来,是要注意的,“service.axis.wide.net,跟我的包结构刚好倒过来,当用axis-wsdl2java来生成java文件的时候,包结构就是“net.wide.axis.service”。

 

 

 

 

 

6行:生成的webservice描述文件,axis-wsdl2java正是用他来生成java文件的

 

 

 

 

 

4.   将生成的java文件编译,解下就是部署

 

 

 

 

 

1

 

 

 

 

 

2

 

 

 

 

 

3

 

 

 

 

 

4

 

 

 

 

 

5

 

 

 

 

 

6

 

 

 

 

 

7

 

 

 

 

 

8

 

 

 

 

 

9

 

 

 

 

 

<target name="deploy" depends="init">

 

 

 

 

 

<axis-admin

 

 

 

 

 

port="8080"

 

 

 

 

 

hostname="localhost"

 

 

 

 

 

failonerror="true"

 

 

 

 

 

servletpath="axis/services/AdminService"

 

 

 

 

 

debug="true"

 

 

 

 

 

xmlfile="${basedir}/src/net/wide/axis/service/deploy.wsdd"/>

 

 

 

 

 

</target>

 

 

 

 

 

6行:servletpath要跟web.xml中的保持一致

 

 

 

 

 

8行:上一步生成的部署文件

 

 

 

 

 

5.   测试

 

 

 

 

 

二、实例,通过一个实例来看看使用ant的开发步骤。包括下面的内容:

 

 

 

 

 

1)   服务端创建一个JavaBean,并且返回给客户端

 

 

 

 

 

2)   客户端将一个JavaBean做为参数传递给服务器端

 

 

 

 

 

3)   服务器端返回一个JavaBean数组

 

 

 

 

 

1.   定义JavaBean

 

 

 

 

 

package net.wide.axis.bean;

 

 

 

 

 

public class SimpleObject  implements Serializable {

 

 

 

 

 

    private String name;

 

 

 

 

 

    public getName() {

 

 

 

 

 

        return name;

 

 

 

 

 

    }

 

 

 

 

 

public void setName(String name) {

 

 

 

 

 

        this.name = name;

 

 

 

 

 

    }

 

 

 

 

 

}

 

 

 

 

 

注意JavaBean需要实现Serializable接口

 

 

 

 

 

2.   定义web服务接口

 

 

 

 

 

package net.wide.axis.service;

 

 

 

 

 

import net.wide.axis.bean.SimpleObject;

 

 

 

 

 

public interface SimpleObjectCreator{

 

 

 

 

 

    public SimpleObject createSimpleObject(String name);

 

 

 

 

 

    public void storeSimpleObject(SimpleObject simpleObject);

 

 

 

 

 

    public SimpleObject[] createSimpleObjects();

 

 

 

 

 

}

 

 

 

 

 

3.   运行Ant axis,生成了下面的文件

 

 

 

 

 

 

 

4.   实现SimpleObjectCreatorSoapBindingImpl.java,这个java文件就是SimpleObjectCreator的实现文件,简单实现如下:

 

 

 

 

 

public class SimpleObjectCreatorSoapBindingImpl

 

 

 

 

 

implements net.wide.axis.service.SimpleObjectCreator{

 

 

 

 

 

    public  SimpleObject createSimpleObject(java.lang.String name)

 

 

 

 

 

throws java.rmi.RemoteException {

 

 

 

 

 

         System.out.println("创建SimpleObject...");

 

 

 

 

 

        SimpleObject simpleObject = new SimpleObject();

 

 

 

 

 

        simpleObject.setName(name);

 

 

 

 

 

        return simpleObject;

 

 

 

 

 

    }

 

 

 

 

 

 

 

 

 

 

    public void storeSimpleObject(SimpleObject simpleObject)

 

 

 

 

 

throws java.rmi.RemoteException {

 

 

 

 

 

         System.out.println("Store");

 

 

 

 

 

        System.out.println(simpleObject.getName());

 

 

 

 

 

    }

 

 

 

 

 

 

 

 

 

 

    public SimpleObject[] createSimpleObjects()

 

 

 

 

 

throws java.rmi.RemoteException {

 

 

 

 

 

        SimpleObject[] simpleObjects = new SimpleObject[2];

 

 

 

 

 

        simpleObjects[0] = new SimpleObject();

 

 

 

 

 

        simpleObjects[1] = new SimpleObject();

 

 

 

 

 

        simpleObjects[0].setName("First Object");

 

 

 

 

 

        simpleObjects[1].setName("Second Object");

 

 

 

 

 

        return simpleObjects;

 

 

 

 

 

    }

 

 

 

 

 

}

 

 

 

 

 

 

 

 

 

 

5.   部署ant deploy

 

 

 

 

 

6.   测试

 

 

 

 

 

public static void main(String[] args)

 

 

 

 

 

throws ServiceException, RemoteException {

 

 

 

 

 

        String endPoint =

 

 

 

 

 

 "http://localhost:8080/axis/services/SimpleObjectCreator?wsdl";

 

 

 

 

 

        Service service = new Service();

 

 

 

 

 

        Call call = (Call) service.createCall();

 

 

 

 

 

        call.setTargetEndpointAddress(endPoint);

 

 

 

 

 

        QName qname =

 

 

 

 

 

new QName("http://bean.axis.wide.net","SimpleObject");

 

 

 

 

 

        //测试createSimpleObject方法,它创建一个SimpleObject并且返回该对象

 

 

 

 

 

        call.registerTypeMapping(SimpleObject.class,

 

 

 

 

 

qname,

 

 

 

 

 

new BeanSerializerFactory(SimpleObject.class, qname),

 

 

 

 

 

new BeanDeserializerFactory(SimpleObject.class, qname));

 

 

 

 

 

        call.setOperationName("createSimpleObject");

 

 

 

 

 

        SimpleObject simpleObject =

 

 

 

 

 

(SimpleObject) call.invoke(new Object[]{"Hello"});

 

 

 

 

 

        System.out.println(simpleObject.getName());

 

 

 

 

 

        //测试storeSimpleObject,客户端传递一个SimpleObject

 

 

 

 

 

        call.setOperationName("storeSimpleObject");

 

 

 

 

 

        call.invoke(new Object[]{simpleObject});   

 

 

 

 

 

        //测试服务端返回一个SimpleObject数组,打印出数组的长度

 

 

 

 

 

        qname =

 

 

 

 

 

new QName("service.axis.wide.net","ArrayOf_tns1_SimpleObject");

 

 

 

 

 

        call.registerTypeMapping(SimpleObject.class,

 

 

 

 

 

qname,

 

 

 

 

 

new BeanSerializerFactory(SimpleObject.class, qname),

 

 

 

 

 

new BeanDeserializerFactory(SimpleObject.class, qname));

 

 

 

 

 

        call.setOperationName("createSimpleObjects");

 

 

 

 

 

        SimpleObject[] simpleObjects =

 

 

 

 

 

(SimpleObject[]) call.invoke(new Object[]{});

 

 

 

 

 

        System.out.println(simpleObjects.length);

 

 

 

 

 

    }

 

 

 

 

 

7.   结合/WEB-INF/server-config.wsdd来分析,部署的时候会生成这个部署描述文件

 

 

 

 

 

<service name="SimpleObjectCreator" provider="java:RPC">

 

 

 

 

 

    <operation name="createSimpleObject"

 

 

 

 

 

qname="ns2:createSimpleObject"

 

 

 

 

 

               returnQName="createSimpleObjectReturn"

 

 

 

 

 

            soapAction=""

 

 

 

 

 

xmlns:ns1=http://bean.axis.wide.net

 

 

 

 

 

returnType="ns1:SimpleObject"

 

 

 

 

 

            xmlns:ns2="service.axis.wide.net">

 

 

 

 

 

       <parameter

 

 

 

 

 

name="in0"

 

 

 

 

 

type="xsd:string"

 

 

 

 

 

           xmlns:xsd="http://www.w3.org/2001/XMLSchema" />

 

 

 

 

 

    </operation>

 

 

 

 

 

    <operation name="storeSimpleObject"

 

 

 

 

 

qname="ns3:storeSimpleObject"

 

 

 

 

 

               soapAction=""

 

 

 

 

 

xmlns:ns3="service.axis.wide.net">

 

 

 

 

 

       <parameter name="in0" type="ns4:SimpleObject"

 

 

 

 

 

           xmlns:ns4="http://bean.axis.wide.net" />

 

 

 

 

 

    </operation>

 

 

 

 

 

    <operation name="createSimpleObjects"

 

 

 

 

 

       qname="ns5:createSimpleObjects"

 

 

 

 

 

       returnQName="createSimpleObjectsReturn"

 

 

 

 

 

       returnType="ns5:ArrayOf_tns1_SimpleObject"

 

 

 

 

 

soapAction=""

 

 

 

 

 

       xmlns:ns5="service.axis.wide.net" />

 

 

 

 

 

    <parameter name="wsdlServicePort" value="SimpleObjectCreator" />

 

 

 

 

 

    <parameter name="className"     value="net.wide.axis.service.SimpleObjectCreatorSoapBindingImpl" />

 

 

 

 

 

    <parameter name="typeMappingVersion" value="1.2" />

 

 

 

 

 

    <parameter name="allowedMethods"

 

 

 

 

 

       value="storeSimpleObject createSimpleObject createSimpleObjects" />

 

 

 

 

 

    <parameter name="wsdlServiceElement"

 

 

 

 

 

       value="SimpleObjectCreatorService" />

 

 

 

 

 

    <parameter name="wsdlTargetNamespace"

 

 

 

 

 

value="service.axis.wide.net" />

 

 

 

 

 

    <parameter name="wsdlPortType" value="SimpleObjectCreator" />

 

 

 

 

 

    <parameter name="scope" value="Request" />

 

 

 

 

 

    <parameter name="schemaUnqualified"

 

 

 

 

 

       value="service.axis.wide.net,http://bean.axis.wide.net" />

 

 

 

 

 

    <typeMapping

 

 

 

 

 

        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

 

 

 

 

 

       encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"

 

 

 

 

 

       qname="ns6:SimpleObject"

 

 

 

 

 

       serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

 

 

 

 

 

       type="java:net.wide.axis.bean.SimpleObject"

 

 

 

 

 

       xmlns:ns6="http://bean.axis.wide.net" />

 

 

 

 

 

    <arrayMapping innerType="ns8:SimpleObject"

 

 

 

 

 

       languageSpecificType="java:net.wide.axis.bean.SimpleObject[]"

 

 

 

 

 

       qname="ns7:ArrayOf_tns1_SimpleObject"

 

 

 

 

 

       xmlns:ns7="service.axis.wide.net"

 

 

 

 

 

       xmlns:ns8="http://bean.axis.wide.net" />

 

 

 

 

 

</service>

 

 

 

 

 

这一段是SimpleObjectCreator的描述。结合createSimpleObject方法的描述与测试代码中的:

 

 

 

 

 

    QName qname = new QName("http://bean.axis.wide.net","SimpleObject");

 

 

 

 

 

createSimpleObject方法的描述中有下面的一段

 

 

 

 

 

xmlns:ns1=http://bean.axis.wide.net

 

 

 

 

 

returnType="ns1:SimpleObject"

 

 

 

 

 

对比就知道了,我们使用的命名空间是http://bean.axis.wide.net

 

 

 

 

 

其他几个也是这样。

 

 

 

 

<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值