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

將應用程序的功能封裝成為Web Services

申請免費試用、咨詢電話:400-8352-114

AMTeam.org

將應用程序的功能封裝成為Web Services 


 
 黎獻勇 李勁

2002 年 5 月

介紹

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

圖一:Web服務

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

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

應用場景

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

圖二: 最初的應用流程和使用Web服務整合后的應用流程。

提供員工信息查詢功能的Web服務

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

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

用WSDL定義Web服務

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

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

 


 

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

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服務的信息,比如說Web服務的名字,Web服務的端口綁定等等。從例子中可以看出,我們將通過SOAP rpcrouter 這個 servlet來訪問Web服務,而 port binding則描述了在哪可以找到如何訪問服務的詳細信息。

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服務接口的信息。在我們的例子中,接口的名字為TelephoneDirectoryRemoteInterface,它有一個名為TelephoneDirectory的portType,這個端口關聯(lián)了一個名為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服務中從Java到XML的映射信息,在例子中,名為com.acme.Employee的Java類將被映射為一個完整的XML文檔,XML中的每一個元素都對應于類中一個簡單的Java類型。這些信息將在TelephoneDirectory-binding.wsdl文件中定義消息類型和格式時被用到。

測試Web服務

WSAD中的Web服務生成向?qū)且粋€強大,有效的工具,它不但可以引導您一步一步的創(chuàng)建和定義一個Web服務,還可以幫助您部署和測試生成的Web服務。您可以不需要知道部署和配置Web服務的詳細信息,因為向?qū)詣訉⑿聞?chuàng)建的Web服務部署到WSAD自帶的WebSphere應用服務器測試環(huán)境中,同時幫您生成用來測試的Web客戶端應用程序并運行它。圖4顯示了向?qū)傻挠脕頊y試的客戶端例子程序。

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

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

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

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

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

 

使用員工信息查詢的Web服務

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

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

我們使用WSAD中的UDDI explorer來查找電話號碼簿這個Web服務。一旦我們在UDDI Registry中找到它,我們將使用導入功能將搜索到的WSDL文檔導入到WSAD的工作臺中。 圖5說明了如何發(fā)現(xiàn)、導入Web服務定義文檔的過程。

圖6:發(fā)現(xiàn)、導入UDDI Registry中的WSDL文檔

通過SOAP來訪問Web服務

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

圖7:生成一個Java代理并訪問Web服務

總結(jié)

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

資源:

1.請下載最新版本的
WSAD試用版。

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

3. 大家對于本文有任何建議以及想到的其他可能的問題,都歡迎到討論論壇來提出意見或給出評論。

關于作者

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

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

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

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

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

咨詢:400-8352-114

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

QQ在線咨詢