如果您是一个java,servlet和SOAP的新手,那您可能会遇到很多关于Axis的麻烦,所以这时不建议您编写Axis的客户和服务程序。当您基本了解了如下知识时,您就可以开始Axis之旅了。
Java的数据类型,类和编程概念的核心。 什么是线程(threads),竞态条件(race conditions),线程安全(thread safety)和同步(sychronization) 。 什么是classloader,什么是多等级classloader,和"ClassNotFoundException"异常的共同原因。 怎么样诊断来自己异常跟踪到的问题,NullPointerException(NPE)和其它共同异常是什么,并且知道怎么修改他们。 什么是web 应用;什么是servlet,类,类库和数据放在Web应用中的什么位置。 怎么启动您的应用服务,怎么发布一个web应用到应用服务上。 什么是网络,IP协议概念的核心和那些sockets API。特别是,什么是TCP/IP。 什么是HTTP。核心协议和错误代码,Http头和大部分的验证细节。 什么是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产品也应提供这两种方法; 2、虽然前面曾说到wsdl不重要,这只是说在这里不重要,Axis会利用web-inf下的server-config.wsdd web服务发布描述文件(Web Service Deployment Descriptor)生成wsdl,其实wsdl依然是web services的核心描述; 3、如果生成的war包在某些版本的tomcat或其它web引擎中不能运行,请参考Axis的安装说明;如果您的程序没有正常运行,请您通过msn和我联系:[email protected]
本文地址:http://com.8s8s.com/it/it15811.htm