什么是 Axis
Axis 本质上是一个 SOAP 引擎,但 Axis 也不仅仅是一个 SOAP 引擎,可以称作是一个 web services 。由于 本文重点不在于些,请您参考《 Axis用户指南 》
您必需了解的知识
如果您是一个 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;
}