基本概念:
1,什么是 Web 服務(wù)?
Web
是使應(yīng)用程序可以以與平臺和編程語言無關(guān)的方式進(jìn)行相互通信的一項(xiàng)技術(shù)。Web 服務(wù)是一個軟件接口,它描述了一組可以在網(wǎng)絡(luò)上通過標(biāo)準(zhǔn)化的 XML 消息傳遞訪問的操作。它使用基于 XML 語言的協(xié)議來描述要執(zhí)行的操作或者要與另一個 Web 服務(wù)交換的數(shù)據(jù)。一組以這種方式交互的 Web 服務(wù)在面向服務(wù)的體系結(jié)構(gòu)(Service-Oriented Architecture,SOA)中定義了特殊的 Web 服務(wù)應(yīng)用程序。
2,
什么是SOAP?
SOAP
(Simple Object Access Protocol )簡單對象訪問協(xié)議是在分散或分布式的環(huán)境中交換信息并執(zhí)行遠(yuǎn)程過程調(diào)用的輕量級協(xié)議,是一個基于XML的協(xié)議。使用SOAP,不用考慮任何特定的傳輸協(xié)議(最常用的還是HTTP協(xié)議),可以允許任何類型的對象或代碼,在任何平臺上,以任何一種語言相互通信。
SOAP
包括四個部分:
SOAP
封裝
(envelop)
,封裝定義了一個描述消息中的內(nèi)容是什么,是誰發(fā)送的,誰應(yīng)當(dāng)接受并處理它以及如何處理它們的框架;
SOAP
編碼規(guī)則(
encoding rules
),用于表示應(yīng)用程序需要使用的數(shù)據(jù)類型的實(shí)例;
SOAP RPC
表示
(RPC representation)
,表示遠(yuǎn)程過程調(diào)用和應(yīng)答的協(xié)定;
SOAP
綁定(
binding
),使用底層協(xié)議交換信息。
應(yīng)用中比較關(guān)注的是
envelop
,由一個或多個
Header
和一個
Body
組成。
SOAP
在可互操作的基礎(chǔ) Web 服務(wù)協(xié)議棧
中的位置
:
3,
什么是Axis?
Axis
本質(zhì)上就是一個SOAP引擎
(
Apache Axis is an implementation of the SOAP
),
提供創(chuàng)建服務(wù)器端、客戶端和網(wǎng)關(guān)SOAP操作的基本框架。但Axis并不完全是一個SOAP引擎,它還包括:
是一個獨(dú)立的SOAP服務(wù)器。
是一個嵌入Servlet引擎(例如Tomcat)的服務(wù)器。
支持WSDL。
提供轉(zhuǎn)化WSDL為Java類的工具。
提供例子程序。
提供TCP/IP數(shù)據(jù)包監(jiān)視工具。
4,
Axis
相比Soap v2的優(yōu)點(diǎn):
Axis
是第三代Apache SOAP的實(shí)現(xiàn),從2000年起,SOAP v2開發(fā)小組開始討論如何讓Axis更加靈活、可配置,以及能夠處理SOAP和來自W3C的各種XML標(biāo)準(zhǔn)。通過不斷地討論和代碼編寫,Axis目前相比SOAP V2取得了如下成果:
速度提高。 Axis通過基于事件的SAX對XML文檔進(jìn)行處理,從而在速度和效率上比Apache SOAP有所提高。
靈活性提高。
穩(wěn)定性提高。
提供面向組件的部署。
提供一個簡潔的傳輸抽象框架。其核心引擎完全于傳輸方式獨(dú)立。從而使基于何種協(xié)議傳輸?shù)倪x擇更加靈活。
支持WSDL。包括WSDL和客戶端代碼生成等。
5,
什么是WSDL?
WSDL
(
Web Service Description Language
)
Web
服務(wù)器描述語言是用
XML
文檔來描述
Web
服務(wù)的標(biāo)準(zhǔn),是
Web
服務(wù)的接口定義語言,由
Ariba
、
Intel
、
IBM
、
MS
等共同提出,通過
WSDL
,可描述
Web
服務(wù)的三個基本屬性:
·服務(wù)做些什么——服務(wù)所提供的操作(方法)
·如何訪問服務(wù)——和服務(wù)交互的數(shù)據(jù)格式以及必要協(xié)議
·服務(wù)位于何處——協(xié)議相關(guān)的地址,如
URL
WSDL
文檔以端口集合的形式來描述
Web
服務(wù),
WSDL
服務(wù)描述包含對一組操作和消息的一個抽象定義,綁定到這些操作和消息的一個具體協(xié)議,和這個綁定的一個網(wǎng)絡(luò)端點(diǎn)規(guī)范。
WSDL
在Web 服務(wù)概念性協(xié)議棧
中的位置:
6,
什么是WSDD?
WSDD
就是
WEB
服務(wù)分布描述(
Web Service Deployment Descriptor
)
,
它定義了
WEB
服務(wù)的接口,如服務(wù)名、提供的方法、方法的參數(shù)等信息。
7,
什么是UDDI?
UDDI
就是統(tǒng)一描述、發(fā)現(xiàn)和集成(
Universal Description, Discovery, and Integration
)。
UDDI
用于集中存放和查找
WSDL
描述文件,起著目錄服務(wù)器的作用。
Web
服務(wù)中的角色、操作和構(gòu)件
:
-
服務(wù)提供者。從企業(yè)的角度看,這是服務(wù)的所有者。從體系結(jié)構(gòu)的角度看,這是托管訪問服務(wù)的平臺。
-
服務(wù)請求者。從企業(yè)的角度看,這是要求滿足特定功能的企業(yè)。從體系結(jié)構(gòu)的角度看,這是尋找并調(diào)用服務(wù),或啟動與服務(wù)的交互的應(yīng)用程序。服務(wù)請求者角色可以由瀏覽器來擔(dān)當(dāng),由人或無用戶界面的程序(例如,另外一個 Web 服務(wù))來控制它。
-
服務(wù)注冊中心。這是可搜索的服務(wù)描述注冊中心,服務(wù)提供者在此發(fā)布他們的服務(wù)描述。在靜態(tài)綁定開發(fā)或動態(tài)綁定執(zhí)行期間,服務(wù)請求者查找服務(wù)并獲得服務(wù)的綁定信息(在服務(wù)描述中)。對于靜態(tài)綁定的服務(wù)請求者,服務(wù)注冊中心是體系結(jié)構(gòu)中的可選角色,因?yàn)榉?wù)提供者可以把描述直接發(fā)送給服務(wù)請求者。同樣,服務(wù)請求者可以從服務(wù)注冊中心以外的其它來源得到服務(wù)描述,例如本地文件、FTP 站點(diǎn)、Web 站點(diǎn)、廣告和服務(wù)發(fā)現(xiàn)(Advertisement and Discovery of Services,ADS)或發(fā)現(xiàn) Web 服務(wù)(Discovery of Web Services,DISCO)。
8,
AXIS
的幾種服務(wù)類型:
AXIS
有四種
service styles
,分別是:
RPC, Document, Wrapped,
和
Message
。最常用的就是
RPC
和
Message
。
RPC
:
在
AXIS
中是一個默認(rèn)選項(xiàng)。當(dāng)你部署的時候使用下列兩種方式:
或則
,它遵循
SOAP RPC
和編碼規(guī)則。每個
RPC
都包括一個表示名稱的外部接點(diǎn)和一些表示參數(shù)的內(nèi)部接點(diǎn)。
AXIS
會根據(jù)規(guī)則將一個
XML
(
WSDL
文件)文件轉(zhuǎn)化成一個
JAVA
對象,并對對想賦上在文件中描述的值。也可以根據(jù)規(guī)則將一個
JAVA
對象轉(zhuǎn)化成
XML
文件。
Document
適合于老的
XML schema
。
Wrapped
和
DOCUMENT
一樣,適合于老的
XML schema
。
在大多書情況下,你不許要擔(dān)心是
DOCUMENT
服務(wù)還是
WRAPPED
服務(wù)。
Message
以這種方式部署的話,會使
AXIS
失去意義,它使你的代碼真正的用
XML
形式,而不需要轉(zhuǎn)化成
JAVA
對象。以這種方式部署的有以下四種服務(wù)方法:
public Element [] method(Element [] bodies);
public SOAPBodyElement [] method (SOAPBodyElement [] bodies);
public Document method(Document body);
public void method(SOAPEnvelope req, SOAPEnvelope resp);
幾種服務(wù)類型的主要區(qū)別:
基于
RPC(
遠(yuǎn)程過程調(diào)用
)
方式,這也是
Web
服務(wù)最常用的方式。面向消息
/
文檔的的類型跟
RPC
不同的是它提供了一個更底層的抽象,要求更多的編程工作。客戶端可以傳入任何的
XML
文檔,得到的響應(yīng)不一定是
SOAPEnvelope
,可以返回任何它所需要的東西,甚至不返回。雖然這對開發(fā)者來說非常的靈活,但是這種通訊類型在實(shí)際的應(yīng)用中并不常見。面向消息
/
文檔的
Web
服務(wù)主要適合于下面幾種情況,比如批量處理,基于表單的數(shù)據(jù)導(dǎo)入,有需要返回非
XML
數(shù)據(jù)時,
Web
服務(wù)器實(shí)現(xiàn)中要求直接訪問傳輸層等等
二,
開發(fā),部署Web服務(wù):
首先下載并安裝
tomcat4.x.
及以上版本
然后到
Axis
主頁下載,現(xiàn)在最新版本是
1.3 final,
我們使用的是1.2.1 final版,將解壓的axis中的webapps目錄下的axis拷貝到tomcat安裝路徑下的webapp下,將解壓的axis下lib下的jar文件拷貝到tomcat安裝目錄下commonlib下,并把他們加入到你的系統(tǒng)路徑中。
然后啟動
tomcat
,
打開
IE
,輸入:
http://localhost:8080/axis
,如果出現(xiàn)
axis
主頁,說明安裝
axis
成功。
部署
web
服務(wù)
在
axis
下部署
web
服務(wù)有以下兩種方式:
1.
即時部署
(Instance Deployment)
利用
JWS
文件
只需要將
.java
文件拷貝到
axis
目錄下,并將文件后綴改為
.jws
即可。
訪問部署后的
wsdl
文件只需鍵入:
http://localhost:8080/axis/filename.jws?wsdl
以下是
WSDL
的一個例子:
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="http://service.kernel.gamebase.com" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://service.kernel.gamebase.com" xmlns:intf="http://service.kernel.gamebase.com" xmlns:tns1="http://vo.service.kernel.gamebase.com" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<wsdl:types> //
描述消息中復(fù)雜數(shù)據(jù)類型的使用
<schema targetNamespace="http://vo.service.kernel.gamebase.com" xmlns="http://www.w3.org/2001/XMLSchema">
<import namespace="http://service.kernel.gamebase.com"/>
<import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
<complexType name="UserGameGrade">//
定義復(fù)雜類型
<sequence>
<element name="MClassID" nillable="true" type="xsd:string"/>
<element name="gameID" nillable="true" type="xsd:string"/>
<element name="gradeType" type="xsd:int"/>
......
</sequence>
</complexType>
</schema>
......
</wsdl:types>
<wsdl:message name="getGameGradeRankResponse">//
定義操作的輸出參數(shù)
<wsdl:part name="getGameGradeRankReturn" type="tns1:GameGradeRank"/>
</wsdl:message>
<wsdl:message name="getGameGradeRankRequest">//
定義操作的輸入?yún)?shù)
<wsdl:part name="in0" type="xsd:string"/>
<wsdl:part name="in1" type="xsd:int"/>
<wsdl:part name="in2" type="xsd:int"/>
</wsdl:message>
......
<wsdl:portType name="GameGradeService"> //
WSDL: portType
元素中定義了
Web
服務(wù)的操作。
<wsdl:operation name="getGameGradeRank" parameterOrder="in0 in1 in2"> //
操作定義了輸入和輸出數(shù)據(jù)流中可以出現(xiàn)的
XML
消息
<wsdl:input message="impl:getGameGradeRankRequest" name="getGameGradeRankRequest"/>
<wsdl:output message="impl:getGameGradeRankResponse" name="getGameGradeRankResponse"/>
</wsdl:operation>
<wsdl:operation name="getUserGameGradeRank" parameterOrder="in0 in1 in2 in3 in4">
<wsdl:input message="impl:getUserGameGradeRankRequest" name="getUserGameGradeRankRequest"/>
<wsdl:output message="impl:getUserGameGradeRankResponse" name="getUserGameGradeRankResponse"/>
</wsdl:operation>
......
</wsdl:portType>
<wsdl:binding name="GameGradeServiceSoapBinding" type="impl:GameGradeService">//
描述特定服務(wù)接口(
WSDL: portType
)的協(xié)議、數(shù)據(jù)格式、安全性和其它屬性
<wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="getGameGradeRank">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="getGameGradeRankRequest">
<wsdlsoap:body namespace="http://service.kernel.gamebase.com" use="literal"/>
</wsdl:input>
<wsdl:output name="getGameGradeRankResponse">
<wsdlsoap:body namespace="http://service.kernel.gamebase.com" use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="GameGradeServiceService">//
定義服務(wù):名字,
訪問點(diǎn)
,位置
<wsdl:port binding="impl:GameGradeServiceSoapBinding" name="GameGradeService">
<wsdlsoap:address location="http://localhost:8080/gamebase/services/GameGradeService"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
2
.定制部署
(Custom Deployment)
利用部署描述符
wsdd
以下是部署描述符的一個例子:
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="GameGradeService" type="" provider="java:RPC"
style="rpc" use="encoded">
//
服務(wù)名字,服務(wù)類型及服務(wù)提供者
<parameter name="scope" value="Request"/>
<parameter name="className" value="/blog/com.gamebase.kernel.service.ServiceImpl"/>//
實(shí)現(xiàn)該服務(wù)的具體類
<parameter name="allowedMethods" value="*"/>
<namespace>http://service.kernel.gamebase.com</namespace>
<typeMapping xmlns:ns1="http://vo.service.kernel.gamebase.com" //
類型映射
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
qname="ns1:GameGradeRank"http://Qualified Name
(特定名字)
languageSpecificType="java:com.gamebase.kernel.service.vo.GameGradeRank"
serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"http://
指定序列化工廠
deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory" //
反序列化工廠
name="GameGradeRank"/>
………
</service>
</deployment>
訪問部署后的wsdl文件只需鍵入
http://localhost:8080/axis
/services/
GameGradeService
三,
在IDE下開發(fā)Web服務(wù):
1,
在Jubilder下開發(fā)WebService:
使用Jbuilder集成開發(fā)環(huán)境,能夠根據(jù)服務(wù)接口類生成web服務(wù)描述文件,web服務(wù)部署描述文件及客戶端代碼,這樣能夠節(jié)省我們大部分時間(開發(fā),配置),且減少出錯機(jī)率。
Jbuilder
在以前的版本,如jbuilder8(可能更低版本)就支持Axis,我用的是Jbuilder2006,不過大體步驟都是相同。
在開始前,我們有個服務(wù)接口GameGradeService類,服務(wù)接口實(shí)現(xiàn)類ServiceImpl類及相關(guān)附屬類。我們要實(shí)現(xiàn)該服務(wù)接口。
2.1
,打開Jbuilder,新建一個工程,如testWebService
2.2
,新建一個名為webService的WebService Server (file>new:WebServices:Axis WebServices Server Configuration)
2.3,
在出現(xiàn)的Web Services Designers可視化界面,點(diǎn)擊“create Service”,選擇“java Service”
2.4
,配置新創(chuàng)建的java Service,點(diǎn)擊JavaService1,配置Service Name為GameGradeService,服務(wù)接口為我們有的那個服務(wù)接口GameGradeService,實(shí)現(xiàn)類為我們實(shí)現(xiàn)改接口的類ServiceImpl。
2.5
,然后編譯該工程,能夠生成web服務(wù)部署文件,web服務(wù)描述文件,如果你選擇了生成客戶端代碼的話,它也能生成相應(yīng)的客戶端代碼。
2.6
,啟動該服務(wù),訪問
:http://localhost:8080/webService/services/GameGradeService?wsdl
,如果出現(xiàn)該服務(wù)的描述文檔,說明發(fā)布成功。
2.7
,執(zhí)行自動生成的客戶端代碼進(jìn)行測試,發(fā)現(xiàn)測試成功。
2.8
,你可以用webService的webServices Client來根據(jù)wsdl只生成客戶端代碼。
a,
新建一個名為webServiceClient的WebService Client(file>new:WebServices:Axis WebServices Client Configuration)
b,
在出現(xiàn)的Web Services Designers可視化界面,點(diǎn)擊“create Service”,選擇“import from url”
c,
配置新創(chuàng)建的java Service,點(diǎn)擊JavaService1,配置Service Name為GameGradeService,Input WSDL file 為給定的wsdl。
d,
然后編譯該工程
2,
在eclipse下開發(fā)WebService:
Eclipse3.1
及相關(guān)插件已經(jīng)能夠很好的支持webService開發(fā)。
右鍵點(diǎn)擊wsdl文件,選擇webServices,有以下功能:發(fā)布wsdl文件,生成客戶端代碼等。
右鍵
點(diǎn)擊服務(wù)接口文件,選擇webServices,有以下功能:生成web Service等。
同時eclipse提供了友好的界面操作,如測試的時候,提供界面讓你輸入?yún)?shù),而不必該改程序。
四,
開發(fā)過程中的問題:
在使用
AXIS
開發(fā)WEB服務(wù)的時候,會遇到很多問題。比如:XML解析器出現(xiàn)的異常、客戶端程序找不到可用的Web服務(wù)、序列化/反序列化等。
XML
解析器出現(xiàn)的異常主要是由于類型映射的問題導(dǎo)致的,用到那個Bean就把那個bean映射進(jìn)去就可以避免該問題。
客戶端程序找不到可用的Web服務(wù)主要是由于客戶端對服務(wù)提供者的url及服務(wù)名字輸入有錯,這一般是由于手寫客戶端代碼造成的。
序列化/反序列化問題,沒有對傳輸中的某個Bean類型映射相應(yīng)的序列化/反序列化工廠,或者是復(fù)雜類型中,沒有實(shí)現(xiàn)自定義的序列化/反序列化工廠。
以上是開發(fā)過程中主要遇到的幾類問題,在以后的開發(fā)過程中,一定還會需要遇到更多的問題。
五,
其他相關(guān)知識:
1
,java類與wsdl相互生成工具:
Axis
提供了”WSDL2Java”工具,可以利用wsdl描述來產(chǎn)生服務(wù)的Java代理和框架(proxy and skeletons)。
Axis
提供了”Java2WSDL”工具,可以由java類生成wsdl文件。
2,
序列化與反序列化:
序列化/反序列化器在英文中的對應(yīng)翻譯是Serializer/Deserializer,一個序列化器的功能是遵循一定的映射規(guī)則和編碼風(fēng)格,將一種類型的JAVA對象通過某種特定的機(jī)制,轉(zhuǎn)換成為XML描述的形式;反序列化器的功能是序列化器所做工作的逆操作,兩者相輔相成,成對出現(xiàn)。Axis中的序列化/反序列化器采用設(shè)計(jì)范式中的工廠模式,每一個Serializer唯一對應(yīng)一個SerializerFactory;每一個Deserializer唯一對應(yīng)一個DeserializerFactory。
Axis
已經(jīng)為開發(fā)者提供了豐富的序列化/反序列化器,對于java的基本數(shù)據(jù)類型,絕大部分常用的容器類(比如數(shù)組類型,Vector類型等)都提供了實(shí)現(xiàn),特別是提供了對W3C的DOM對象(比如Document, Element等)和符合Bean規(guī)范的JAVA對象提供了功能完善的序列化/反序列化器,但對于一些特殊類型的對象,需要通過Web服務(wù)進(jìn)行傳遞,我們不得不開發(fā)自己的序列化/反序列化器。
3
,Axis與Spring的結(jié)合:
Axis
與spring結(jié)合,需要提供一些額外工作,即將實(shí)現(xiàn)web服務(wù)接口的Bean與web服務(wù)部署中服務(wù)類如何關(guān)聯(lián)。
如下:
<service name="GameService" type="" provider="Handler" style="rpc">
<parameter name="handlerClass" value="/blog/com.workingmouse.webservice.axis.SpringBeanRPCProvider"/>
<parameter name="springBean" value="gameInfoService"/>
<parameter name="springBeanClass" value="/blog/com.gamebase.kernel.service.GameService"/>
<parameter name="scope" value="Request"/>
<parameter name="allowedMethods" value="*"/>
.......
</service>
參數(shù)handlerClass的值是處理Bean與wsdd文件中服務(wù)類的關(guān)聯(lián)。
參數(shù)springBean的值表示實(shí)現(xiàn)接口GameService注冊的Bean的名字。
參數(shù)springBeanClass的值表示接口GameService的類。
posted on 2006-08-04 20:04
SIMONE 閱讀(2597)
評論(0) 編輯 收藏 所屬分類:
AXIS