java ee WebService Axis / Xfire / CXF / JAX-WS / JAX-RPC / Digester
一月收集幾個有用的谷歌Chrome插件 postman for webservice
http://www.poluoluo.com/jzxy/201301/194875.html
Postman – REST Client
Postman是一個工具的幫助開發人員提高工作效率的API,他是一個功能強大的的HTTP REST客戶端,是前端模擬發送數據/調試的好工具。
WebService JAX-RPC / JAX-WS
Web 服務提示與技巧: JAX-RPC 與 JAX-WS 的比較
http://www.ibm.com/developerworks/cn/webservices/ws-tip-jaxwsrpc.html
引言
Russell Butek (butek@us.ibm.com), IT 專家, EMC
Nicholas Gallardo (nlgallar@us.ibm.com), 軟件工程師, EMC
簡介:
JAX-WS 2.0 是 JAX-RPC 1.1 的后續版本。
本文將引出對這兩個 Java Web 服務編程模型進行比較的一系列文章。
Russell Butek 是 IBM 的一名 SOA 和 Web 服務顧問。
他曾是 IBM WebSphere Web 服務引擎的開發人員之一。
他也是 JAX-RPC Java Specification Request (JSR) 專家組的成員。
他參與了 Apache 的 AXIS SOAP 引擎的實現,并推動 AXIS 1.0 遵守 JAX-RPC。
Digester
http://commons.apache.org/digester/
Digester API 2.0
http://commons.apache.org/digester/commons-digester-2.0/docs/api/
Digester Example
http://www.ibm.com/developerworks/java/library/j-lucene/
Digester Download
http://commons.apache.org/digester/download_digester.cgi?Preferred=http%3A%2F%2Flabs.xiaonei.com%2Fapache-mirror
http://labs.xiaonei.com/apache-mirror/commons/digester/binaries/commons-digester-2.0-bin.tar.gz
http://labs.xiaonei.com/apache-mirror/commons/digester/binaries/commons-digester-2.0-bin.zip
http://labs.xiaonei.com/apache-mirror/commons/digester/source/commons-digester-2.0-src.tar.gz
http://labs.xiaonei.com/apache-mirror/commons/digester/source/commons-digester-2.0-src.zip
Web Service 性能測試工具 soapUI , Jmeter
http://www.51testing.com/?action_viewnews_itemid_93122.html
計時機制
JMeter 用的是System.currentTimeMillis();
soapUI用的是System.nanoTime(); soapUI-x32-4_0_0.exe
幾種基于HTTP協議的RPC性能比較
http://jspengxue.iteye.com/blog/48124
WebService是用犧牲性能來換取跨平臺的遠程過程調用或者消息交換的。由于采用了SOAP這樣的標準協議,才可能得到很多支持。如果你繞過SOAP,你的東西就不能稱為WebService的了,但可以算是借鑒了它的實現思想的一種結構。
比如你完全可以基于底層的協議來實現internet上2個程序之間的交互,但是這個開發量很大的。因為基于SOAP的Webservice已經得到了幾 乎所有的開發工具的支持,所以開發量就小多了,它解決了不同語言的數據結構不同的問題,比如你可以用java寫一個方法,在服務器端發布成一個 Webservice,而另外的人可以用delphi,c#等各種支持標準webservice的語言來調用你用java寫的方法,而不用關心java的 String和delphi的TString在內存里是不同的東西。
至于性能,由于不知道你的應用是什么應用,Webservice的性能比直接調用方法肯定要慢,畢竟要把數據組織成XML,但是在目前的硬件性能下,這些已經不是瓶頸了。倒是對帶寬的要求比較高一些。畢竟XML比較大。
referrence
http://www.w3.org/2002/ws/ Web Services Activity
http://blog.sina.com.cn/s/blog_4d6be6f301000bsz.html
http://blog.csdn.net/kay5804/archive/2008/05/04/2382428.aspx
http://hi.baidu.com/lioliang/blog/item/03e134a4887e1ef29152ee6a.html
http://www.blogjava.net/zhuyuanxiang/archive/2008/03/03/183377.html
download axis1.4
http://apache.mirror.phpchina.com/ws/axis/1_4/
http://apache.mirror.phpchina.com/ws/axis/1_4/axis-bin-1_4.zip
http://apache.mirror.phpchina.com/ws/axis/1_4/axis-src-1_4.zip
copy
D:\program\webService\axis\axis-bin-1_4\axis-1_4\webapps\axis
to
D:\tomcat5\webapps\axis
download other jars
mail.jar: D:\program\webService\axis\javamail-1.4.1\mail.jar
http://java.sun.com/products/javamail/downloads/index.html
http://java.sun.com/products/javabeans/glasgow/jaf.html
Activation.jar : D:\program\webService\axis\jaf-1.0.2\activation.jar
http://java.sun.com/products/javabeans/jaf/downloads/index.html
xmlsec.jar: D:\program\webService\axis\xml-security-1_4_2\libs\xmlsec-1.4.2.jar
http://xml.apache.org/security/dist/java-library/
to
D:\tomcat5\webapps\axis
deploy
info
http://localhost/axis/happyaxis.jsp
Needed Components
- Found SAAJ API ( javax.xml.soap.SOAPMessage ) at D:\tomcat5\webapps\axis\WEB-INF\lib\saaj.jar
- Found JAX-RPC API ( javax.xml.rpc.Service ) at D:\tomcat5\webapps\axis\WEB-INF\lib\jaxrpc.jar
- Found Apache-Axis ( org.apache.axis.transport.http.AxisServlet ) at D:\tomcat5\webapps\axis\WEB-INF\lib\axis.jar
- Found Jakarta-Commons Discovery ( org.apache.commons.discovery.Resource ) at D:\tomcat5\webapps\axis\WEB-INF\lib\commons-discovery-0.2.jar
- Found Jakarta-Commons Logging ( org.apache.commons.logging.Log ) at D:\tomcat5\bin\commons-logging-api.jar
- Found Log4j ( org.apache.log4j.Layout ) at D:\tomcat5\webapps\axis\WEB-INF\lib\log4j-1.2.8.jar
- Found IBM's WSDL4Java ( com.ibm.wsdl.factory.WSDLFactoryImpl ) at D:\tomcat5\webapps\axis\WEB-INF\lib\wsdl4j-1.5.1.jar
- Found JAXP implementation ( javax.xml.parsers.SAXParserFactory ) at an unknown location
- Found Activation API ( javax.activation.DataHandler ) at D:\tomcat5\webapps\axis\WEB-INF\lib\activation.jar
Optional Components
- Found Mail API ( javax.mail.internet.MimeMessage ) at D:\tomcat5\webapps\axis\WEB-INF\lib\mail.jar
- Found XML Security API ( org.apache.xml.security.Init ) at D:\tomcat5\webapps\axis\WEB-INF\lib\xmlsec-1.4.2.jar
- Found Java Secure Socket Extension ( javax.net.ssl.SSLSocketFactory ) at an unknown location
http://fsun.iteye.com/blog/80180
AXIS Service Config Sucess!
AXIS Service test
將SayHello.java改為SayHello.jws放入D:\tomcat5\webapps\axis\
//package com.lindows.service;
//AxisService 基本數據類型
public class SayHello {
// 這個類沒有包,注意了.
public String say(String name) {
return " Hello ~~" + name;
}
}
http://localhost/axis/SayHello.jws ok
AXIS Client test
package com.lindows.client;
import java.rmi.RemoteException;
import javax.xml.rpc.ServiceException;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
public class SayHello {
/**
* @param args
* @author Lindows
* 普通數據類型
*/
public static void main(String[] args) {
String urlname = "http://localhost/axis/SayHello.jws";
/*
* 這是wsdl的絕對路徑.也可以直接寫成如下 ,這個沒有區別.
* http://localhost/axis/SayHello.jws?wsdl
*/
Service s = new Service();
try {
Call call = (Call) s.createCall();
// 調用的目標url
call.setTargetEndpointAddress(urlname);
// 調用的方法名
call.setOperationName("say");
// 設置調用方法參數
String val = (String) call.invoke(new Object[] { "我是 Lindows" });
System.out.println("這里是服務器返回給你的:>>>" + val);
} catch (ServiceException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
run: 這里是服務器返回給你的:>>> Hello ~~我是 Lindows ok
JavaSE6.0 Web Service學習筆記
http://cissco.iteye.com/blog/221108
Web Service的定義
W3C組織對其的定義如下,它是一個軟件系統,為了支持跨網絡的機器間相互操作交互而設計。Web Service服務通常被定義為一組模塊化的API,它們可以通過網絡進行調用,來執行遠程系統的請求服務。
這 里我們從一個程序員的視角來觀察web service。在傳統的程序編碼中,存在這各種的函數方法調用。通常,我們知道一個程序模塊M中的方法A,向其發出調用請求,并傳入A方法需要的參數 P,方法A執行完畢后,返回處理結果R。這種函數或方法調用通常發生在同一臺機器上的同一程序語言環境下?,F在的我們需要一種能夠在不同計算機間的不同語 言編寫的應用程序系統中,通過網絡通訊實現函數和方法調用的能力,而Web service正是應這種需求而誕生的。
最普遍的一種說 法就是,Web Service = SOAP + HTTP + WSDL。其中,SOAP Simple Object Access Protocol)協議是web service的主體,它通過HTTP或者SMTP等應用層協議進行通訊,自身使用XML文件來描述程序的函數方法和參數信息,從而完成不同主機的異構系 統間的計算服務處理。這里的WSDL(Web Services Description Language)web 服務描述語言也是一個XML文檔,它通過HTTP向公眾發布,公告客戶端程序關于某個具體的 Web service服務的URL信息、方法的命名,參數,返回值等。
下面,我們先來熟悉一下SOAP協議,看看它是如何描述程序中的函數方法、參數及結果對象的。
SOAP協議簡介
什么是SOAP
SOAP 指簡單對象訪問協議,它是一種基于XML的消息通訊格式,用于網絡上,不同平臺,不同語言的應用程序間的通訊。可自定義,易于擴展。一條 SOAP 消息就是一個普通的 XML 文檔,包含下列元素:
? Envelope 元素,標識XML 文檔一條 SOAP 消息
? Header 元素,包含頭部信息的XML標簽
? Body 元素,包含所有的調用和響應的主體信息的標簽
? Fault 元素,錯誤信息標簽。
以上的元素都在 SOAP的命名空間http://www.w3.org/2001/12/soap-envelope中聲明;
SOAP的語法規則
? SOAP 消息必須用 XML 來編碼
? SOAP 消息必須使用 SOAP Envelope 命名空間
? SOAP 消息必須使用 SOAP Encoding 命名空間
? SOAP 消息不能包含 DTD 引用
? SOAP 消息不能包含 XML 處理指令
SOAP 消息的基本結構
- <? xml version= "1.0" ?>
- <soap:Envelope
- xmlns:soap= "http://www.w3.org/2001/12/soap-envelope"
- soap:encodingStyle= "http://www.w3.org/2001/12/soap-encoding" >
- <soap:Header>
- ...
- ...
- </soap:Header>
- <soap:Body>
- ...
- ...
- <soap:Fault>
- ...
- ...
- </soap:Fault>
- </soap:Body>
- </soap:Envelope>
- <? xml version= "1.0" ?>
- <soap:Envelope
- xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
- soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding" >
- <soap:Header>
- ...
- ...
- </soap:Header>
- <soap:Body>
- ...
- ...
- <soap:Fault>
- ...
- ...
- </soap:Fault>
- </soap:Body>
- </soap:Envelope>
<? xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
<soap:Header>
...
...
</soap:Header>
<soap:Body>
...
...
<soap:Fault>
...
...
</soap:Fault>
</soap:Body>
</soap:Envelope>
SOAP Envelope 元素
Envelope 元素是 SOAP 消息的根元素。它指明 XML 文檔是一個SOAP 消息。它的屬性 xmlns:soap的值必須是http://www.w3.org/2001/12/soap-envelope。
? encodingStyle 屬性,語法:soap:encodingStyle="URI"
encodingStyle 屬性用于定義文檔中使用的數據類型。此屬性可出現在任何 SOAP 元素中,并會被應用到元素的內容及元素的所有子元素上。
- <? xml version= "1.0" ?>
- <soap:Envelope
- xmlns:soap= "http://www.w3.org/2001/12/soap-envelope"
- soap:encodingStyle= "http://www.w3.org/2001/12/soap-encoding" >
- ...
- Message information goes here
- ...
- </soap:Envelope>
- <? xml version= "1.0" ?>
- <soap:Envelope
- xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
- soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding" >
- ...
- Message information goes here
- ...
- </soap:Envelope>
<? xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
...
Message information goes here
...
</soap:Envelope>
SOAP Header 元素
- actor 屬性,語法soap:actor="URI"
通過沿著消息路徑經過不同的端點,SOAP 消息可從某個發送者傳播到某個接收者。并非 SOAP 消息的所有部分均打算傳送到 SOAP 消息的最終端點,不過,另一個方面,也許打算傳送給消息路徑上的一個或多個端點。SOAP 的 actor 屬性可被用于將 Header 元素尋址到一個特定的端點。
- mustUnderstand 屬性 ,語法soap:mustUnderstand="0|1"
SOAP 的 mustUnderstand 屬性可用于標識標題項對于要對其進行處理的接收者來說是強制的還是可選的。假如您向 Header 元素的某個子元素添加了 "mustUnderstand="1",則要求處理此頭部的接收者必須認可此元素。
- <? xml version= "1.0" ?>
- <soap:Envelope
- xmlns:soap= "http://www.w3.org/2001/12/soap-envelope"
- soap:encodingStyle= "http://www.w3.org/2001/12/soap-encoding" >
- <soap:Header>
- <m:Trans
- xmlns:m= "http://www.jsoso.net/transaction/"
- soap:mustUnderstand= "1"
- soap:actor="http: //www.w3schools.com/appml/ “ >234</m:Trans>
- </soap:Header>
- ...
- ...
- </soap:Envelope>
- <? xml version= "1.0" ?>
- <soap:Envelope
- xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
- soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding" >
- <soap:Header>
- <m:Trans
- xmlns:m="http://www.jsoso.net/transaction/"
- soap:mustUnderstand="1"
- soap:actor="http://www.w3schools.com/appml/ “ >234</m:Trans>
- </soap:Header>
- ...
- ...
- </soap:Envelope>
<? xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
<soap:Header>
<m:Trans
xmlns:m="http://www.jsoso.net/transaction/"
soap:mustUnderstand="1"
soap:actor="http://www.w3schools.com/appml/ “ >234</m:Trans>
</soap:Header>
...
...
</soap:Envelope>
SOAP Body 元素
必需的 SOAP Body 元素可包含打算傳送到消息最終端點的實際 SOAP 消息。Body元素中既可以包含SOAP定義的命名空間中的元素,如Fault,也可以是用戶的應用程序自定義的元素。以下是一個用戶定義的請求:
- <? xml version= "1.0" ?>
- <soap:Envelope
- xmlns:soap= "http://www.w3.org/2001/12/soap-envelope"
- soap:encodingStyle= "http://www.w3.org/2001/12/soap-encoding" >
- <soap:Body>
- <m:GetPrice xmlns:m= "http://www.jsoso.net/prices" >
- <m:Item>Apples</m:Item>
- </m:GetPrice>
- </soap:Body>
- </soap:Envelope>
- <? xml version= "1.0" ?>
- <soap:Envelope
- xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
- soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding" >
- <soap:Body>
- <m:GetPrice xmlns:m="http://www.jsoso.net/prices" >
- <m:Item>Apples</m:Item>
- </m:GetPrice>
- </soap:Body>
- </soap:Envelope>
<? xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
<soap:Body>
<m:GetPrice xmlns:m="http://www.jsoso.net/prices">
<m:Item>Apples</m:Item>
</m:GetPrice>
</soap:Body>
</soap:Envelope>
上面的例子請求蘋果的價格。請注意,上面的 m:GetPrice 和 Item 元素是應用程序專用的元素。它們并不是 SOAP 標準的一部分。而對應的 SOAP 響應應該類似這樣:
- <?xml version= "1.0" ?>
- <soap:Envelope
- xmlns:soap= "http://www.w3.org/2001/12/soap-envelope"
- soap:encodingStyle= "http://www.w3.org/2001/12/soap-encoding" >
- <soap:Body>
- <m:GetPriceResponse xmlns:m= "http://www.jsoso.net/prices" >
- <m:Price> 1.90 </m:Price>
- </m:GetPriceResponse>
- </soap:Body>
- </soap:Envelope>
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
<soap:Body>
<m:GetPriceResponse xmlns:m="http://www.jsoso.net/prices">
<m:Price>1.90</m:Price>
</m:GetPriceResponse>
</soap:Body>
</soap:Envelope>
SOAP Fault 元素
Fault 元素表示 SOAP的錯誤消息。它必須是 Body 元素的子元素,且在一條 SOAP 消息中,Fault 元素只能出現一次。Fault 元素擁有下列子元素:
常用的SOAP Fault Codes
HTTP協議中的SOAP 實例
下面的例子中,一個 GetStockPrice 請求被發送到了服務器。此請求有一個 StockName 參數,而在響應中則會返回一個 Price 參數。此功能的命名空間被定義在此地址中: "http://www.jsoso.net/stock"
- SOAP 請求:(注意HTTP的Head屬性)
- POST /InStock HTTP/ 1.1
- Host: www.jsoso.net
- Content-Type: application/soap+xml; charset=utf- 8
- Content-Length: XXX
- <? xml version= "1.0" ?>
- <soap:Envelope
- xmlns:soap= "http://www.w3.org/2001/12/soap-envelope"
- soap:encodingStyle= "http://www.w3.org/2001/12/soap-encoding" >
- <soap:Body xmlns:m= "http://www.jsoso.net/stock" >
- <m:GetStockPrice>
- <m:StockName>IBM</m:StockName>
- </m:GetStockPrice>
- </soap:Body>
- </soap:Envelope>
POST /InStock HTTP/1.1
Host: www.jsoso.net
Content-Type: application/soap+xml; charset=utf-8
Content-Length: XXX
<? xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
<soap:Body xmlns:m="http://www.jsoso.net/stock">
<m:GetStockPrice>
<m:StockName>IBM</m:StockName>
</m:GetStockPrice>
</soap:Body>
</soap:Envelope>
- SOAP 響應:(注意HTTP的Head屬性)
- HTTP/ 1.1 200 OK
- Content-Type: application/soap+xml; charset=utf- 8
- Content-Length: XXX
- <? xml version= "1.0" ?>
- <soap:Envelope
- xmlns:soap= "http://www.w3.org/2001/12/soap-envelope"
- soap:encodingStyle= "http://www.w3.org/2001/12/soap-encoding" >
- <soap:Body xmlns:m= "http://www.jsoso.net/stock" >
- <m:GetStockPriceResponse>
- <m:Price> 34.5 </m:Price>
- </m:GetStockPriceResponse>
- </soap:Body>
- </soap:Envelope>
HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: XXX
<? xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
<soap:Body xmlns:m="http://www.jsoso.net/stock">
<m:GetStockPriceResponse>
<m:Price>34.5</m:Price>
</m:GetStockPriceResponse>
</soap:Body>
</soap:Envelope>
HTTP協議中的SOAP RPC工作流程
WSDL簡介
介紹過了SOAP,讓我們關注Web Service中另外一個重要的組成WSDL。
WSDL的主要文檔元素
幾種基于HTTP協議的RPC性能比較
http://jspengxue.iteye.com/blog/48124
有 了整體的了解后,可以發現Hessian的這個遠程過程調用,完全使用動態代理來實現的,其實從客戶端代碼不難看 出,HessianProxyFactory的create方法就是創建接口Basic的代理類,該類實現了Basic接口,JDK的proxy類會自動 用 InvocationHandler 的實現類(該類在Hessian中表現為HessianProxy)的invoke方法體 來填充所生成代理類的方法體,從而實現遠程調用,傳輸過程使用的是基于Http的二進制字節流。
RMI與Hessian的調用過程比較:
Hessian:客戶端(basic.hello())——>序列化寫到輸出流——>遠程方法(服務器端)——>序列化寫到輸出流 ——>客戶端讀取輸入流——>輸出結果
RMI:客戶端——>stub——>序列化——>skeleton——>遠程方法——>序列化——>stub—— >輸出結果
服務端的是一個簡單的加密、解密方法,各種協議使用同一個實現的代碼。
客戶端是獨立的java程序,分別用各種協議對服務端的方法進行調用。每一種協議循環調用n次,然后取平均值。
循環1,000次的測試
第一次
Axis --------------->> Total time: 11123 ms, Avg time: 11.123 ms
Burlap ------------->> Total time: 866 ms, Avg time: 0.866 ms
Hessian ------------>> Total time: 581 ms, Avg time: 0.581 ms
REST --------------->> Total time: 929 ms, Avg time: 0.929 ms
AxisUsingWSDL2Java ->> Total time: 11998 ms, Avg time: 11.998 ms
第二次
Axis --------------->> Total time: 11256 ms, Avg time: 11.256 ms
Burlap ------------->> Total time: 816 ms, Avg time: 0.816 ms
Hessian ------------>> Total time: 582 ms, Avg time: 0.582 ms
REST --------------->> Total time: 919 ms, Avg time: 0.919 ms
AxisUsingWSDL2Java ->> Total time: 11908 ms, Avg time: 11.908 ms
循環10,000次的測試
第一次
Axis --------------->> Total time: 88013 ms, Avg time: 8.8013 ms
Burlap ------------->> Total time: 5789 ms, Avg time: 0.5789 ms
Hessian ------------>> Total time: 5162 ms, Avg time: 0.5162 ms
REST --------------->> Total time: 8316 ms, Avg time: 0.8316 ms
AxisUsingWSDL2Java ->> Total time: 112801 ms, Avg time: 11.2801 ms
第二次
Axis --------------->> Total time: 87359 ms, Avg time: 8.7359 ms
Burlap ------------->> Total time: 5784 ms, Avg time: 0.5784 ms
Hessian ------------>> Total time: 5084 ms, Avg time: 0.5084 ms
REST --------------->> Total time: 7983 ms, Avg time: 0.7983 ms
AxisUsingWSDL2Java ->> Total time: 113234 ms, Avg time: 11.3234 ms
測試結果
Hessian最快,Burlap第二,REST第三,Axis最慢。前3種要比Axis快了10倍或者更多。
上面的測試,服務端用的是Resin-3.0.13,出于好奇,我又用Tomcat-5.5.9測試了一把,結果是Resin確實比Tomcat快些。 Tomcat-5.5.9 循環10,000次的測試
- Axis --------------->> Total time: 122551 ms, Avg time: 12 .2551ms
- Burlap ------------->> Total time: 6401 ms, Avg time: 0 .6401ms
- Hessian ------------>> Total time: 5745 ms, Avg time: 0 .5745ms
- REST --------------->> Total time: 8090 ms, Avg time: 0 .809ms
- AxisUsingWSDL2Java ->> Total time: 156908 ms, Avg time: 15 .6908ms
· 支持XML名稱空間
· 用"松散"模式分析HTML或其它SGML格式
· 占用很少的存儲空間(21 kbps)
· 基于Pull的分析
· 支持XML寫操作
· 可選的DOM支持
· 可選的WAP支持
end


浙公網安備 33010602011771號