<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 495,comments - 227,trackbacks - 0
    基本概念:

    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 ArchitectureSOA)中定義了特殊的 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)化WSDLJava類的工具。

    提供例子程序。

    提供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通過基于事件的SAXXML文檔進(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 ServicesADS)或發(fā)現(xiàn) Web 服務(wù)(Discovery of Web ServicesDISCO)。

    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下,將解壓的axislib下的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 ,新建一個名為webServiceWebService 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 NameGameGradeService,服務(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 ,你可以用webServicewebServices Client來根據(jù)wsdl只生成客戶端代碼。

    a, 新建一個名為webServiceClientWebService Clientfile>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 NameGameGradeServiceInput 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),特別是提供了對W3CDOM對象(比如Document, Element)和符合Bean規(guī)范的JAVA對象提供了功能完善的序列化/反序列化器,但對于一些特殊類型的對象,需要通過Web服務(wù)進(jìn)行傳遞,我們不得不開發(fā)自己的序列化/反序列化器。

    3 AxisSpring的結(jié)合:

    Axis spring結(jié)合,需要提供一些額外工作,即將實(shí)現(xiàn)web服務(wù)接口的Beanweb服務(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的值是處理Beanwsdd文件中服務(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
    主站蜘蛛池模板: 亚洲成av人在片观看| 亚洲熟妇少妇任你躁在线观看无码| 免费精品一区二区三区第35| 国产偷国产偷亚洲清高APP| 亚洲国色天香视频| 国产av无码专区亚洲av果冻传媒| 国产精品99久久免费| 最近免费中文字幕大全视频 | 亚洲电影日韩精品| 免费永久国产在线视频| 国产jizzjizz免费看jizz| 国产精品色午夜免费视频 | 久久精品国产大片免费观看| 久久免费国产精品一区二区| 久久精品中文字幕免费| 日本免费在线中文字幕| 99re免费99re在线视频手机版| 久久久久av无码免费网| 无人影院手机版在线观看免费| 午夜毛片不卡免费观看视频| 国产成人精品高清免费| 亚洲精品无码99在线观看| 亚洲色自偷自拍另类小说| 亚洲国产综合91精品麻豆| 亚洲精品中文字幕无乱码麻豆| 亚洲kkk4444在线观看| 精品成人一区二区三区免费视频| eeuss免费天堂影院| 日本免费大黄在线观看| 永久免费毛片在线播放| 韩国欧洲一级毛片免费| 亚洲男人的天堂一区二区| 亚洲不卡中文字幕无码| 亚洲国产精品乱码在线观看97 | 亚洲精品无码成人AAA片| 亚洲第一区香蕉_国产a| 亚洲天堂免费在线| 日亚毛片免费乱码不卡一区| 久久精品视频免费| 91精品国产免费久久久久久青草| 免费欧洲美女牲交视频|