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

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

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

  1. Java 的数据类型,类和编程概念的核心。
  2. 什么是线程( threads ),竞态条件( race conditions , 线程安全( thread safety )和同步( sychronization
  3. 什么是 classloader ,什么是多等级 classloader ,和 "ClassNotFoundException" 异常的共同原因。
  4. 怎么样诊断来自己异常跟踪到的问题, NullPointerException NPE )和其它共同异常是什么,并且知道怎么修改他们。
  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 8 Axis 之旅
1、 打开 Jbuider 8 ,建一个新工程 Axistour ,再建一个 Web 应用 tour ,这里使用 tomcat-4.0.6-LE-jdk14
2、 建一个 Web Services ,选择 web services configuration OK 后按向导的缺省操作进行;
3、 检验 Axis 工程。编译 Axisour 工程,选择 tour/Root directory/index.html ,右键菜单中选择: Web run using “Web Services Server” ,其中引号中的 Web Services Server web 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.wsdd wsdl ,其中 deploy.wsdd 至关重要,而 wsdl 文件在这里并不重要;
8、 到此您已完成 Axis 的服务程序,编译整个工程,启动 web services
9、 测试 wsdl ,如果您的 Http 端口是 8080(如果您本机的web服务不是8080,请改为您本机相应的端号 ,请访问如下 URL http://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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值