- 论坛徽章:
- 0
|
Axis开发之工业化-ant使用
Axis开发之工业化-ant使用
Axis为支持Ant构建,提供了一个axis-ant.jar文件。该文件包含三个可选任务(task)的定义和实现:axis-wsdl2java,axis-java2wsdl和axis-admin。
1) 任务axis-wsdl2java与Axis提供的工具WSDL2Java具有同样的功能,根据web服务描述文件生成对应的Java源程序,它的属性设置与WSDL2Java的命令参数设置类似。
2) 任务axis-java2wsdl则相反,它与Java2WSDL工具一样,是根据已有的类文件来生成Web服务描述文件。
3) axis-admin是用于web服务的部署和取消部署的,对应于Axis的AminClient工具。
为了使用ant来建构,首先需要将axis-ant.jar包拷贝到ant的lib目录下。
一、下面是详细的步骤,列了一个1,2,3,4,5,看起来清楚一些
1. 用声明导入axis-ant.jar文件中的属性文件所定义的任务(task)列表。
classpathref="axis.classpath"/>
2. 把axis的包都导进来
定义classpath-->
这里导入的是axis的所有包-->
这里导入的是javamail的包,如果web服务有附件的时候要用到,如果没有包含进来会有一个警告
-->
其他的包-->
3. 生成web描述文件和根据描述文件生成java源程序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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"
/>
url="simpleObject.wsdl"
deployscope="Request"
output="${basedir}/src"
serverside="true"
skeletondeploy="false"
testcase="true"
noimports="false"
typemappingversion="1.2"/>
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
port="8080"
hostname="localhost"
failonerror="true"
servletpath="axis/services/AdminService"
debug="true"
xmlfile="${basedir}src
etwideaxisservicedeploy.wsdd"/>
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
其他几个也是这样。
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/12709/showart_66294.html |
|