posts - 495,comments - 227,trackbacks - 0
          <2006年8月>
          303112345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          常用鏈接

          留言簿(46)

          隨筆分類(476)

          隨筆檔案(495)

          最新隨筆

          搜索

          •  

          積分與排名

          • 積分 - 1395881
          • 排名 - 16

          最新評論

          閱讀排行榜

          評論排行榜

          基本概念:

          1,什么是 Web 服務?

          Web 是使應用程序可以以與平臺和編程語言無關的方式進行相互通信的一項技術。Web 服務是一個軟件接口,它描述了一組可以在網絡上通過標準化的 XML 消息傳遞訪問的操作。它使用基于 XML 語言的協議來描述要執行的操作或者要與另一個 Web 服務交換的數據。一組以這種方式交互的 Web 服務在面向服務的體系結構(Service-Oriented ArchitectureSOA)中定義了特殊的 Web 服務應用程序。

          2, 什么是SOAP

          SOAP Simple Object Access Protocol )簡單對象訪問協議是在分散或分布式的環境中交換信息并執行遠程過程調用的輕量級協議,是一個基于XML的協議。使用SOAP,不用考慮任何特定的傳輸協議(最常用的還是HTTP協議),可以允許任何類型的對象或代碼,在任何平臺上,以任何一種語言相互通信。

          SOAP 包括四個部分: SOAP 封裝 (envelop) ,封裝定義了一個描述消息中的內容是什么,是誰發送的,誰應當接受并處理它以及如何處理它們的框架; SOAP 編碼規則( encoding rules ),用于表示應用程序需要使用的數據類型的實例; SOAP RPC 表示 (RPC representation) ,表示遠程過程調用和應答的協定; SOAP 綁定( binding ),使用底層協議交換信息。

          應用中比較關注的是 envelop ,由一個或多個 Header 和一個 Body 組成。

          SOAP 在可互操作的基礎 Web 服務協議棧 中的位置

          3, 什么是Axis?

          Axis 本質上就是一個SOAP引擎 Apache Axis is an implementation of the SOAP ), 提供創建服務器端、客戶端和網關SOAP操作的基本框架。但Axis并不完全是一個SOAP引擎,它還包括:

          是一個獨立的SOAP服務器。

          是一個嵌入Servlet引擎(例如Tomcat)的服務器。

          支持WSDL

          提供轉化WSDLJava類的工具。

          提供例子程序。

          提供TCP/IP數據包監視工具。

          4, Axis 相比Soap v2的優點:

          Axis 是第三代Apache SOAP的實現,從2000年起,SOAP v2開發小組開始討論如何讓Axis更加靈活、可配置,以及能夠處理SOAP和來自W3C的各種XML標準。通過不斷地討論和代碼編寫,Axis目前相比SOAP V2取得了如下成果:

          速度提高。 Axis通過基于事件的SAXXML文檔進行處理,從而在速度和效率上比Apache SOAP有所提高。

          靈活性提高。

          穩定性提高。

          提供面向組件的部署。

          提供一個簡潔的傳輸抽象框架。其核心引擎完全于傳輸方式獨立。從而使基于何種協議傳輸的選擇更加靈活。

          支持WSDL。包括WSDL和客戶端代碼生成等。

          5, 什么是WSDL

          WSDL Web Service Description Language Web 服務器描述語言是用 XML 文檔來描述 Web 服務的標準,是 Web 服務的接口定義語言,由 Ariba Intel IBM MS 等共同提出,通過 WSDL ,可描述 Web 服務的三個基本屬性:

          ·服務做些什么——服務所提供的操作(方法)

          ·如何訪問服務——和服務交互的數據格式以及必要協議

          ·服務位于何處——協議相關的地址,如 URL

          WSDL 文檔以端口集合的形式來描述 Web 服務, WSDL 服務描述包含對一組操作和消息的一個抽象定義,綁定到這些操作和消息的一個具體協議,和這個綁定的一個網絡端點規范。

          WSDL Web 服務概念性協議棧 中的位置:

          6, 什么是WSDD

          WSDD 就是 WEB 服務分布描述( Web Service Deployment Descriptor , 它定義了 WEB 服務的接口,如服務名、提供的方法、方法的參數等信息。

          7, 什么是UDDI

          UDDI 就是統一描述、發現和集成( Universal Description, Discovery, and Integration )。 UDDI 用于集中存放和查找 WSDL 描述文件,起著目錄服務器的作用。

          Web 服務中的角色、操作和構件

          • 服務提供者。從企業的角度看,這是服務的所有者。從體系結構的角度看,這是托管訪問服務的平臺。
          • 服務請求者。從企業的角度看,這是要求滿足特定功能的企業。從體系結構的角度看,這是尋找并調用服務,或啟動與服務的交互的應用程序。服務請求者角色可以由瀏覽器來擔當,由人或無用戶界面的程序(例如,另外一個 Web 服務)來控制它。
          • 服務注冊中心。這是可搜索的服務描述注冊中心,服務提供者在此發布他們的服務描述。在靜態綁定開發或動態綁定執行期間,服務請求者查找服務并獲得服務的綁定信息(在服務描述中)。對于靜態綁定的服務請求者,服務注冊中心是體系結構中的可選角色,因為服務提供者可以把描述直接發送給服務請求者。同樣,服務請求者可以從服務注冊中心以外的其它來源得到服務描述,例如本地文件、FTP 站點、Web 站點、廣告和服務發現(Advertisement and Discovery of ServicesADS)或發現 Web 服務(Discovery of Web ServicesDISCO)。

          8, AXIS 的幾種服務類型:

          AXIS 有四種 service styles ,分別是: RPC, Document, Wrapped, Message 。最常用的就是 RPC Message

          RPC AXIS 中是一個默認選項。當你部署的時候使用下列兩種方式: 或則 ,它遵循 SOAP RPC 和編碼規則。每個 RPC 都包括一個表示名稱的外部接點和一些表示參數的內部接點。 AXIS 會根據規則將一個 XML WSDL 文件)文件轉化成一個 JAVA 對象,并對對想賦上在文件中描述的值。也可以根據規則將一個 JAVA 對象轉化成 XML 文件。

          Document

          適合于老的 XML schema

          Wrapped

          DOCUMENT 一樣,適合于老的 XML schema

          在大多書情況下,你不許要擔心是 DOCUMENT 服務還是 WRAPPED 服務。

          Message

          以這種方式部署的話,會使 AXIS 失去意義,它使你的代碼真正的用 XML 形式,而不需要轉化成 JAVA 對象。以這種方式部署的有以下四種服務方法:

          public Element [] method(Element [] bodies);

          public SOAPBodyElement [] method (SOAPBodyElement [] bodies);

          public Document method(Document body);

          public void method(SOAPEnvelope req, SOAPEnvelope resp);

          幾種服務類型的主要區別:

          基于 RPC( 遠程過程調用 ) 方式,這也是 Web 服務最常用的方式。面向消息 / 文檔的的類型跟 RPC 不同的是它提供了一個更底層的抽象,要求更多的編程工作。客戶端可以傳入任何的 XML 文檔,得到的響應不一定是 SOAPEnvelope ,可以返回任何它所需要的東西,甚至不返回。雖然這對開發者來說非常的靈活,但是這種通訊類型在實際的應用中并不常見。面向消息 / 文檔的 Web 服務主要適合于下面幾種情況,比如批量處理,基于表單的數據導入,有需要返回非 XML 數據時, Web 服務器實現中要求直接訪問傳輸層等等

          二, 開發,部署Web服務:

          首先下載并安裝 tomcat4.x. 及以上版本

          然后到 Axis 主頁下載,現在最新版本是 1.3 final, 我們使用的是1.2.1 final,將解壓的axis中的webapps目錄下的axis拷貝到tomcat安裝路徑下的webapp下,將解壓的axislib下的jar文件拷貝到tomcat安裝目錄下commonlib下,并把他們加入到你的系統路徑中。

          然后啟動 tomcat

          打開 IE ,輸入: http://localhost:8080/axis ,如果出現 axis 主頁,說明安裝 axis 成功。

          部署 web 服務 axis 下部署 web 服務有以下兩種方式:

          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> // 描述消息中復雜數據類型的使用

          <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">// 定義復雜類型

          <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">// 定義操作的輸出參數

          <wsdl:part name="getGameGradeRankReturn" type="tns1:GameGradeRank"/>

          </wsdl:message>

          <wsdl:message name="getGameGradeRankRequest">// 定義操作的輸入參數

          <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 服務的操作。

          <wsdl:operation name="getGameGradeRank" parameterOrder="in0 in1 in2"> // 操作定義了輸入和輸出數據流中可以出現的 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">// 描述特定服務接口( WSDL: portType )的協議、數據格式、安全性和其它屬性

          <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">// 定義服務:名字, 訪問點 ,位置

          <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"> // 服務名字,服務類型及服務提供者

          <parameter name="scope" value="Request"/>

          <parameter name="className" value="/blog/com.gamebase.kernel.service.ServiceImpl"/>// 實現該服務的具體類

          <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下開發Web服務:

          1, Jubilder下開發WebService

          使用Jbuilder集成開發環境,能夠根據服務接口類生成web服務描述文件,web服務部署描述文件及客戶端代碼,這樣能夠節省我們大部分時間(開發,配置),且減少出錯機率。

          Jbuilder 在以前的版本,如jbuilder8(可能更低版本)就支持Axis,我用的是Jbuilder2006,不過大體步驟都是相同。

          在開始前,我們有個服務接口GameGradeService類,服務接口實現類ServiceImpl類及相關附屬類。我們要實現該服務接口。

          2.1 ,打開Jbuilder,新建一個工程,如testWebService

          2.2 ,新建一個名為webServiceWebService Server file>new:WebServices:Axis WebServices Server Configuration

          2.3, 在出現的Web Services Designers可視化界面,點擊“create Service”,選擇“java Service

          2.4 ,配置新創建的java Service,點擊JavaService1,配置Service NameGameGradeService,服務接口為我們有的那個服務接口GameGradeService,實現類為我們實現改接口的類ServiceImpl

          2.5 ,然后編譯該工程,能夠生成web服務部署文件,web服務描述文件,如果你選擇了生成客戶端代碼的話,它也能生成相應的客戶端代碼。

          2.6 ,啟動該服務,訪問 http://localhost:8080/webService/services/GameGradeService?wsdl ,如果出現該服務的描述文檔,說明發布成功。

          2.7 ,執行自動生成的客戶端代碼進行測試,發現測試成功。

          2.8 ,你可以用webServicewebServices Client來根據wsdl只生成客戶端代碼。

          a, 新建一個名為webServiceClientWebService Clientfile>new:WebServices:Axis WebServices Client Configuration

          b, 在出現的Web Services Designers可視化界面,點擊“create Service”,選擇“import from url

          c, 配置新創建的java Service,點擊JavaService1,配置Service NameGameGradeServiceInput WSDL file 為給定的wsdl

          d, 然后編譯該工程

          2, eclipse下開發WebService

          Eclipse3.1 及相關插件已經能夠很好的支持webService開發。

          右鍵點擊wsdl文件,選擇webServices,有以下功能:發布wsdl文件,生成客戶端代碼等。

          右鍵 點擊服務接口文件,選擇webServices,有以下功能:生成web Service等。

          同時eclipse提供了友好的界面操作,如測試的時候,提供界面讓你輸入參數,而不必該改程序。

          四, 開發過程中的問題:

          在使用 AXIS 開發WEB服務的時候,會遇到很多問題。比如:XML解析器出現的異常、客戶端程序找不到可用的Web服務、序列化/反序列化等。

          XML 解析器出現的異常主要是由于類型映射的問題導致的,用到那個Bean就把那個bean映射進去就可以避免該問題。

          客戶端程序找不到可用的Web服務主要是由于客戶端對服務提供者的url及服務名字輸入有錯,這一般是由于手寫客戶端代碼造成的。

          序列化/反序列化問題,沒有對傳輸中的某個Bean類型映射相應的序列化/反序列化工廠,或者是復雜類型中,沒有實現自定義的序列化/反序列化工廠。

          以上是開發過程中主要遇到的幾類問題,在以后的開發過程中,一定還會需要遇到更多的問題。

          五, 其他相關知識:

          1 java類與wsdl相互生成工具:

          Axis 提供了”WSDL2Java”工具,可以利用wsdl描述來產生服務的Java代理和框架(proxy and skeletons)

          Axis 提供了”Java2WSDL”工具,可以由java類生成wsdl文件。

          2, 序列化與反序列化:

          序列化/反序列化器在英文中的對應翻譯是Serializer/Deserializer,一個序列化器的功能是遵循一定的映射規則和編碼風格,將一種類型的JAVA對象通過某種特定的機制,轉換成為XML描述的形式;反序列化器的功能是序列化器所做工作的逆操作,兩者相輔相成,成對出現。Axis中的序列化/反序列化器采用設計范式中的工廠模式,每一個Serializer唯一對應一個SerializerFactory;每一個Deserializer唯一對應一個DeserializerFactory

          Axis 已經為開發者提供了豐富的序列化/反序列化器,對于java的基本數據類型,絕大部分常用的容器類(比如數組類型,Vector類型等)都提供了實現,特別是提供了對W3CDOM對象(比如Document, Element)和符合Bean規范的JAVA對象提供了功能完善的序列化/反序列化器,但對于一些特殊類型的對象,需要通過Web服務進行傳遞,我們不得不開發自己的序列化/反序列化器。

          3 AxisSpring的結合:

          Axis spring結合,需要提供一些額外工作,即將實現web服務接口的Beanweb服務部署中服務類如何關聯。 如下:

          <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>

          參數handlerClass的值是處理Beanwsdd文件中服務類的關聯。

          參數springBean的值表示實現接口GameService注冊的Bean的名字。

          參數springBeanClass的值表示接口GameService的類。

          posted on 2006-08-04 20:04 SIMONE 閱讀(2602) 評論(0)  編輯  收藏 所屬分類: AXIS
          主站蜘蛛池模板: 翁牛特旗| 平乐县| 邓州市| 郧西县| 云浮市| 辽源市| 开鲁县| 大英县| 耿马| 元江| 孟连| 拜泉县| 信宜市| 顺义区| 义乌市| 凯里市| 昂仁县| 平谷区| 宝坻区| 塔城市| 安泽县| 桂林市| 姜堰市| 厦门市| 新闻| 万盛区| 通河县| 东丽区| 鹰潭市| 鄂托克前旗| 资兴市| 张家口市| 麻阳| 乌海市| 乐陵市| 潼关县| 裕民县| 鄂尔多斯市| 德清县| 洪江市| 渝中区|