菠萝三国

大江东去,浪淘尽...
随笔 - 34, 文章 - 47, 评论 - 22, 引用 - 0
数据加载中……

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/

其他几个也是这样。

posted on 2007-08-12 16:24 菠萝 阅读(443) 评论(0)  编辑  收藏 所属分类: Ant


只有注册用户登录后才能发表评论。


网站导航: