監(jiān)理公司管理系統(tǒng) | 工程企業(yè)管理系統(tǒng) | OA系統(tǒng) | ERP系統(tǒng) | 造價(jià)咨詢管理系統(tǒng) | 工程設(shè)計(jì)管理系統(tǒng) | 甲方項(xiàng)目管理系統(tǒng) | 簽約案例 | 客戶案例 | 在線試用
X 關(guān)閉

將應(yīng)用程序的功能封裝成為Web Services

申請(qǐng)免費(fèi)試用、咨詢電話:400-8352-114

AMTeam.org

將應(yīng)用程序的功能封裝成為Web Services 


 
 黎獻(xiàn)勇 李勁

2002 年 5 月

介紹

目前,很多電子商務(wù)中的Web應(yīng)用程序都有與它們的客戶端進(jìn)行交換和事務(wù)處理的功能。這些應(yīng)用程序通常被稱之為B2C應(yīng)用,它們通常使用像Java servlet, JavaServer Page這些服務(wù)器端的編程技術(shù)來動(dòng)態(tài)生成HTML返回給客戶端?,F(xiàn)在,電子商務(wù)應(yīng)用趨向于將它們的處理流程同其他的電子商務(wù)應(yīng)用的處理流程自動(dòng)地整合起來。在這種情形下,電子商務(wù)要求B2B形式的應(yīng)用,從而使應(yīng)用之間達(dá)到公開的,簡(jiǎn)單的,統(tǒng)一的連接和交換。B2B應(yīng)用更專注于應(yīng)用之間的信息交換,而不是信息的表示。 Web服務(wù),通過定義一組可以通過互聯(lián)網(wǎng)調(diào)用的相關(guān)的商業(yè)邏輯,從而可以使電子商務(wù)將其應(yīng)用程序的功能以公開的,統(tǒng)一的方式提供給對(duì)方。Web服務(wù)通過WSDL來描述,通過SOAP作訪問,在商業(yè)注冊(cè)中心(UDDI)發(fā)布,從而使開發(fā)者和電子商務(wù)應(yīng)用程序可以搜索并定位到該服務(wù)。在Web服務(wù)開發(fā)的過程中有三個(gè)清晰的角色定義,它們是服務(wù)的提供者(Service provider),服務(wù)的請(qǐng)求者(Service request)和服務(wù)的代理(Service broker),圖一顯示了它們之間的關(guān)系。

圖一:Web服務(wù)

Web服務(wù)的提供者使用WSDL來描述和定義那些可以通過編程來訪問的應(yīng)用程序的功能。同時(shí),服務(wù)提供者將在UDDI商業(yè)注冊(cè)中心(即服務(wù)代理)中發(fā)布這些服務(wù)的信息使其可以被其他應(yīng)用訪問到。Web服務(wù)的請(qǐng)求者通過服務(wù)代理找到他們所需的服務(wù)后,下載定義服務(wù)的文件(WSDL),接下來就可以通過SOAP來訪問這些服務(wù)了。

在本文中,我們將介紹如何用IBM的開發(fā)工具WebSphere Studio Application Developer(WSAD)來定義、發(fā)布、定位和調(diào)用Web服務(wù)。

應(yīng)用場(chǎng)景

我們的例子描述的是如何將一個(gè)已有的基于Web的公司員工電話號(hào)碼簿的應(yīng)用程序的部分功能封裝成Web服務(wù),這個(gè)應(yīng)用來自于一個(gè)我們假想的名為Acme的公司。通過這個(gè)已有的Web應(yīng)用,公司的員工可以通過員工號(hào),名字等等查詢到其他員工的信息。只要按照標(biāo)準(zhǔn)輸入查詢信息,應(yīng)用程序執(zhí)行查詢后,會(huì)將查詢結(jié)果以Web頁面的形式顯示出來。很多時(shí)候,會(huì)有其它的應(yīng)用程序也需要員工的信息,通常情況下,這些應(yīng)用的用戶通過電話號(hào)碼簿這個(gè)應(yīng)用來查詢到他們所需的員工信息,然后手工的將這些信息復(fù)制,粘貼到他們的應(yīng)用中。假如我們將電話號(hào)碼簿應(yīng)用中的員工查詢功能封裝為Web服務(wù),那么其他的應(yīng)用就可以通過編程的方式來調(diào)用這個(gè)服務(wù)獲取所需的員工信息。這樣一來,用戶將不需要手工的從各個(gè)應(yīng)用之間來獲取和整合信息,從而在整個(gè)應(yīng)用流程中的操作效率也就大大提高了。圖2描述了最初的應(yīng)用流程和使用Web服務(wù)整合后的應(yīng)用流程。

