Web service—不是框架,更不是一種技術,二是一種跨平臺、跨語言的規範
爲了解決這樣的需求場景:
不用平臺、不同語言所編寫的應用之間如何相互調用?
web service實際中的用途:
1、 同一公司的新、舊系統的整合
Linux上java應用去調用windows平臺的delphi應用
2、 不同公司的業務整合
業務的整合就要帶來。不同公司的系統整合
不同公司的系統可能存在平臺不同、語言不同的問題
3、 內容聚合
一個應用,比如需要提供天氣預報、股票行情、黃金行情、編程語言排行
這個內容聚合的應用,需要調用大量不同平臺、不用語言編寫的應用的方法
CFX
Axis(Apache)---Axis2(Apache)
XFire---CFX(XFire+Celtrix)
XFire(Web Service框架)
Celtrix(ESB框架)
SOA(面向服務的架構)
Sercice1,Sercice2,Sercice3—所有組件都是“即插即用”的
IBM提倡的SOA架構,希望以“組裝電腦”的方式來開發軟件
1. 各種提供服務的組件(Web Service)
2. 企業服務總線(Enterprise Service Bus,ESB)
CFX號稱是SOA框架
CFX(Apache)
CFX內置了一個JettyWeb服務器
/********************************
每個web service需要兩個部分:接口是實現類
**********************************/
使用CFX開發web service開發服務器端:
(1) 開發一個web service業務接口
該接口要用@webservice修飾
(2) 開發一個web service實現類
實現累也需要用@webservice修飾
(3) 發佈webservice
使用CFX開發web service開發客戶端:
(1) 調用CFX提供的wsdl2java工具,根據wsdl文檔生成相應的java代碼
Wsdl-web service definition language
任何語言實現了web service,都需要提供、並暴露wsdl文檔
(2) 找到wsdl2java所生成類中,一個繼承了service的類
該類的實例可當成工廠來使用
(3) 調用service子類的實力的getXxxPort()方法,返回遠程web service的代理
形參、返回值
1、 當形參、返回值的類型是String、基本數據類型時,CFX肯定可以輕鬆的處理
2、 當形參、返回值類型是JavaBean形式的複合類、List集合、數組時
CFX也可以很好的處理
3、 還有一些像Map、非JavaBean式的複合類,CFX是不可以處理的
/**************************
XML裏的兩個屬性:
targetNamespace - 相當於Java語言裏的package
Xmlns: - 相當於Java語言裏的impor
*************************/
Web Service的三個技術基礎:
1、WSDL Web ServiceDefinition Language Web服務定義語言
2、SOAP SimpleObject Access Protocol 簡單對象訪問協議
3、UDDI
一次web Service的調用----其實不是方法調用,而是發送SOAP消息(即XML文檔片段)
對於sayHi操作來說
傳入消息是:
<sayHi>
<argo>字符串</arg0>
</sayHi>
傳出消息是:
<sayHiResponse>
<return>字符串</return>
對於getCatsByUser操作來說
傳入消息是:
<getCatsByUser>
<arg0>
<address>字符串</address>
<id>整數值</id>
<pass>字符串</pass>
</arg0>
</getCatsByUser>
傳出消息是:
<getCatsByUserResponse>
<return> ----可出現0~N次(模擬了List對象)
<color>字符串</color>
<id>整數型</id>
<name>字符串</name>
</return>
</getCatsByUserResponse>
通俗的說,WSDL文檔描述了web Service如下2個方面:
What:該web Service包含了幾個
How:該web Service的操作應該怎樣調用
Where:該web Service的服務地址。
/*******************************
只要得到web Service的WSDL文檔,接下來程序就可以調用web Service
*******************************/
調用一次web service的本質:
1、 客戶端把調用方法參數,轉換成XML文檔片段(SOAP消息)
----給文檔片段必須複合WSDL定義的格式。
2、 通過網絡,把XML文檔片段發送給服務區
3、 服務器接收到XML文檔片段
4、 服務器解析XML文檔片段,提取其中的數據,並把數據轉換調用web Service所需的參數值
5、 服務器執行方法
6、 把執行方法得到的返回值再次轉換成爲XML文檔片段(SOAP消息)
---該文檔片段必須符合WSDl定義的格式
7、 通過網絡把XMl文檔片段傳給客戶端
8、 客戶端接收到XML文檔片段
9、 客戶端解析XML文檔片段,提取其中的數據,並把數據轉換調用web Service的返回值
從上面調用本質來看,要一個語言支持web Service,唯一的要求是:該語言支持XML文檔的解析、生成、支持網絡傳輸
在CFX開發中,如果遇到CFX無法處理的類型,就需要程序員自行處理
處理思路是:提供一個轉換器,該轉換器負責把CFX搞不定的類型,轉換成CFX搞得定的類型
(1) 使用@xmlJavaTypeAdapter修飾CFX無法處理的類型。
使用該Annotation時,通過value屬性指定一個轉換器
(2) 實現自己的轉換器,實現轉換器時,需要開發一個CFX搞得定的類型
對於getAllCats操作來說。
傳入消息是:
<getAllCats>
</getAllCats>
傳出消息是:
<getAllCatsResponse>
<return>
<entries> ------可出現0~N次
<key>字符串</key>
<value>
<color>字符串</color>
<id>整數值</id>
<name>字符串</name>
</vlaue>
</entries>
</return>
</getAllCatsResponse>