一份Axis2 webService及动态客户段调运的例子

配置:最好copy Axis2下载包中的模板项目,然后添加所需的类库及修改配置文件。

Web.xml配置:

<?xmlversion="1.0" encoding="UTF-8"?>
<web-appxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    id="WebApp_ID" version="2.5">
    <display-name>as</display-name>
    <welcome-file-list>
       <welcome-file>index.html</welcome-file>
       <welcome-file>index.htm</welcome-file>
       <welcome-file>index.jsp</welcome-file>
       <welcome-file>default.html</welcome-file>
       <welcome-file>default.htm</welcome-file>
       <welcome-file>default.jsp</welcome-file>
    </welcome-file-list>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <context-param>
       <param-name>contextConfigLocation</param-name>
       <param-value>classpath:META-INF/spring/*.xml</param-value>
    </context-param>
    
    
    <servlet>
       <servlet-name>AxisServlet</servlet-name>
     
       <servlet-class>org.apache.axis2.transport.http.AxisServlet</servlet-class>
     
       <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet>
       <servlet-name>AxisAdminServlet</servlet-name>
       <servlet-class>org.apache.axis2.webapp.AxisAdminServlet</servlet-class>
    </servlet>
    <servlet-mapping>
       <servlet-name>AxisServlet</servlet-name>
       <url-pattern>/servlet/AxisServlet</url-pattern>
    </servlet-mapping>
 
    <servlet-mapping>
       <servlet-name>AxisServlet</servlet-name>
       <url-pattern>*.jws</url-pattern>
    </servlet-mapping>
 
    <servlet-mapping>
       <servlet-name>AxisServlet</servlet-name>
       <url-pattern>/services/*</url-pattern>
    </servlet-mapping>
 
    <servlet-mapping>
       <servlet-name>AxisAdminServlet</servlet-name>
       <url-pattern>/axis2-admin/*</url-pattern>
    </servlet-mapping>
 
    <mime-mapping>
       <extension>inc</extension>
       <mime-type>text/plain</mime-type>
    </mime-mapping>
 
    <welcome-file-list>
       <welcome-file>index.jsp</welcome-file>
       <welcome-file>index.html</welcome-file>
       <welcome-file>/axis2-web/index.jsp</welcome-file>
    </welcome-file-list>
 
    <error-page>
       <error-code>404</error-code>
       <location>/axis2-web/Error/error404.jsp</location>
    </error-page>
 
    <error-page>
       <error-code>500</error-code>
       <location>/axis2-web/Error/error500.jsp</location>
    </error-page>
</web-app>

WEB-INFO文件夹下面建立services文件夹

并在services建立一个文件夹名称任一,例如ws,在其中依次添加META-INF文件夹和services.xml,目录结构如下:


 

Services.xml配置,集成了spring:

<?xmlversion="1.0" encoding="UTF-8"?>
 
<serviceGroup>
 
    <servicename="CustomerService">
       <description>    </description>
       <parametername="ServiceObjectSupplier">org.apache.axis2.extensions.spring.receivers.SpringServletContextObjectSupplier
       </parameter>
       <parametername="SpringBeanName">CustomerService</parameter>
       <operationname="getCustomer">
 
           <!--
              <messageReceiver
              class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver" />
              RPCMessageReceiver <messageReceiver
              mep="http://www.w3.org/2004/08/wsdl/in-only"
              class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
           -->
 
           <messageReceivermep="http://www.w3.org/2004/08/wsdl/in-out"
              class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
 
       </operation>
 
    </service>
 
    <servicename="ComplexTypeService">
       <description>    </description>
       <parametername="ServiceObjectSupplier">org.apache.axis2.extensions.spring.receivers.SpringServletContextObjectSupplier
       </parameter>
       <parametername="SpringBeanName">ComplexTypeService</parameter>
 
       <messageReceivers>
           <messageReceivermep="http://www.w3.org/2004/08/wsdl/in-out"
              class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
       </messageReceivers>
 
       <moduleref="rampart" />
 
       <parametername="InflowSecurity">
           <action>
              <items>UsernameToken Timestamp</items>
              <passwordCallbackClass>services.handler.PWDHandler
              </passwordCallbackClass>
           </action>
       </parameter>
 
    </service>
 
 
</serviceGroup>

 

Service代码:

package services;
 
import java.io.FileOutputStream;
 
publicclass ComplexTypeService {
    // 上传图像,imageByte参数表示上传图像文件的字节,
    // length参数表示图像文件的字节长度(该参数值可能小于imageByte的数组长度)
    publicboolean uploadImageWithByte(byte[] imageByte, int length) {
       FileOutputStream fos = null;
       try {
           // 将上传的图像保存在D盘的test1.jpg文件中
           fos = new FileOutputStream("d://test1.jpg");
           // 开始写入图像文件的字节
           fos.write(imageByte, 0, length);
           fos.close();
       } catch (Exception e) {
           returnfalse;
       } finally {
           if (fos != null) {
              try {
                  fos.close();
              } catch (Exception e) {
 
              }
           }
       }
       returntrue;
    }
 
    // 返回一维字符串数组
    public String[] getArray() {
       String[] strArray = new String[] { "自行车", "飞机", "火箭" };
       return strArray;
    }
 
    // 返回二维字符串数组
    public String[] getMDArray() {
       String[] strArray = new String[] { "自行车,飞机,火箭", "中国,美国,德国",
              "超人,蜘蛛侠,钢铁侠" };
       return strArray;
    }
 
    // 返回DataForm类的对象实例
    public DataForm getDataForm() {
       returnnew DataForm();
    }
 
    // 将DataForm类的对象实例序列化,并返回序列化后的字节数组
    publicbyte[] getDataFormBytes() throws Exception {
       java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream();
       java.io.ObjectOutputStream oos = new java.io.ObjectOutputStream(baos);
       oos.writeObject(new DataForm());
       return baos.toByteArray();
    }
}

 

 

package services;
 
import java.io.Serializable;
 
publicclass DataForm implements Serializable {
 
    privatestaticfinallongserialVersionUID = 1455026627782545535L;
    private String name = "bill";
    privateint age = 20;
 
    public String getName() {
       return name;
    }
 
    publicvoid setName(String name) {
       this.name = name;
    }
 
    publicint getAge() {
       return age;
    }
 
    publicvoid setAge(int age) {
       this.age = age;
    }
}

 

客户端调用:

客户端调用可以采用stub方式,用wsdl2java生成代码.

这儿是通用的动态调用方式,代码:

package axis2.client;
 
import javax.xml.namespace.QName;
 
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
 
import org.apache.axis2.rpc.client.RPCServiceClient;
 
publicclass Axis2ClientUtilsForRPC {
    private RPCServiceClient serviceClient;
 
    private String wsAddress;
    private String namespaceURI;
 
    public Axis2ClientUtilsForRPC() {
 
    }
 
    public Axis2ClientUtilsForRPC(String wsAddress, String namespaceURI) {
       this.init(wsAddress, namespaceURI);
    }
 
    publicvoid init(String wsAddress, String namespaceURI) {
       this.setWsAddress(wsAddress);
       this.setNamespaceURI(namespaceURI);
       this.init();
    }
 
    publicvoid init() {
       try {
 
           serviceClient = new RPCServiceClient();
           Options options = serviceClient.getOptions();
 
           EndpointReference targetEPR = new EndpointReference(wsAddress);
           options.setTo(targetEPR);
       } catch (AxisFault e) {
 
           e.printStackTrace();
       }
    }
 
    publicClass[] classes) {
       Object[] o = null;
       try {
           QName opAddEntry = new QName(namespaceURI, methodName);
           o = serviceClient.invokeBlocking(opAddEntry, args, classes);
       } catch (AxisFault e) {
 
           e.printStackTrace();
       }
       return o;
    }
 
    public Object invokeForObject(String methodName, Object[] args,
           Class[] classes) {
       Object o = null;
       try {
           QName opAddEntry = new QName(namespaceURI, methodName);
           Object[] objects = serviceClient.invokeBlocking(opAddEntry, args,
                  classes);
           if (objects != null && objects.length > 0) {
              o = objects[0];
           }
       } catch (AxisFault e) {
 
           e.printStackTrace();
       }
       return o;
    }
 
    public String getNamespaceURI() {
       return namespaceURI;
    }
 
    publicvoid setNamespaceURI(String namespaceURI) {
       this.namespaceURI = namespaceURI;
    }
 
    public String getWsAddress() {
       return wsAddress;
    }
 
    publicvoid setWsAddress(String wsAddress) {
       this.wsAddress = wsAddress;
    }
 
}

测试代码:

package s1;
 
import java.io.ByteArrayInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.Arrays;
 
import org.junit.Test;
 
import services.ComplexTypeServiceStub;
 
import axis2.client.Axis2ClientUtilsForRPC;
 
publicclass ComplexTypeServiceTest {
    Axis2ClientUtilsForRPC client = new Axis2ClientUtilsForRPC(
           "http://127.0.0.1:8080/as/services/ComplexTypeService",
           "http://services");
 
    @Test
    publicvoid testUploadImageWithByte() {
       Object[] opAddEntryArgs;
       Class[] classes;
       try {
 
           // 打开图像文件,确定图像文件的大小
           java.io.File file = new java.io.File("f://1.jpg");
           java.io.FileInputStream fis = new java.io.FileInputStream(file);
           // 创建保存要上传的图像文件内容的字节数组
           byte[] buffer = newbyte[(int) file.length()];
           // 将图像文件的内容读取buffer数组中
           int n = fis.read(buffer);
           System.out.println("文件长度:" + file.length());
           opAddEntryArgs = new Object[] { buffer, n };
           classes = new Class[] { Boolean.class };
           fis.close();
           // 开始上传图像文件,并输出uploadImageWithByte方法的返回传
           System.out.println(client.invoke("uploadImageWithByte",
                  opAddEntryArgs, classes)[0]);
       } catch (FileNotFoundException e) {
 
           e.printStackTrace();
       } catch (IOException e) {
 
           e.printStackTrace();
       }
 
    }
 
    @Test
    publicvoid testGetArray() {
       String[] v = (String[]) client.invokeForObject("getArray",
              new Object[] {}, new Class[] { String[].class });
       System.out.println(Arrays.asList(v));
    }
 
    @Test
    publicvoid testGetMDArray() {
       String[] v = (String[]) client.invokeForObject("getMDArray",
              new Object[] {}, new Class[] { String[].class });
       System.out.println(Arrays.asList(v));
    }
 
    @Test
    publicvoid testGetDataForm() {
       Class[] returnTypes = new Class[] { ComplexTypeServiceStub.DataForm.class };
       // 调用远程服务,得到返回的object数组
       Object[] response = client.invoke("getDataForm", new Object[] {},
              returnTypes);
       // 强制转换成 对象
       ComplexTypeServiceStub.DataForm form = (ComplexTypeServiceStub.DataForm) response[0];
       System.out.println("DataForm: name:" + form.getName() + ",age:"
              + form.getAge());
    }
 
    @Test
    publicvoid testGetDataFormBytes() {
       try {
           byte[] v = (byte[]) client.invokeForObject("getDataFormBytes",
                  new Object[] {}, new Class[] { byte[].class });
 
           ObjectInputStream o = new ObjectInputStream(
                  new ByteArrayInputStream(v));
           Object object = o.readObject();
           services.DataForm form1 = (services.DataForm) object;
           System.out.println("DataForm: name:" + form1.getName() + ",age:"
                  + form1.getAge());
       } catch (IOException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       } catch (ClassNotFoundException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       }
 
    }
 
}
 
 
package s1;
 
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.rmi.RemoteException;
import java.util.Arrays;
 
import javax.activation.DataHandler;
import javax.xml.namespace.QName;
 
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
 
import services.ComplexTypeServiceStub;
import services.ExceptionException0;
import services.ComplexTypeServiceStub.DataForm;
import services.ComplexTypeServiceStub.UploadImageWithByteResponse;
 
publicclass Main {
 
    /**
     * @param args
     */
    publicstaticvoid main(String[] args) {
       c2();
    }
 
    privatestaticvoidc1()
       try {
           s1.CustomerServiceStub stub = new s1.CustomerServiceStub(
                  "http://127.0.0.1:8080/as/services/CustomerService");
           s1.CustomerServiceStub.GetCustomer c = new CustomerServiceStub.GetCustomer();
           c.setCustId(111050l);
 
           System.out.println(stub.getCustomer(c).get_return());
       } catch (AxisFault e) {
           e.printStackTrace();
       } catch (RemoteException e) {
           e.printStackTrace();
       }
    }
 
    privatestaticvoid c2() {
       try {
           ComplexTypeServiceStub stub = new ComplexTypeServiceStub();
           // 调用一维数组
           ComplexTypeServiceStub.GetArrayResponse res1 = stub.getArray();
           System.out.println(Arrays.asList(res1.get_return()));
           // 调用二维数组
           ComplexTypeServiceStub.GetMDArrayResponse res2 = stub.getMDArray();
           System.out.println(Arrays.asList(res2.get_return()));
           // DataForm类的对象实例
           ComplexTypeServiceStub.GetDataFormResponse res3 = stub
                  .getDataForm();
           DataForm form = res3.get_return();
           System.out.println("DataForm: name:" + form.getName() + ",age:"
                  + form.getAge());
           // 将DataForm类的对象实例序列化,并返回序列化后的字节数组
           ComplexTypeServiceStub.GetDataFormBytesResponse res4 = stub
                  .getDataFormBytes();
           DataHandler dh = res4.get_return();
           try {
              ObjectInputStream o = new ObjectInputStream(dh.getInputStream());
              Object object = o.readObject();
              services.DataForm form1 = (services.DataForm) object;
              System.out.println("DataForm: name:" + form1.getName()
                     + ",age:" + form1.getAge());
           } catch (ClassNotFoundException e) {
              e.printStackTrace();
           } catch (IOException e) {
              e.printStackTrace();
           }
           // 二进制图像
           ComplexTypeServiceStub.UploadImageWithByte byte1 = new ComplexTypeServiceStub.UploadImageWithByte();
           try {
              // 打开图像文件,确定图像文件的大小
              java.io.File file = new java.io.File("f://1.jpg");
              java.io.FileInputStream fis = new java.io.FileInputStream(file);
              // 创建保存要上传的图像文件内容的字节数组
              byte[] buffer = newbyte[(int) file.length()];
              // 将图像文件的内容读取buffer数组中
              int n = fis.read(buffer);
              System.out.println("文件长度:" + file.length());
              Object[] opAddEntryArgsnew Object[] { buffer, n };
              Class[] classesnew Class[] { Boolean.class };
 
              fis.close();
 
              UploadImageWithByteResponse res5 = stub
                     .uploadImageWithByte(byte1);
              res5.get_return();
           } catch (FileNotFoundException e) {
 
              e.printStackTrace();
           } catch (IOException e) {
 
              e.printStackTrace();
           }
 
       } catch (AxisFault e) {
 
           e.printStackTrace();
       } catch (RemoteException e) {
 
           e.printStackTrace();
       } catch (ExceptionException0 e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       }
    }
 
    privatestaticvoidc3()
       try {
           RPCServiceClient client = new RPCServiceClient();
           Options option = client.getOptions();
           // 指定客户端访问的webservice服务器端地址
           EndpointReference erf = new EndpointReference(
                  "http://127.0.0.1:8080/as/services/ComplexTypeService");
           option.setTo(erf);
           // 指定命名空间,指定要调用的方法
           QName name = new QName("http://services", "getDataForm");
           // 创建返回的参数类型
           Class[] returnTypes = new Class[] { ComplexTypeServiceStub.DataForm.class };
           // 调用远程服务,得到返回的object数组
           Object[] response = client.invokeBlocking(name, new Object[] {},
                  returnTypes);
           // 强制转换成 对象
           ComplexTypeServiceStub.DataForm form = (ComplexTypeServiceStub.DataForm) response[0];
           System.out.println("DataForm: name:" + form.getName() + ",age:"
                  + form.getAge());
       } catch (AxisFault e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       }
 
    }
 
    privatestaticvoidc4()
       try {
           RPCServiceClient serviceClient = new RPCServiceClient();
           Options options = serviceClient.getOptions();
           EndpointReference targetEPR = new EndpointReference(
                  "http://127.0.0.1:8080/as/services/ComplexTypeService");
           options.setTo(targetEPR);
 
           // 下面的代码调用uploadImageWithByte方法上传图像文件
           // ///
           // 打开图像文件,确定图像文件的大小
           java.io.File file = new java.io.File("f://1.jpg");
           java.io.FileInputStream fis = new java.io.FileInputStream(file);
           // 创建保存要上传的图像文件内容的字节数组
           byte[] buffer = newbyte[(int) file.length()];
           // 将图像文件的内容读取buffer数组中
           int n = fis.read(buffer);
           System.out.println("文件长度:" + file.length());
           Object[] opAddEntryArgs = new Object[] { buffer, n };
           Class[] classes = new Class[] { Boolean.class };
           QName opAddEntry = new QName("http://services",
                  "uploadImageWithByte");
           fis.close();
           // 开始上传图像文件,并输出uploadImageWithByte方法的返回传
           System.out.println(serviceClient.invokeBlocking(opAddEntry,
                  opAddEntryArgs, classes)[0]);
 
       } catch (AxisFault e) {
 
           e.printStackTrace();
       } catch (FileNotFoundException e) {
 
           e.printStackTrace();
       } catch (IOException e) {
 
           e.printStackTrace();
       }
    }
}