圖二: 最初的應(yīng)用流程和使用Web服務(wù)整合后的應(yīng)用流程。

提供員工信息查詢功能的Web服務(wù)

在這一部分,我們將描述怎樣將已有的基于Web的電話號(hào)碼簿應(yīng)用中的員工信息查詢功能定義成Web服務(wù)并發(fā)布它。在這個(gè)應(yīng)用中,我們有一個(gè)名為TelephoneDirectory 的Java Bean,它有一個(gè)名為findEmployeeByID的方法,這個(gè)方法可以通過給予一個(gè)唯一的員工序列號(hào)來檢索員工的信息。下面的代碼片斷顯示了TelephoneDirectory Bean的綱要結(jié)構(gòu)。

public class TelephoneDirectory
 implements java.io.Serializable
{
public Employee findEmployeeByID(int id)
{
}
}

用WSDL定義Web服務(wù)

在創(chuàng)建了Web項(xiàng)目,并將TelephoneDirectory Bean導(dǎo)入后,我們可以通過菜單項(xiàng)中的"文件->新建->Web服務(wù)"來啟動(dòng)WSAD的Web服務(wù)生成向?qū)?,它將?nèi)省Directory Bean并顯示其所有可得的公共的方法。我們選擇將findEmployeeByID這個(gè)方法發(fā)布為Web服務(wù),并可通過
http://tempuri.org/com.acme.TelephoneDirectory來訪問。在缺省狀態(tài)下,向?qū)?huì)自動(dòng)在Java類型和返回的XML類型之間選擇最佳的的映射,同時(shí)用戶也可以自己定制Java-to-XML的映射。向?qū)⑸上鄳?yīng)的用來定義Web服務(wù)的名為Directory-service.wsdl 和Directory-binding.wsdl 的WSDL文件和一個(gè)相關(guān)的用來規(guī)范WSDL的名為TelephoneDirectory-schema.xsd的模式文件。同時(shí),向?qū)н€會(huì)生成一個(gè)名為Directory.isd的部署描述文件,它將在Web服務(wù)運(yùn)行時(shí)被使用。圖3 顯示的是用Web服務(wù)生成向?qū)?chuàng)建Web服務(wù)的主要步驟(包括服務(wù)的定義,Java Bean方法的選擇和Java-to-XML的映射)。

圖3: WSAD中的Web服務(wù)生成向?qū)?/FONT>

 


 

下面的代碼段說明了如何在WSDL中定義我們的Web服務(wù)。

TelephoneDirectory-service.wsdl
<?xml version="1.0" encoding="UTF-8"?>
<definitions name="TelephoneDirectoryService"
    targetNamespace="
http://localhost:8080/TelephoneDirectoryWeb/wsdl/TelephoneDirectory-service.wsdl"
    xmlns="
http://schemas.xmlsoap.org/wsdl/"
    xmlns:binding="
http://www.telephonedirectory.com/definitions/TelephoneDirectoryRemoteInterface"
    xmlns:soap="
http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:tns="
http://localhost:8080/TelephoneDirectoryWeb/wsdl/TelephoneDirectory-service.wsdl">

    <import
        location="
http://localhost:8080/TelephoneDirectoryWeb/wsdl/TelephoneDirectory-binding.wsdl"
        namespace="
http://www.telephonedirectory.com/definitions/TelephoneDirectoryRemoteInterface"/>

    <service name="TelephoneDirectoryService">
        <port binding="binding:TelephoneDirectoryBinding" name="TelephoneDirectoryPort">
            <soap:address location="
http://localhost:8080/TelephoneDirectoryWeb/servlet/rpcrouter"/>
        </port>
    </service>

</definitions>

 TelephoneDirectory-service.wsdl文件包括了一些定義Web服務(wù)的信息,比如說Web服務(wù)的名字,Web服務(wù)的端口綁定等等。從例子中可以看出,我們將通過SOAP rpcrouter 這個(gè) servlet來訪問Web服務(wù),而 port binding則描述了在哪可以找到如何訪問服務(wù)的詳細(xì)信息。

TelephoneDirectory-binding.wsdl
<?xml version="1.0" encoding="UTF-8"?>
<definitions name="TelephoneDirectoryRemoteInterface"
    targetNamespace="
http://www.telephonedirectory.com/definitions/TelephoneDirectoryRemoteInterface"
    xmlns="
http://schemas.xmlsoap.org/wsdl/"
    xmlns:soap="
http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:tns="
http://www.telephonedirectory.com/definitions/TelephoneDirectoryRemoteInterface"
    xmlns:xsd="
http://www.w3.org/2001/XMLSchema"
    xmlns:xsd1="
http://www.telephonedirectory.com/schemas/TelephoneDirectoryRemoteInterface">

    <import
        location="
http://localhost:8080/TelephoneDirectoryWeb/wsdl/TelephoneDirectory-schema.xsd"
        namespace="
http://www.telephonedirectory.com/schemas/TelephoneDirectoryRemoteInterface"/>

    <message name="findEmployeeByIDRequest">
        <part name="id" type="xsd:int"/>
    </message>

    <message name="findEmployeeByIDResponse">
        <part name="result" type="xsd1:com.acme.Employee"/>
    </message>

    <portType name="TelephoneDirectory">
        <operation name="findEmployeeByID" parameterOrder="id">
            <input message="tns:findEmployeeByIDRequest" name="findEmployeeByIDRequest"/>
            <output message="tns:findEmployeeByIDResponse" name="findEmployeeByIDResponse"/>
        </operation>
    </portType>

    <binding name="TelephoneDirectoryBinding" type="tns:TelephoneDirectory">
        <soap:binding style="rpc" transport="
http://schemas.xmlsoap.org/soap/http"/>

        <operation name="findEmployeeByID">
            <soap:operation soapAction="" style="rpc"/>

            <input name="findEmployeeByIDRequest">
                <soap:body
                    encodingStyle="
http://schemas.xmlsoap.org/soap/encoding/"
                    namespace="
http://tempuri.org/com.acme.TelephoneDirectory" use="encoded"/>
            </input>

            <output name="findEmployeeByIDResponse">
                <soap:body
                    encodingStyle="
http://schemas.xmlsoap.org/soap/encoding/"
                    namespace="
http://tempuri.org/com.acme.TelephoneDirectory" use="encoded"/>
            </output>

        </operation>

    </binding>

</definitions>

TelephoneDirectory-binding.wsdl文件中包含了定義Web服務(wù)接口的信息。在我們的例子中,接口的名字為TelephoneDirectoryRemoteInterface,它有一個(gè)名為TelephoneDirectory的portType,這個(gè)端口關(guān)聯(lián)了一個(gè)名為findEmployeebyID的操作。

TelephoneDirectory-schema.xsd
<?xml version="1.0" encoding="UTF-8"?>
<schema attributeFormDefault="qualified" elementFormDefault="qualified"
    targetNamespace="
http://www.telephonedirectory.com/schemas/TelephoneDirectoryRemoteInterface"
    xmlns="
http://www.w3.org/2001/XMLSchema"
    xmlns:xsd1="
http://www.telephonedirectory.com/schemas/TelephoneDirectoryRemoteInterface">

    <complexType name="com.acme.Employee">
        <all>
            <element name="phone" type="string"/>
            <element name="lastName" type="string"/>
            <element name="firstName" type="string"/>
            <element name="id" type="int"/>
        </all>
    </complexType>

