在Axis中处理复杂的自定义的数据类型

原创 2004年08月31日 11:16:00

什么是Axis<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

Axis本质上是一个SOAP引擎,但Axis也不仅仅是一个SOAP引擎,可以称作是一个web services。由于本文重点不在于些,请您参考《Axis用户指南

您必需了解的知识

如果您是一个javaservletSOAP的新手,那您可能会遇到很多关于Axis的麻烦,所以这时不建议您编写Axis的客户和服务程序。当您基本了解了如下知识时,您就可以开始Axis之旅了。

  1. Java的数据类型,类和编程概念的核心。

  2. 什么是线程(threads),竞态条件(race conditions,线程安全(thread safety)和同步(sychronization

  3. 什么是classloader,什么是多等级classloader,和"ClassNotFoundException"异常的共同原因。

  4. 怎么样诊断来自己异常跟踪到的问题,NullPointerExceptionNPE)和其它共同异常是什么,并且知道怎么修改他们。

  5. 什么是web 应用;什么是servlet,类,类库和数据放在Web应用中的什么位置。

  6. 怎么启动您的应用服务,怎么发布一个web应用到应用服务上。

  7. 什么是网络,IP协议概念的核心和那些sockets API。特别是,什么是TCP/IP

  8. 什么是HTTP。核心协议和错误代码,Http头和大部分的验证细节。

  9. 什么是XML。尽管您不需要了解怎么样解释她或是其它的技术,但要知道怎么制定好的样式并且正确的XML

Axis的安装

由于我们在本文中使用Jbuilder 8开发,所以如何安装Axis并不重要。如果您想了解Axis的安装,请您参考《Axis安装说明

开始Jbuider 8Axis之旅

1、打开Jbuider 8,建一个新工程Axistour,再建一个Web应用tour,这里使用tomcat-4.0.6-LE-jdk14

2、建一个Web Services,选择web services configurationOK后按向导的缺省操作进行;

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

3、 检验Axis工程。编译Axisour工程,选择tour/Root directory/index.html,右键菜单中选择:Web run using “Web Services Server”,其中引号中的Web Services Serverweb services的名字,如果您在前面的向导第二步输入了其它的名字,这里应显示您输入的那个名字;

4、点击index.html中的链接,如果全部正常执行,表示您的Axis已正常工作。特别注意的是”Validate”链接:

5、检验完成开始编写Axis的服务端程序,建一个自己定义的复杂数据类型Data(Data.java),这个类必需是遵循java bean规范。代码如下:

 

package com.neusoft.axistour;

 

import java.util.HashMap;

 

public class Data {

  private String author=null;

  private String address=null;

  private HashMap hmap=null;

  public Data() {

  }

 

  public String getAddress(){

    return address;

  }

  public void setAddress(String address){

    this.address=address;

  }

 

  public String getAouthor(){

    return author;

  }

  public void setAouthor(String author){

    this.author=author;

  }

 

  public HashMap getHMap(){

    return hmap;

  }

  public void setHMap(HashMap map){

    this.hmap=map;

  }

}

6、创建Axis 服务类,DataServices.java

package com.neusoft.axistour;

 

import java.util.HashMap;

public class DataServices {

 

  public Data buildData(String address,String aouthor ){

    Data data=new Data();

    data.setAddress(address) ;

    data.setAouthor(aouthor) ;

    HashMap map=new HashMap();

    map.put("key1","value1") ;

    map.put("key2","value2") ;

    map.put("key3","value3") ;

    data.setMap(map);

    return data;

  }

}

 

7、选择DataServices.java,右键菜单中选择Export as a web services,按缺省的向导,完成Axis的导出,生成deploy.wsddwsdl,其中deploy.wsdd至关重要,而wsdl文件在这里并不重要;

8、到此您已完成Axis的服务程序,编译整个工程,启动web services

9、测试wsdl,如果您的Http端口是8080(如果您本机的web服务不是8080,请改为您本机相应的端号,请访问如下URLhttp://localhost:8080/tour/services/DataServices?wsdl

10、            Java客户端代码您可以参考向导产生的Junit测试类,所以这里不再说明。您可以运行Junit测试类:com.neusoft.axistour.generated. DataServicesServiceTestCase,如果正确,则测试成功。

11、            VB客户端代码,由于使用了自定义的数据类型,所以只能使用microsoft soap开发包的低端API,这里使用SOAP Toolkit 2.0,代码如下:

Option Explicit

 

Private Sub Command1_Click()

On Error GoTo ErrorHandler

   

    Dim Serializer As SoapSerializer

    Dim Reader As SoapReader

    Dim Connector As SoapConnector

    Dim Method As String

   

    Dim Dom As MSXML2.DOMDocument30

    Dim Elm As IXMLDOMElement

   

    Method = Trim(Text2.Text)

    If Method = "" Then

      MsgBox "请输入方法名!"

      Exit Sub

    End If

    Set Connector = New HttpConnector

    Connector.Property("EndPointURL") = Text1.Text

    'Connector.Property("SoapAction") = BASE_SOAP_ACTION_URI & Method

    Connector.BeginMessage

   

    Set Serializer = New SoapSerializer

    Serializer.Init Connector.InputStream

   

    Serializer.startEnvelope

    Serializer.startBody

    Serializer.startElement Method, "", "", ""

 

'方法的参数

Serializer.startElement "address"

    Serializer.writeString "dalian"

    Serializer.endElement

Serializer.startElement "aouthor"

    Serializer.writeString "neusoft"

    Serializer.endElement

   

    Serializer.endElement

    Serializer.endBody

    Serializer.endEnvelope

   

    Connector.EndMessage

   

    Set Reader = New SoapReader

    Reader.Load Connector.OutputStream

   

    If Not Reader.Fault Is Nothing Then

        MsgBox Reader.faultstring.Text, vbExclamation

    Else

        Text3.Text = Reader.Dom.xml

    End If

 

    Exit Sub

   

ErrorHandler:

 

    MsgBox "ERROR: " & Err.Description, vbExclamation

    Err.Clear

    Exit Sub

 

End Sub

 

Private Sub Form_Load()

Text1.Text = "http://localhost:8080/tour/services/DataServices?wsdl"

Text2.Text = ""

Text3.Text = ""

End Sub

12、            VC代码,建一个Win32 Console Application

#include "stdafx.h"

#include <stdio.h>

#import "msxml3.dll"

using namespace MSXML2;

//根据自己机器的情况修改下面语句中指定的路径

#import "C:/Program Files/Common Files/MSSoap/Binaries/mssoap1.dll" /

        exclude("IStream", "ISequentialStream", "_LARGE_INTEGER", /

        "_ULARGE_INTEGER", "tagSTATSTG", "_FILETIME")

 

using namespace MSSOAPLib;

 

void axisTourClient(){   

       ISoapSerializerPtr Serializer;

       ISoapReaderPtr Reader;

       ISoapConnectorPtr Connector;

       // 联接services    

       Connector.CreateInstance(__uuidof(HttpConnector));

       Connector->Property["EndPointURL"] = "http://localhost:8080/tour/services/DataServices?wsdl";

       Connector->Connect(); 

       // Begin message

       Connector->BeginMessage();

       // Create the SoapSerializer   

       Serializer.CreateInstance(__uuidof(SoapSerializer));   

       // Connect the serializer to the input stream of the connector

       Serializer->Init(_variant_t((IUnknown*)Connector->InputStream));  

 

       // Build the SOAP Message   

       Serializer->startEnvelope("","","");

       Serializer->startBody("");      

       Serializer->startElement("buildData","","","");

//参数

Serializer->startElement("address","","","");

Serializer->writeString( "dalian");

Serializer->endElement();

Serializer->startElement("aouthor","","","");

Serializer->writeString ("neusoft");

Serializer->endElement();

 

       Serializer->endElement();

       Serializer->endBody();  

       Serializer->endEnvelope();           

      

       Connector->EndMessage();       

      

       Reader.CreateInstance(__uuidof(SoapReader));  

       Reader->Load(_variant_t((IUnknown*)Connector->OutputStream), "");   

 

       // 显示结果

       printf("Response: %s/n", (const char*)Reader->DOM->xml ); 

}

 

int main(int argc, char* argv[])

{

       CoInitialize(NULL);

       axisTourClient();   

       CoUninitialize();     

      

       return 0;

}

13、            到现在为止可以说您走出Axis之旅的第一步。

最后说明:

1、Axis中,将自定义的复杂数据类型序列化成xml有两种方法,一种方法是前面使用的JavaBean方法,使用Axis提供的Bean序列化工厂(BeanSerializerFactory)来实现序列化;另一种方法是自己编写序列化工厂和反序列化工厂,这种方法这里将不做说明。另外其它web service产品也应提供这两种方法;

2、虽然前面曾说到wsdl不重要,这只是说在这里不重要,Axis会利用web-inf下的server-config.wsdd web服务发布描述文件(Web Service Deployment Descriptor生成wsdl,其实wsdl依然是web services的核心描述;

3、如果生成的war包在某些版本的tomcat或其它web引擎中不能运行,请参考Axis的安装说明;

如果您的程序没有正常运行,请您通过msn和我联系:jlzzb@hotmial.com

Axis2用法(3)soap消息携带消息头

1、消息头定义 一般soap消息中,消息体是携带消息的核心内容;消息头中的字段,多数用于校验。定义消息头,就相当于定义一个bean对象。本例中,在上一篇的继承上,为消息增加消息头,其中消息头核心内容...
  • yanghaitaohhh
  • yanghaitaohhh
  • 2013年12月31日 23:06
  • 8260

如何在Axis2中添加SOAP头

通过AXIOM生成所需头对象,然后将该头对象添加至ServiceClient对象即可
  • a19881029
  • a19881029
  • 2014年12月01日 11:06
  • 13352

axis客户端接收不同参数类型

axis只支持简单类型的返回值。在这里逐一介绍axis的各种返回值接受。1:axis接受基本类型,如int ,string等引入的系统文件:import javax.xml.namespace.QNa...
  • xiechunmei13
  • xiechunmei13
  • 2010年06月08日 22:01
  • 18405

六、axis1传递、返回复杂类型的对象

上面的服务传递的是简单数据类型,返回的也是简单数据类型。下面我们用JavaBean 、List、Map、Array等返回值或参数完成WebService。 1、首先看看JavaBean模式的参数和返...
  • O_Ochongchong
  • O_Ochongchong
  • 2014年01月06日 17:32
  • 2570

六、axis1传递、返回复杂类型的对象

上面的服务传递的是简单数据类型,返回的也是简单数据类型。下面我们用JavaBean 、List、Map、Array等返回值或参数完成WebService。 1、首先看看JavaBean模式的参数和返...
  • O_Ochongchong
  • O_Ochongchong
  • 2014年01月06日 17:32
  • 2570

WebService-AXIS高级特性 传递复杂对象

从客户端除了传递字符串以外还可以传递复杂对象(对象必须序列化了),List,Map,数组和文件。 (1)定义一个对象实现了serializable 接口 package cn.com.chenlly...
  • liuxiaogangqq
  • liuxiaogangqq
  • 2013年12月02日 10:20
  • 6360

java利用axis2调用.net写的webservice,传递自定义的实体类参数

java利用axis2调用.net写的webservice,传递自定义的实体类参数
  • strong_wenzi
  • strong_wenzi
  • 2016年04月27日 19:14
  • 2081

axis1发布方式

axis中发布服务主要有两种方式 即时发布JWS定制发布WSDD 即时发布JWS,你可以从上两篇文章中看到了。由于限制过大(带包的类),一般不常用。但即时发布比较简单,对于初学者还是有必要...
  • scholar_man
  • scholar_man
  • 2015年08月27日 20:15
  • 393

axis1.4生成客户端代码

前几日遇到要连接别人的webservice的问题,几经曲折,终于搞定,
  • wymaweiyue
  • wymaweiyue
  • 2014年09月18日 16:41
  • 3571

用axis解析webservice并调用

第一次写webservice;很是头痛。特此记录: 首先,可以用命令的方式解析wsdl文件,需要的jar包, 也可以通过eclipse来导入wsdl文件,用webservice client来生成对应...
  • a1124544556
  • a1124544556
  • 2016年12月30日 00:05
  • 1240
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在Axis中处理复杂的自定义的数据类型
举报原因:
原因补充:

(最多只允许输入30个字)