下面就是在Internet Exploerer里直接调用这两个Web Method所得到的XML格式的结果
表 GetPersons()的返回结果
<?xml version= encoding=utf?>
<ArrayOfPerson xmlns:xsd=
xmlns:xsi=instance
xmlns=>
<Person>
<Name>Alice</Name>
<Gender>Female</Gender>
</Person>
<Person>
<Name>Bob</Name>
<Gender>Male</Gender>
</Person>
<Person>
<Name>Chris</Name>
<Gender>Female</Gender>
</Person>
<Person>
<Name>Dennis</Name>
<Gender>Male</Gender>
</Person>
</ArrayOfPerson>
表 GetPersonTable()的返回的String类型的值
<PersonTable> <Person>
<Name>Alice</Name>
<Gender>Female</Gender>
</Person> <Person>
<Name>Bob</Name>
<Gender>Male</Gender>
</Person> <Person>
<Name>Chris</Name>
<Gender>Female</Gender>
</Person> <Person>
<Name>Dennis</Name>
<Gender>Male</Gender>
</Person> <Person>
<Name>Eric</Name>
<Gender>Male</Gender>
</Person> </PersonTable>
到这里XML Web Service的创建就已经完成了NET中创建的XML Web Services遵循的是统一的行业标准(SOAPXML等)因此无论使用NET语言还是使用非NET语言都可以调用它尤其对于GetPersonTable()返回的结果来说只要用XML Parser作简单的处理就能把数据提取出来下面就将演示如何在Java中完成这一处理
在Java中调用NET Web Services处理返回的数据集合
编写客户端调用Web Services时最快速简便做法的是利用工具根据Web Services的WSDL描述生成客户端代理类(Proxy)而不是直接对SOAP Toolkit进行编程在NET Framework中这个工作可以由wsdlexe完成在Java中可以在JBuilder或者VisualAge Java等Java IDE中安装一个叫做WASP Developer的免费插件这个插件也能完成由WSDL描述生成Proxy类的工作另外该公司还提供了WASP Server for Java和WASP UDDI降低了用户用Java开发Web Services以及建立UDDI服务的难度
在本文的例子中用了JBuilder +WASP Developer来调用前文中建立的NET XML Web Services在调用之前首先是用WASP Developer生成Proxy类从图表中可以看到生成Proxy的工具已经在Java中也创建了一个Person类
表 用WASP Developer生成的Proxy类
educitycn/img_///jpg >表 WASP Developer创建的Person类
package javaclientserviceSoapClientstruct;
public class Person {
public javalangString Name;
public javalangString Gender;
}
/*
* Generated by WSDLCompiler (c) Systinet Corp
*
*/
表 在Java中调用GetPersons()的代码
在Proxy类的基础上就可以访问NET编写的Web Services并提取数据了对于GetPersons()来说由于已经生成了Person类所以调用代码非常简单直接
import orgidooxwebserviceclientWebServiceLookup;
import orgidooxwaspContext;
import javaxswing*;
import javaxswingtable*;
try{
SystemsetProperty( wasplocationC:\\Home\\Util\\wasp_SP);
javaclientserviceSoapClientServiceSoap service;
String serviceURI = ;
String wsdlURI = ;
WebServiceLookup lookup = (WebServiceLookup) ContextgetInstance(ContextWEBSERVICE_LOOKUP);
service = (javaclientserviceSoapClientServiceSoap) lookuplookup(
wsdlURI
javaclientserviceSoapClientServiceSoapclass
serviceURI);
Person[] persons=
serviceGetPersons(new javaclientserviceSoapClientstructGetPersons())GetPersonsResult;
DefaultTableModel model=new DefaultTableModel(new String[]{namegender});
for(int i=;i<personslength;i++){
modeladdRow(new String[]{persons[i]NametoString()persons[i]GendertoString()});
}
thisjTablesetModel(model);
}
catch(Exception ex)
{
javaxswingJOptionPaneshowMessageDialog(thisexgetMessage());
}
调用GetPersonTable()并解析XML字符串要相对复杂一些需要用到XML Parser从图表中的XML字符串中提取数据并逐一显示在JTable中下面是从访问Web Method到解析XML最后提取数据并显示的完整代码及其运行结果截图
import javaxswing*;
import javaxswingtable*;
import orgidooxwebserviceclientWebServiceLookup;
import orgidooxwaspContext;
import orgwcdom*;
import orgapachexmlserialize*;
import orgapachexercesdom*;
try{
SystemsetProperty( wasplocationC:\\Home\\Util\\wasp_SP);
javaclientserviceSoapClientServiceSoap service;
String serviceURI = ;
String wsdlURI = ;
WebServiceLookup lookup = (WebServiceLookup) ContextgetInstance(ContextWEBSERVICE_LOOKUP);
service = (javaclientserviceSoapClientServiceSoap) lookuplookup(
wsdlURI
javaclientserviceSoapClientServiceSoapclass
serviceURI);
String result=
serviceGetPersonTable(new javaclientserviceSoapClientstructGetPersonTable())GetPersonTableResult;
DefaultTableModel model=new DefaultTableModel(new String[]{namegender});
javaioStringReader reader=new javaioStringReader(result);
orgapachexercesparsersDOMParser parser=new orgapachexercesparsersDOMParser();
parserparse(new orgxmlsaxInputSource(reader));
orgwcdomDocument document=parsergetDocument();
orgwcdomNodeList children=documentgetDocumentElement()getChildNodes();
for(int i=;i<childrengetLength();i++){
orgwcdomNode node=em(i);
if(nodegetNodeName()equals(Person)){
orgwcdomNodeList personAttrNodes=nodegetChildNodes();
String name=N/A;
String gender=N/A;
for(int j=;j<personAttrNodesgetLength();j++){
orgwcdomNode attrNode=em(j);
String attrNodeName=attrNodegetNodeName();
if(attrNodeNameequals(Name)){
name=attrNodegetFirstChild()getNodeValue();
}else if(attrNodeNameequals(Gender)){
gender=attrNodegetFirstChild()getNodeValue();
}else{
continue;
}
}
modeladdRow(new String[]{namegender});
}
}
thisjTablesetModel(model);
}
catch(Exception ex)
{
javaxswingJOptionPaneshowMessageDialog(thisexgetMessage());
}
educitycn/img_///jpg> 小结
从前面的叙述和代码中可以看出对于如何在Java/Delphi中使用NET的Web Service返回的DataSet的问题虽然在非NET语言环境中直接接受DataSet类型的返回值比较困难但可以有其他的解决方案
对于第一种解决方案也就是采用自定义数据类型它的优点是客户端代码非常简单容易编写而且容易理解它的缺点是服务器端需要定义新的类而且当通过ADONET从数据库中提取数据以后还要再手工编写代码将DataSet中的数据遍历一遍转存成自定义类型的对象
对于第二种解决方案就是用DataSetWriteXML()的方案它的优点和缺点正好和第一种方案是互补的它在客户端需要编写较多的代码尤其是需要用XML Parser编程提高了编程的难度另一方面它在服务器端比较简单如果开发者在原先的纯NET环境(即客户端也是NET)中已经开发了返回类型为DataSet的Web Services那么当开发者希望在客户端引入非NET语言时服务器端只需要简单的再增加一个Web Method通过简单的WriteXML()调用对