下面就是在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遵循的是統一的行業標准(SOAP
XML等)
因此無論使用
NET語言還是使用非
NET語言
都可以調用它
尤其對於GetPersonTable()返回的結果來說
只要用XML Parser作簡單的處理
就能把數據提取出來
下面就將演示如何在Java中完成這一處理
在Java中調用NET Web Services處理返回的數據集合 編寫客戶端調用Web Services時
最快速簡便做法的是利用工具根據Web Services的WSDL描述生成客戶端代理類(Proxy)
而不是直接對SOAP Toolkit進行編程
在
NET Framework中
這個工作可以由wsdl
exe完成
在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 javaclient
service
Soap
Clientstruct;
public class Person {
public java
lang
String Name;
public java
lang
String Gender;
}
/*
* Generated by WSDLCompiler
(c)
Systinet Corp
*
*/
表
在Java中調用GetPersons()的代碼
在Proxy類的基礎上
就可以訪問
NET編寫的Web Services並提取數據了
對於GetPersons()來說
由於已經生成了Person類
所以調用代碼非常簡單直接
import org
idoox
webservice
client
WebServiceLookup;
import org
idoox
wasp
Context;
import javax
swing
*;
import javax
swing
table
*;
try{
System
setProperty(
wasp
location
C:\\Home\\Util\\wasp_
SP
);
javaclient
service
Soap
Client
Service
Soap service;
String serviceURI =
;
String wsdlURI =
;
WebServiceLookup lookup = (WebServiceLookup) Context
getInstance(Context
WEBSERVICE_LOOKUP);
service = (javaclient
service
Soap
Client
Service
Soap) lookup
lookup(
wsdlURI
javaclient
service
Soap
Client
Service
Soap
class
serviceURI);
Person[] persons=
service
GetPersons(new javaclient
service
Soap
Clientstruct
GetPersons())
GetPersonsResult;
DefaultTableModel model=new DefaultTableModel(new String[]{
name
gender
}
);
for(int i=
;i<persons
length;i++){
model
addRow(new String[]{persons[i]
Name
toString()
persons[i]
Gender
toString()});
}
this
jTable
setModel(model);
}
catch(Exception ex)
{
javax
swing
JOptionPane
showMessageDialog(this
ex
getMessage());
}
調用GetPersonTable()並解析XML字符串要相對復雜一些
需要用到XML Parser從圖表
中的XML字符串中提取數據
並逐一顯示在JTable中
下面是從訪問Web Method到解析XML
最後提取數據並顯示的完整代碼
及其運行結果截圖
import javax
swing
*;
import javax
swing
table
*;
import org
idoox
webservice
client
WebServiceLookup;
import org
idoox
wasp
Context;
import org
w
c
dom
*;
import org
apache
xml
serialize
*;
import org
apache
xerces
dom
*;
try{
System
setProperty(
wasp
location
C:\\Home\\Util\\wasp_
SP
);
javaclient
service
Soap
Client
Service
Soap service;
String serviceURI =
;
String wsdlURI =
;
WebServiceLookup lookup = (WebServiceLookup) Context
getInstance(Context
WEBSERVICE_LOOKUP);
service = (javaclient
service
Soap
Client
Service
Soap) lookup
lookup(
wsdlURI
javaclient
service
Soap
Client
Service
Soap
class
serviceURI);
String result=
service
GetPersonTable(new javaclient
service
Soap
Clientstruct
GetPersonTable())
GetPersonTableResult;
DefaultTableModel model=new DefaultTableModel(new String[]{
name
gender
}
);
java
io
StringReader reader=new java
io
StringReader(result);
org
apache
xerces
parsers
DOMParser parser=new org
apache
xerces
parsers
DOMParser();
parser
parse(new org
xml
sax
InputSource(reader));
org
w
c
dom
Document document=parser
getDocument();
org
w
c
dom
NodeList children=document
getDocumentElement()
getChildNodes();
for(int i=
;i<children
getLength();i++){
org
w
c
dom
Node node=em(i);
if(node
getNodeName()
equals(
Person
)){
org
w
c
dom
NodeList personAttrNodes=node
getChildNodes();
String name=
N/A
;
String gender=
N/A
;
for(int j=
;j<personAttrNodes
getLength();j++){
org
w
c
dom
Node attrNode=em(j);
String attrNodeName=attrNode
getNodeName();
if(attrNodeName
equals(
Name
)){
name=attrNode
getFirstChild()
getNodeValue();
}else if(attrNodeName
equals(
Gender
)){
gender=attrNode
getFirstChild()
getNodeValue();
}else{
continue;
}
}
model
addRow(new String[]{name
gender});
}
}
this
jTable
setModel(model);
}
catch(Exception ex)
{
javax
swing
JOptionPane
showMessageDialog(this
ex
getMessage());
}
educitycn/img_///jpg> 小結 從前面的敘述和代碼中可以看出
對於
如何在Java/Delphi中使用
NET的Web Service返回的DataSet
的問題
雖然在非
NET語言環境中直接接受DataSet類型的返回值比較困難
但可以有其他的解決方案
對於第一種解決方案
也就是采用自定義數據類型
它的優點是客戶端代碼非常簡單
容易編寫
而且容易理解
它的缺點是服務器端需要定義新的類
而且當通過ADO
NET從數據庫中提取數據以後
還要再手工編寫代碼
將DataSet中的數據遍歷一遍
轉存成自定義類型的對象
對於第二種解決方案
就是用DataSet
WriteXML()的方案
它的優點和缺點正好和第一種方案是互補的
它在客戶端需要編寫較多的代碼
尤其是需要用XML Parser編程
提高了編程的難度
另一方面
它在服務器端比較簡單
如果開發者在原先的純
NET環境(即客戶端也是
NET)中已經開發了返回類型為DataSet的Web Services
那麼當開發者希望在客戶端引入非
NET語言時
服務器端只需要簡單的再增加一個Web Method
通過簡單的WriteXML()調用對
From:http://tw.wingwit.com/Article/program/net/201311/13112.html