</schema>

 TelephoneDirectory-schema.xsd文件中包含了在Web服務(wù)中從Java到XML的映射信息,在例子中,名為com.acme.Employee的Java類將被映射為一個(gè)完整的XML文檔,XML中的每一個(gè)元素都對(duì)應(yīng)于類中一個(gè)簡(jiǎn)單的Java類型。這些信息將在TelephoneDirectory-binding.wsdl文件中定義消息類型和格式時(shí)被用到。

測(cè)試Web服務(wù)

WSAD中的Web服務(wù)生成向?qū)且粋€(gè)強(qiáng)大,有效的工具,它不但可以引導(dǎo)您一步一步的創(chuàng)建和定義一個(gè)Web服務(wù),還可以幫助您部署和測(cè)試生成的Web服務(wù)。您可以不需要知道部署和配置Web服務(wù)的詳細(xì)信息,因?yàn)橄驅(qū)?huì)自動(dòng)將新創(chuàng)建的Web服務(wù)部署到WSAD自帶的WebSphere應(yīng)用服務(wù)器測(cè)試環(huán)境中,同時(shí)幫您生成用來測(cè)試的Web客戶端應(yīng)用程序并運(yùn)行它。圖4顯示了向?qū)傻挠脕頊y(cè)試的客戶端例子程序。

圖4:WSAD中生成的用來測(cè)試的客戶端例子程序

從圖4中,我們看到客戶端例子程序的用戶界面由三個(gè)HTML部分構(gòu)成。在左邊區(qū)域的上部列出了所有可以作為Web服務(wù)調(diào)用的方法。當(dāng)選中其中任一方法時(shí),右邊區(qū)域的上部會(huì)顯示出一個(gè)表格,表格里包含要調(diào)用該方法所需的所有參數(shù)。用戶輸入?yún)?shù)值,并點(diǎn)擊提交按鈕后,相應(yīng)的Web服務(wù)將被調(diào)用,結(jié)果會(huì)顯示在底部區(qū)域。

將Web服務(wù)發(fā)布到UDDI注冊(cè)中心

在利用WSAD自帶的測(cè)試環(huán)境驗(yàn)證我們創(chuàng)建的Web服務(wù)成功后,我們準(zhǔn)備讓其它的應(yīng)用程序來使用該服務(wù)。我們用WSAD中的UDDI explorer將Web服務(wù)發(fā)布到IBM Test Registry(要使用IBM的Test Registry, 你需要先到以下網(wǎng)址www-3.ibm.com/services/uddi/testregistry/protect/home.jsp注冊(cè))。首先,我們?cè)贗BM的Test Registry中創(chuàng)建一個(gè)名為ACME Business的商業(yè)實(shí)體,接下來,就可以將我們的電話號(hào)碼簿的Web服務(wù)發(fā)布到其中了。圖5顯示了怎樣使用UDDI explorer 來發(fā)布我們的Web服務(wù)。

圖5: 用UDDI Explorer發(fā)布Web服務(wù)

 

使用員工信息查詢的Web服務(wù)

當(dāng)我們想通過編程的方式從電話號(hào)碼簿的應(yīng)用中來檢索員工信息,我們需要首先查找到這個(gè)Web服務(wù)的定義然后調(diào)用它們。也就是說,我們將成為這個(gè)Web服務(wù)的服務(wù)請(qǐng)求者。

通過UDDI Registry發(fā)現(xiàn)Web服務(wù)

我們使用WSAD中的UDDI explorer來查找電話號(hào)碼簿這個(gè)Web服務(wù)。一旦我們?cè)赨DDI Registry中找到它,我們將使用導(dǎo)入功能將搜索到的WSDL文檔導(dǎo)入到WSAD的工作臺(tái)中。 圖5說明了如何發(fā)現(xiàn)、導(dǎo)入Web服務(wù)定義文檔的過程。

圖6:發(fā)現(xiàn)、導(dǎo)入U(xiǎn)DDI Registry中的WSDL文檔

通過SOAP來訪問Web服務(wù)

通過SOAP來訪問Web服務(wù)的最常見的方法是使用事先生成的Java 代理對(duì)象(Java Proxy Object)。通過使用WSAD中的Web服務(wù)客戶端向?qū)?,我們可以為電話?hào)碼簿這個(gè)Web服務(wù)生成一個(gè)Java代理,它使我們可以通過簡(jiǎn)單的Java調(diào)用來訪問Web服務(wù)。圖7顯示了如何使用客戶端向?qū)砩蒍ava代理對(duì)象并通過生成的例子代碼來訪問Web服務(wù)。

圖7:生成一個(gè)Java代理并訪問Web服務(wù)

總結(jié)

Web服務(wù)是構(gòu)建在諸如XML、SOAP、WSDL和UDDI等等這些開放的,技術(shù)實(shí)現(xiàn)中立的標(biāo)準(zhǔn)之上的。Web服務(wù)被看作是下一代Web應(yīng)用的奠基石,通過Web服務(wù),電子商務(wù)應(yīng)用可以高效的,自動(dòng)化的整合他們的應(yīng)用,降低開發(fā)費(fèi)用,獲取更多的商機(jī)。到此為止,我們已經(jīng)描述了如何將已有的應(yīng)用程序的功能封裝為Web服務(wù)的過程,展示了在一個(gè)B2B的例子應(yīng)用中,如何使用IBM的WebSphere Studio Application Developer來非常輕松的定義、發(fā)布、定位、訪問Web服務(wù)。

資源:

1.請(qǐng)下載最新版本的
WSAD試用版。

2.下載directory.war文件,該文件包含了本文的例子代碼。要運(yùn)行該例子程序,需要將該文件導(dǎo)入IBM的WebSphere Studio Application Developer工作區(qū),然后您就可以通過Web服務(wù)向?qū)伤璧拇a來測(cè)試這個(gè)應(yīng)用和Web服務(wù)了。

3. 大家對(duì)于本文有任何建議以及想到的其他可能的問題,都?xì)g迎到討論論壇來提出意見或給出評(píng)論。

關(guān)于作者

黎獻(xiàn)勇, 電腦軟件業(yè)余愛好者,擅長(zhǎng)基于XML和Web服務(wù)的WebSphere應(yīng)用設(shè)計(jì). 可以通過 lxylxylxylxy@hotmail.com與他聯(lián)系。

李勁, IBM軟件解決方案多倫多實(shí)驗(yàn)室應(yīng)用開發(fā)技術(shù)中心的部門負(fù)責(zé)人,他負(fù)責(zé)從收集用戶要求到軟件實(shí)現(xiàn)及測(cè)試的全部設(shè)計(jì)周期,即收集、分析用戶的要求,并在軟件以及WebSphere應(yīng)用開發(fā)工具和面向Web應(yīng)用的交互式設(shè)計(jì)技術(shù),實(shí)現(xiàn)用戶的要求和使用方案。 Jin目前的主要工作是Web服務(wù)和B2B應(yīng)用集成,他具有十多年的軟件業(yè)從業(yè)經(jīng)驗(yàn),曾多次使用VisualAge實(shí)現(xiàn)了IBM的Java和WebSphere應(yīng)用服務(wù)器的客戶承諾. 可以通過
jinli@ca.ibm.com與他聯(lián)系。

發(fā)布:2007-03-25 13:29    編輯:泛普軟件 · xiaona    [打印此頁]    [關(guān)閉]
相關(guān)文章:
石家莊OA系統(tǒng)
聯(lián)系方式

成都公司:成都市成華區(qū)建設(shè)南路160號(hào)1層9號(hào)

重慶公司:重慶市江北區(qū)紅旗河溝華創(chuàng)商務(wù)大廈18樓

咨詢:400-8352-114

加微信,免費(fèi)獲取試用系統(tǒng)

QQ在線咨詢