用于簡(jiǎn)化 Web 服務(wù)開(kāi)發(fā)的 Eclipse 插件
作者:Tyler Anderson 出處: IBM
在本教程中:
開(kāi)始之前簡(jiǎn)介安裝和創(chuàng)建 STP 項(xiàng)目創(chuàng)建 Java 接口生成 WSDL從 WSDL 生成代碼定義服務(wù)實(shí)現(xiàn)定義客戶(hù)機(jī)代碼部署和測(cè)試結(jié)束語(yǔ)下載參考資料 現(xiàn)在,可以很好地使用 Eclipse SOA Tools Platform (STP) 進(jìn)行工作,并且可以期待在未來(lái)幾個(gè)月中使用大量新功能來(lái)輔助面向服務(wù)的架構(gòu)(Service-Oriented Architecture,SOA)開(kāi)發(fā)。Eclipse STP 于 2005 年成為 Eclipse 組織的第九個(gè)頂級(jí)項(xiàng)目,并且從那以后一直在進(jìn)行開(kāi)發(fā)。使用 Eclipse STP 插件,您可以在 Java™ 接口中,使用與 Web 服務(wù)相關(guān)的屬性對(duì)它進(jìn)行注釋?zhuān)瑸?Web 服務(wù)創(chuàng)建 Web 服務(wù)描述語(yǔ)言(Web Services Description Language,WSDL),生成并編碼 Java 樁,隨后編譯到 WAR 文件,并部署到您最喜歡的 Web 服務(wù)器上。本教程將向您展示如何使用 Eclipse STP 插件完成所有這些工作。 開(kāi)始之前
什么是 SOA?SOA 的定義是:“支持將業(yè)務(wù)轉(zhuǎn)換為在需要時(shí)可通過(guò)網(wǎng)絡(luò)訪問(wèn)的一組鏈接服務(wù)或可重復(fù)的業(yè)務(wù)任務(wù)的 IT 架構(gòu)樣式”。
為什么使用 Eclipse STP?它的目標(biāo)是 “構(gòu)建框架和可仿效的擴(kuò)展工具,使您可以設(shè)計(jì)、配置、裝配、部署、監(jiān)視和管理圍繞 SOA 設(shè)計(jì)的軟件”。
本教程適用于想要了解如何使用 Eclipse SOA Tools Project (STP) 插件及如何簡(jiǎn)化 SOA 開(kāi)發(fā)的面向服務(wù)架構(gòu)(Service-Oriented Architecture,SOA)和 Web 服務(wù)開(kāi)發(fā)人員。
本教程將展示使用 Eclipse STP 插件構(gòu)建 Web 服務(wù)的優(yōu)點(diǎn)及簡(jiǎn)單性。您將了解如何使用 STP 插件完成以下操作:
創(chuàng)建項(xiàng)目 開(kāi)發(fā) Java 接口 用 Web 服務(wù)屬性為接口添加注釋 生成 WSDL 從 WSDL 生成 Java 代碼 向 Web 服務(wù)中添加實(shí)現(xiàn)代碼 編譯 Web 服務(wù)的 WAR 文件 部署和測(cè)試 Web 服務(wù)
本教程依賴(lài)于若干種 Eclipse 和 Apache 技術(shù),用于配合 STP 插件進(jìn)行開(kāi)發(fā):
Eclipse Eclipse 是運(yùn)行 Eclipse SOA Tools 插件的平臺(tái)。從 Eclipse Foundation 下載
Eclipse V3.2。
Eclipse STP 必備插件 在安裝 STP 插件之前,需要先安裝幾個(gè)必備插件。
STP 下載頁(yè)面 中列出了指定的 STP 版本的版本號(hào)和下載鏈接。撰寫(xiě)本文時(shí),
最新穩(wěn)定版 是 2007 年 2 月 1 日發(fā)布的。“系統(tǒng)要求” 部分顯示了需要下載和安裝的插件。您應(yīng)當(dāng)已經(jīng)安裝了 Eclipse V3.2。必備插件包括:
Eclipse EMF-SDO-XSD SDK Eclipse GEF SDK Eclipse JEM SDKEclipse WTP SDKEclipse GMF RuntimeEclipse STP Core SDK 現(xiàn)在您已經(jīng)獲得了必備插件,可以在 STP 下載頁(yè)面的 “SOA Tools Platform” 部分下載 STP Core SDK 插件。
Eclipse STP ServiceCreation 除了 STP Core SDK 以外,您還需要通過(guò) STP Core SDK 下載鏈接下載 STP ServiceCreation 插件。
Eclipse STP SOAS 除了 STP Core SDK 以外,您還需要通過(guò) STP Core SDK 和 STP ServiceCreation 下載鏈接下載 STP SOAS 插件。
Eclipse DTP SDK 您需要使用 Eclipse DTP 來(lái)協(xié)助部署 Web 服務(wù)器,而不是部署到 Eclipse 內(nèi)部綁定的獨(dú)立 Web 服務(wù)器上。
Eclipse Apache CXF 插件 除此之外,STP 插件還使用 Apache CXF 的 JAX-WS 實(shí)現(xiàn)。
Apache CXF Runtime 安裝所有插件后,需要告訴 Eclipse 可以找到 Apache CXF Runtime 的位置。
Apache Tomcat 您將通過(guò)把 Web 服務(wù)部署到 Apache Tomcat 上來(lái)執(zhí)行最終測(cè)試。下載最新的 Apache Tomcat V5.5。
在開(kāi)始編寫(xiě)本教程中后面的代碼之前,您將了解關(guān)于安裝的更多詳細(xì)信息。
返回 簡(jiǎn)介
隨著各大公司及其應(yīng)用程序越來(lái)越多地依賴(lài)于 Web,SOA 也變得越來(lái)越流行。Eclipse STP 插件旨在簡(jiǎn)化 Web 服務(wù)和 SOA 的部署。本節(jié)將向您介紹本教程中要?jiǎng)?chuàng)建的 STP 插件和應(yīng)用程序。
SOA 包含若干個(gè) Web 服務(wù),它們將互動(dòng)并協(xié)作以建立整個(gè)應(yīng)用程序而不是單片應(yīng)用程序。另一方面,SOA 更易于維護(hù)和部署,因?yàn)樗怯靡粋€(gè) Web 服務(wù)構(gòu)造的,每次構(gòu)造一個(gè)構(gòu)建塊。這就是 STP 可以幫助您完成的工作:構(gòu)建和部署各個(gè) Web 服務(wù)。
如果您曾嘗試創(chuàng)建一個(gè) Web 服務(wù),您就會(huì)知道它是一項(xiàng)多么有挑戰(zhàn)性的任務(wù)。通常在最后會(huì)獲得許多文件,但是只需要更改這些文件中的一兩個(gè)。不僅如此,而且初學(xué)者也很難掌握命令行工具。
STP 插件克服了這個(gè)問(wèn)題,將整個(gè)流程引入基于靈活的 GUI 的環(huán)境:Eclipse。STP 插件使 SOA 更簡(jiǎn)單,因?yàn)閺淖置嫔险f(shuō),正如您將在本教程中所見(jiàn),任何人都可以用它構(gòu)建和部署 Web 服務(wù)。它是如此簡(jiǎn)單,會(huì)讓您有種相見(jiàn)恨晚的感覺(jué)。
使用 STP 插件的主要優(yōu)點(diǎn)來(lái)自 Apache CXF 的,它是 STP 插件使用的 Java API for XML Web services (JAX-WS) 實(shí)現(xiàn)。Apache CXF 允許您使用 Java 注釋而不是大量選項(xiàng)來(lái)定義復(fù)雜的 Web 服務(wù),從而簡(jiǎn)化 Web 服務(wù)的創(chuàng)建。
而且還有另外一個(gè)優(yōu)點(diǎn),您可以完全按照第一次采用的方法重新創(chuàng)建 Web 服務(wù),而無(wú)需保存使用過(guò)的任何選項(xiàng)。這是因?yàn)槟切┻x項(xiàng)已經(jīng)使用 Java 注釋構(gòu)建到了 Java 接口中。
在本教程中,您將創(chuàng)建用作執(zhí)行以下函數(shù)的科學(xué)計(jì)算器的 Web 服務(wù):
float add(float, float) float square(float) float divide(float, float) float subtract(float, float) float multiply(float, float) float squareRoot(float, float) float inverse(float) float subtractUnary(float)
首先,我們將創(chuàng)建定義以上方法的 Java 接口,然后使用 Java Web 服務(wù)屬性來(lái)為它們注釋。其次,通過(guò)接口生成 WSDL,并通過(guò) WSDL 來(lái)生成客戶(hù)機(jī)樁和服務(wù)樁。最后,定義 Web 服務(wù)的功能并創(chuàng)建客戶(hù)機(jī)。結(jié)果,我們將獲得一個(gè)可以使用客戶(hù)機(jī)測(cè)試的功能完整的 Web 服務(wù)。
返回 安裝和創(chuàng)建 STP 項(xiàng)目
由于涉及許多附加插件和運(yùn)行時(shí),因此 STP 插件的安裝并不簡(jiǎn)單。本節(jié)將展示良好的安裝方法,完成所有插件及 CXF 運(yùn)行時(shí)的安裝。
下載完所有必需的插件后,您就可以開(kāi)始安裝它們了。把已下載的所有內(nèi)容放入同一個(gè)目錄中,并且:
解壓縮已下載的 Eclipse V3.2 軟件包。您應(yīng)當(dāng)會(huì)看到名為 eclipse 的目錄。Eclipse 二進(jìn)制文件位于 eclipse/eclipse.exe。 解壓縮 DTP SDK、EMF-SDO-XSD SDK、GEF SDK、GMF Runtime、JEM SDK、WTP SDK、STP Core SDK、STP ServiceCreation 和 STP SOAS 插件。系統(tǒng)可能會(huì)詢(xún)問(wèn)您是否覆蓋所有文件,單擊 Yes to all 即可。 解壓縮已下載的 Apache CXF 插件。將顯示名為 plug-ins 的目錄。將 plug-ins 移到 eclipse 目錄中。它將詢(xún)問(wèn)您是否替換插件目錄內(nèi)的現(xiàn)有文件,單擊 Yes to all 即可。
這就完成了 Eclipse 端的安裝。接下來(lái),我們安裝 CXF Runtime。
您應(yīng)當(dāng)已經(jīng)下載了 CXF Runtime。通過(guò)解壓縮來(lái)安裝 CXF Runtime,并記下它的安裝目錄(本教程中為 C:\apps\cxf-2.0-incubator-RC-SNAPSHOT)。在創(chuàng)建第一個(gè)項(xiàng)目時(shí)將需要使用它。
您已經(jīng)準(zhǔn)備好打開(kāi) Eclipse。打開(kāi) Eclipse 時(shí),它將要求您提供工作區(qū),并且您可以將工作區(qū)安排在任意位置,然后單擊 Enter。Eclipse 完成裝入時(shí):
單擊 File > New Project 選擇 SOA Tools > JAX-WS Java First Project 單擊 Next 輸入項(xiàng)目名稱(chēng):com.ibm.dw.scicalc 單擊 Finish
現(xiàn)在,項(xiàng)目已經(jīng)創(chuàng)建完成,我們可以設(shè)定項(xiàng)目特定的屬性:
轉(zhuǎn)至 Project > Properties 單擊 JAX-WS 在 Runtime Installation 框中輸入 CXF 的安裝目錄(本教程中為 C:\apps\cxf-2.0-incubator-RC-SNAPSHOT) 單擊 Apply 現(xiàn)在單擊 JAX-WS 的子屬性 Apache CXF 在 WSDL Generation Options 窗格中,選擇 SOAP 1.2,如圖 1 所示
單擊 Apply,然后單擊 OK 對(duì)首選項(xiàng)執(zhí)行同樣的操作;單擊 Window > Preferences 單擊 SOA Tools > JAX-WS 在 Installed runtimes 窗格的 Apache CXF 框中,輸入 CXF 的安裝目錄(本教程中為 C:\apps\cxf-2.0-incubator-RC-SNAPSHOT) 單擊 Apply 單擊 JAX-WS 的子屬性 Apache CXF 在 WSDL Generation Options 窗格中,選擇 SOAP 1.2,類(lèi)似于您在圖 1 中所做的操作 單擊 Apply,然后單擊 OK
項(xiàng)目現(xiàn)在以及準(zhǔn)備好開(kāi)始工作了。開(kāi)始編寫(xiě)代碼之前,請(qǐng)先單擊 Window > Open Perspective > Other 打開(kāi) JAX-WS 透視圖。從列表中選擇 JAX-WS 并單擊 OK。您的窗口應(yīng)當(dāng)類(lèi)似圖 2。
很好!您已經(jīng)準(zhǔn)備好繼續(xù)并開(kāi)始進(jìn)行 Java 接口的開(kāi)發(fā)。
返回創(chuàng)建 Java 接口
Java 接口是使用注釋完整定義 Web 服務(wù)并稍后編譯到 WSDL 中的起點(diǎn)。
在編寫(xiě) Java 接口的代碼之前,需要先將一個(gè)新接口添加到我們的項(xiàng)目中。右鍵單擊項(xiàng)目(Navigator 窗口中的 com.ibm.dw.scicalc 文件夾),然后單擊 New > Other。這將向您展示可以創(chuàng)建的內(nèi)容列表。選擇 Interface(紫色的 I)并單擊 Next。輸入使用 com.ibm.dw.scicalc 的軟件包名稱(chēng):ScientificCalculator。現(xiàn)在單擊 Finish。
現(xiàn)在在 src/com/ibm/dw/scicalc/ 目錄中應(yīng)當(dāng)有一個(gè)空的 ScientificCalculator 接口。打開(kāi)此文件,它應(yīng)當(dāng)類(lèi)似與以下代碼。
package com.ibm.dw.scicalc; public interface ScientificCalculator { }
接下來(lái),我們將在 Java 接口中創(chuàng)建方法,這些方法將定義 Web 服務(wù)可以執(zhí)行的操作。
作為科學(xué)計(jì)算器類(lèi)型的 Web 服務(wù),我們創(chuàng)建的 Web 服務(wù)將具有 “應(yīng)用程序概述” 部分中定義的函數(shù)。在接口中編寫(xiě)各個(gè)函數(shù)的代碼,如下所示。
public interface ScientificCalculator { public float squareRoot( // value^pow float value, float pow ); public float square( // value^2 float value ); public float inverse( // 1/value float value ); public float divide( // numerator/denominator float numerator, float denominator ); public float multiply( // value1*value2 float value1, float value2 ); public float add( // value1 + value2 float value1, float value2 ); public float subtract( // value1-value2 float value1, float value2 ); public float subtractUnary( // -value float value ); }
注:我們只需聲明方法 —— 即最終創(chuàng)建的 Web 服務(wù)的操作。它們大多數(shù)都有兩個(gè)輸入?yún)?shù),而少數(shù)方法只有一個(gè)輸入?yún)?shù),每個(gè)輸入?yún)?shù)都將返回操作結(jié)果。
接下來(lái),我們將開(kāi)始用 Web 服務(wù)特定的屬性為 Java 接口進(jìn)行注釋。
首先將類(lèi)注釋為 Web 服務(wù)。在 Outline 視圖中(左下),單擊 Java 接口 ScientificCalculator。單擊 SOA > JAX-WS > Create Web Service,然后單擊 Finish。您將注意到以下代碼被添加到您的代碼中。
... import javax.jws.WebService; ... @WebService(wsdlLocation = "file:/C:/Documents and Settings/Tyler3/workspaces/STPwarCreate/com.ibm.dw.scicalc/wsdl/com/ibm /dw/scicalc/ScientificCalculator .wsdl", targetNamespace = "http://scicalc.dw.ibm.com/", name = "ScientificCalculator") public interface ScientificCalculator { ...
實(shí)際上,我們已經(jīng)聲明了接口現(xiàn)在是 Web 服務(wù),連同目標(biāo)名稱(chēng)空間和名稱(chēng)。還定義了 WSDL 文件的創(chuàng)建位置。
通過(guò)添加以下代碼,將最后一個(gè)注釋手動(dòng)添加到類(lèi)中。
... import javax.jws.soap.SOAPBinding; ... @WebService(wsdlLocation = "file:/C:/Documents and ... ... @SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE, use = SOAPBinding.Use.LITERAL, style = SOAPBinding.Style.DOCUMENT) public interface ScientificCalculator { ...
我們使用文字和空參數(shù)樣式聲明了 DOCUMENT Web 服務(wù)的 SOAP 綁定。
這就完成了接口注釋。接下來(lái),我們將為 Web 服務(wù)的方法和操作創(chuàng)建注釋。
對(duì)方法進(jìn)行注釋幾乎與注釋類(lèi)完全相同。首先對(duì) squareRoot 方法注釋。使用 Annotation Properties 視圖來(lái)完成這項(xiàng)工作。如果看不到該視圖,請(qǐng)選擇 Window > Show View > Other。然后選擇 SOA Tools > Annotation Properties。您應(yīng)當(dāng)會(huì)在視圖的右下部分看到它。
要使用 Annotation Properties 視圖創(chuàng)建注釋?zhuān)?qǐng)將光標(biāo)置于接口中的這一行上:public float squareRoot( // value^pow。查看 Annotation Properties 視圖,應(yīng)當(dāng)會(huì)看到可用注釋列表。
首先,添加 WebMethod 注釋。您可以看到它顯示在視圖中。在 Annotation Properties 視圖中選擇它,單擊它旁邊的下拉框,并將 false 改為 true,應(yīng)當(dāng)會(huì)顯示注釋。
... import javax.jws.WebMethod; ... @WebMethod(operationName = "squareRoot", exclude=false) public float squareRoot( // value^pow float value, float pow ); ...
您現(xiàn)在已經(jīng)將 squareRoot 方法聲明為 Web 服務(wù)中的操作?,F(xiàn)在只有幾個(gè)注釋還需要完成:聲明 Web 服務(wù)的返回值和參數(shù)。
選擇 WebResult 注釋并將 false 改為 true。這將把以下代碼添加到您的代碼中。
... import javax.jws.WebResult; ... @WebResult(targetNamespace="http://scicalc.dw.ibm.com/", name="return", partName="return") @WebMethod(operationName = "squareRoot", exclude=false) public float squareRoot( // value^pow float value, float pow ); ...
向兩個(gè)參數(shù)中添加 WebParam 注釋。選擇包含浮點(diǎn)值的行,然后在 Annotation Properties 框中選擇 WebParam 注釋?zhuān)?false 改為 true。對(duì) float pow 行執(zhí)行相同的操作。返回到同一行并修改參數(shù)的屬性。
對(duì)于兩個(gè)參數(shù),我們已在 WebParam 注釋中定義了名稱(chēng)和 partName 屬性。您可以看到添加到清單 7 中的代碼。
... import javax.jws.WebParam; ... @WebResult(targetNamespace = "http://scicalc.dw.ibm.com/", partName = "return", name = "return") @WebMethod(operationName = "squareRoot") public float squareRoot( // value^pow @WebParam(targetNamespace="http://scicalc.dw.ibm.com", partName = "value", name = "value") float value, @WebParam(targetNamespace="http://scicalc.dw.ibm.com", partName = "pow", name = "pow") float pow ); ...
您已經(jīng)成功地對(duì) squareRoot 方法進(jìn)行了注釋。接下來(lái),我們將對(duì)其余方法進(jìn)行注釋。
在對(duì)其他方法快速注釋之前,還有一種您應(yīng)當(dāng)了解的對(duì)方法進(jìn)行注釋的方式,它是對(duì) Web 服務(wù)進(jìn)行注釋的補(bǔ)充方法。在 Outline 視圖(左下)中選擇 square(float) 方法,并且:
選擇 SOA > Create Web Method 首先指定 WebMethod,可以保留原樣;單擊 Next 不要選中 Add Annotation,因?yàn)椴恍枰褂?RequestWrapper,然后單擊 Next 選中 Add Annotation,然后單擊 Next 不要選中 Add Annotation,因?yàn)椴恍枰褂?ResponseWrapper,然后單擊 Finish
應(yīng)當(dāng)會(huì)創(chuàng)建以下注釋。
@WebResult(targetNamespace = "http://scicalc.dw.ibm.com/", header=false, partName = "return", name = "return") @WebMethod(operationName = "square", exclude=false) public float square( // value^2 float value );
您現(xiàn)在可以使用上一節(jié)的方法對(duì)值參數(shù)進(jìn)行注釋?zhuān)瑢?square 方法的代碼添加到以下代碼中。
public float square( // value^2 @WebParam(partName = "value", name = "value") float value );
這樣就完成了 square 方法!現(xiàn)在,您應(yīng)當(dāng)能夠?qū)ζ溆喾椒ㄟM(jìn)行注釋了。完成后,它們應(yīng)當(dāng)如以下清單所示。
@WebResult(targetNamespace = "http://scicalc.dw.ibm.com/", partName = "return", name = "return") @WebMethod(operationName = "inverse") public float inverse( // 1/value @WebParam(partName = "value", name = "value") float value ); @WebResult(targetNamespace = "http://scicalc.dw.ibm.com/", partName = "return", name = "return") @WebMethod(operationName = "divide") public float divide( // numerator/denominator @WebParam(partName = "numerator", name = "numerator") float numerator, @WebParam(partName = "denominator", name = "denominator") float denominator ); @WebResult(targetNamespace = "http://scicalc.dw.ibm.com/", partName = "return", name = "return") @WebMethod(operationName = "multiply") public float multiply( // value1*value2 @WebParam(partName = "value1", name = "value1") float value1, @WebParam(partName = "value2", name = "value2") float value2 ); @WebResult(targetNamespace = "http://scicalc.dw.ibm.com/", partName = "return", name = "return") @WebMethod(operationName = "add") public float add( // value1 + value2 @WebParam(partName = "value1", name = "value1") float value1, @WebParam(partName = "value2", name = "value2") float value2 ); @WebResult(targetNamespace = "http://scicalc.dw.ibm.com/", partName = "return", name = "return") @WebMethod(operationName = "subtract") public float subtract( // value1-value2 @WebParam(partName = "value1", name = "value1") float value1, @WebParam(partName = "value2", name = "value2") float value2 ); @WebResult(targetNamespace = "http://scicalc.dw.ibm.com/", partName = "return", name = "return") @WebMethod(operationName = "subtractUnary") public float subtractUnary( // -value @WebParam(partName = "value", name = "value") float value );
完成注釋了!您可以開(kāi)始生成 WSDL 了。
返回 生成 WSDL
在這一節(jié)中,我們將從 Java 接口中的注釋轉(zhuǎn)到 WSDL。
要?jiǎng)?chuàng)建最新 WSDL 版本的 Java 接口,請(qǐng)確保保存接口。這將在項(xiàng)目中的 wsdl/com/ibm/dw/scicalc/ScientificCalculator.wsdl 自動(dòng)創(chuàng)建 WSDL。
打開(kāi)剛剛了解的 WSDL。注:除了服務(wù)的地址外(下一節(jié)介紹),您不需要更改任何內(nèi)容,因?yàn)樗亲詣?dòng)生成的。讓我們檢驗(yàn)一下生成了哪些內(nèi)容。查看 WSDL 以了解下面的 squareRoot 操作(WSDL 中的其他詳細(xì)信息已被刪除,因?yàn)閮烧邲](méi)有多大差別)。
<?xml version="1.0" encoding="UTF-8"?> <wsdl:definitions targetNamespace="http://scicalc.dw.ibm.com/" xmlns:tns="http://scicalc.dw.ibm.com/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:ns1="http://scicalc.dw.ibm.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> <wsdl:types> <xsd:schema targetNamespace="http://scicalc.dw.ibm.com/" version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="squareRoot0" type="xs:float"/> <xs:element name="squareRoot1" type="xs:float"/> ... </xsd:schema> </wsdl:types> <wsdl:message name="squareRoot"> <wsdl:part name="value" element="tns:squareRoot0"> </wsdl:part> <wsdl:part name="pow" element="tns:squareRoot1"> </wsdl:part> </wsdl:message> <wsdl:message name="squareRootResponse"> <wsdl:part name="return" element="tns:return"> </wsdl:part> </wsdl:message> ... <wsdl:portType name="ScientificCalculator"> <wsdl:operation name="squareRoot"> <wsdl:input name="squareRoot" message="tns:squareRoot"> </wsdl:input> <wsdl:output name="squareRootResponse" message="tns:squareRootResponse"> </wsdl:output> </wsdl:operation> ... </wsdl:portType> <wsdl:binding name="ScientificCalculatorBinding" type="tns:ScientificCalculator"> <soap12:binding style="document" transport="http://www.w3.org/2003/05/soap/bindings/HTTP/"/> <wsdl:operation name="squareRoot"> <soap12:operation style="document"/> <wsdl:input name="squareRoot"> <soap12:body use="literal"/> </wsdl:input> <wsdl:output name="squareRootResponse"> <soap12:body use="literal"/> </wsdl:output> </wsdl:operation> ... </wsdl:binding> <wsdl:service name="ScientificCalculatorService"> <wsdl:port name="ScientificCalculatorPort" binding="tns:ScientificCalculatorBinding"> <soap12:address location="http://localhost/changeme"/> </wsdl:port> </wsdl:service> </wsdl:definitions>
注意 squareRoot 操作中使用的元素、參數(shù)(squareRoot0 和 squareRoot1 都是 float 類(lèi)型)的模式。接下來(lái),查看兩條消息 —— 一條是請(qǐng)求消息,另一條是響應(yīng)消息 —— 并注意它們?nèi)绾我媚J街械膬蓚€(gè)元素。接下來(lái)是 porttype,它用于定義 squareRoot 操作,及其輸入和輸出消息。綁定將指定低級(jí)詳細(xì)信息,如 SOAP 版本、傳輸類(lèi)型 (document) 以及是否將文字格式或編碼格式用于消息主體。最后,服務(wù)將指定 Web 服務(wù)的名稱(chēng)及其查找位置。您將在下一節(jié)中修改此行。
現(xiàn)在已經(jīng)準(zhǔn)備好了 WSDL。您只需對(duì)其位置做出微小的更改:最終發(fā)布 Web 服務(wù)的 URL。本教程將把它放在 http://localhost:8080/ScientificCalculator/services/ScientificCalculatorService。執(zhí)行以下更改:
... <wsdl:service name="ScientificCalculatorService"> <wsdl:port name="ScientificCalculatorPort" binding="tns:ScientificCalculatorBinding"> <soap12:address location="http://localhost:8080/ScientificCalculator/services/ ScientificCalculatorService"/> </wsdl:port> </wsdl:service> ...
當(dāng)您稍后部署了 Web 服務(wù)后,以上 URL 就是查看 Web 服務(wù)的位置。
返回從 WSDL 生成代碼
WSDL 完成后,在 Navigator 視圖中選擇 WSDL 文件,然后選擇 SOA > Generate code。
在下一個(gè)屏幕中,確保選中 Server 和 Client,并單擊 Finish。您現(xiàn)在應(yīng)當(dāng)會(huì)看到在 Navigator 視圖中創(chuàng)建了若干個(gè)新文件,如圖 6 所示。
好的,已經(jīng)生成了代碼。接下來(lái),您將定義服務(wù)代碼。
返回定義服務(wù)實(shí)現(xiàn)
服務(wù)實(shí)現(xiàn)是當(dāng)某個(gè)事物(通常是客戶(hù)機(jī))調(diào)用 Web 服務(wù)上的操作時(shí)運(yùn)行的代碼。它不會(huì)馬上執(zhí)行什么操作,因此在本節(jié)中,我們將定義它并使其完成某些有用的操作。
實(shí)現(xiàn)類(lèi)是自動(dòng)生成的,下面是一些您感興趣的方法 —— 定義 Web 服務(wù)操作的方法。在下一節(jié)中編寫(xiě)這些方法的代碼。
... public class ScientificCalculatorImpl implements ScientificCalculator { private static final Logger LOG = Logger.getLogger(ScientificCalculatorImpl.class.getPackage().getName()); public float add( float value1, float value2 ) { LOG.info("Executing operation add"); return 0.0f; } public float square( float value ) { LOG.info("Executing operation square"); return 0.0f; } public float divide( float numerator, float denominator ) { LOG.info("Executing operation divide"); return 0.0f; } public float subtract( float value1, float value2 ) { LOG.info("Executing operation subtract"); return 0.0f; } public float multiply( float value1, float value2 ) { LOG.info("Executing operation multiply"); return 0.0f; } public float squareRoot( float value, float pow ) { LOG.info("Executing operation squareRoot"); return 0.0f; } public float inverse( float value ) { LOG.info("Executing operation inverse"); return 0.0f; } public float subtractUnary( float value ) { LOG.info("Executing operation subtractUnary"); return 0.0f; } }
注:參數(shù)與在 Java 接口的 WebParam 注釋中命名的參數(shù)完全相同。接下來(lái)將使用傳入?yún)?shù)執(zhí)行適當(dāng)?shù)暮瘮?shù)并返回正確的結(jié)果。
因此,現(xiàn)在您只需要返回正確的操作值。它只是浮點(diǎn)型算法,您可能已經(jīng)清楚這種算法。不管哪種算法,每種方法的代碼如下所示:
LOG.info("Executing operation add"); return value1 + value2; ... LOG.info("Executing operation square"); return (float)Math.pow((double)value, 2); ... LOG.info("Executing operation divide"); return numerator/denominator; LOG.info("Executing operation subtract"); return value1-value2; ... LOG.info("Executing operation multiply"); return value1*value2; LOG.info("Executing operation squareRoot"); return (float)Math.pow((double)value, (double)pow); ... LOG.info("Executing operation inverse"); return (float)1/value; ... LOG.info("Executing operation subtractUnary"); return -value;
只需返回使用傳入函數(shù)的值的有效計(jì)算。下一節(jié)將定義調(diào)用以上 Web 服務(wù)操作的代碼。
返回定義客戶(hù)機(jī)代碼
客戶(hù)機(jī)代碼允許您編寫(xiě) Java 代碼,這些 Java 代碼可以與將在本教程中創(chuàng)建的 Web 服務(wù)以及其他 Web 服務(wù)進(jìn)行交互。這一節(jié)將定義客戶(hù)機(jī)代碼。
自動(dòng)生成的客戶(hù)機(jī)類(lèi)已經(jīng)簡(jiǎn)單地輸出使用 Web 服務(wù)中每項(xiàng)操作的代碼??匆豢瓷傻膬?nèi)容。
... ScientificCalculatorService ss = new ScientificCalculatorService(wsdlURL, SERVICE_NAME); ScientificCalculator port = ss.getScientificCalculatorPort(); System.out.println("Invoking add..."); float _add_return = port.add(0.0f,0.0f); System.out.println("Invoking square..."); float _square_return = port.square(0.0f); System.out.println("Invoking divide..."); float _divide_return = port.divide(0.0f,0.0f); System.out.println("Invoking subtract..."); float _subtract_return = port.subtract(0.0f,0.0f); System.out.println("Invoking multiply..."); float _multiply_return = port.multiply(0.0f,0.0f); System.out.println("Invoking squareRoot..."); float _squareRoot_return = port.squareRoot(0.0f,0.0f); System.out.println("Invoking inverse..."); float _inverse_return = port.inverse(0.0f); System.out.println("Invoking subtractUnary..."); float _subtractUnary_return = port.subtractUnary(0.0f); System.exit(0); } }
它還不是十分有用,但是在下一節(jié)中,您將修改它以傳入有用的參數(shù),并將結(jié)果顯示到標(biāo)準(zhǔn)輸出。
現(xiàn)在您有了客戶(hù)機(jī),可以使用它來(lái)完整測(cè)試 Web 服務(wù)并根據(jù)需要執(zhí)行回歸測(cè)試??匆豢刺砑拥拇a。
... System.out.println("Invoking add..."); float _add_return = port.add(1.2f,3.6f); System.out.println("Result: "+_add_return); System.out.println("Invoking square..."); float _square_return = port.square(3); System.out.println("Result: "+_square_return); System.out.println("Invoking divide..."); float _divide_return = port.divide(4.8f,1.2f); System.out.println("Result: "+_divide_return); System.out.println("Invoking subtract..."); float _subtract_return = port.subtract(2.5f,0.5f); System.out.println("Result: "+_subtract_return); System.out.println("Invoking multiply..."); float _multiply_return = port.multiply(1.5f,10.0f); System.out.println("Result: "+_multiply_return); System.out.println("Invoking squareRoot..."); float _squareRoot_return = port.squareRoot(4.0f,0.5f); System.out.println("Result: "+_squareRoot_return); System.out.println("Invoking inverse..."); float _inverse_return = port.inverse(2.0f); System.out.println("Result: "+_inverse_return); System.out.println("Invoking subtractUnary..."); float _subtractUnary_return = port.subtractUnary(6.999f); System.out.println("Result: "+_subtractUnary_return); ...
在這里,將傳入各種參數(shù)并將其顯示給標(biāo)準(zhǔn)輸出。因而,在運(yùn)行客戶(hù)機(jī)時(shí),您可以看到輸出并了解其工作原理。接下來(lái),我們將部署和測(cè)試 Web 服務(wù)。
返回部署和測(cè)試
看起來(lái)我們已經(jīng)準(zhǔn)備好部署和測(cè)試 Web 服務(wù)。在這一節(jié)中,我們將給 Web 服務(wù)打包以進(jìn)行部署,使用 Representational State Transfer (REST) 和已構(gòu)建的客戶(hù)機(jī)部署并測(cè)試它。
您必須先將代碼打包到 WAR 文件以供部署,然后才能運(yùn)行獨(dú)立服務(wù)器并測(cè)試 Web 服務(wù):
在 Navigator 視圖中選擇 WSDL 文件 單擊 SOA > Generate Deploy Package
這將在項(xiàng)目的 WebContent/ScientificCalculator.war 中創(chuàng)建一個(gè)可部署的 WAR 文件。
現(xiàn)在您可以繼續(xù)并運(yùn)行獨(dú)立的 Web 服務(wù)器。
開(kāi)發(fā)框架附帶了一個(gè)獨(dú)立的 Web 服務(wù)器,該服務(wù)器將允許您在 Eclipse 框架內(nèi)執(zhí)行 Web 服務(wù)的測(cè)試。
注:STP 插件已經(jīng)創(chuàng)建了幾個(gè)預(yù)配置的運(yùn)行配置。要運(yùn)行服務(wù)器,請(qǐng)執(zhí)行以下操作:
在 Navigator 視圖中雙擊 Java 接口 單擊 Run > Run 選擇 Java Application > ScientificCalculatorServer_server_com.ibm.dw.scicalc,如圖 7 所示 單擊 Run
隨后會(huì)運(yùn)行服務(wù)器并告訴您它已經(jīng)就緒。
現(xiàn)在把瀏覽器指向 http://localhost:8080/ScientificCalculator/services/ScientificCalculatorService?wsdl,您應(yīng)當(dāng)會(huì)看到 WSDL。接下來(lái),我們將使用 REST 在瀏覽器中測(cè)試 Web 服務(wù)。
瀏覽器指向 Web 服務(wù)的 WSDL 后,您現(xiàn)在可以對(duì)它測(cè)試操作。將瀏覽器指向 http://localhost:8080/ScientificCalculator/services/ScientificCalculatorService/square?square0=4.5。
注意我們將調(diào)用 square 操作,其參數(shù)為 4.5。您將獲得一個(gè) soap+xml 類(lèi)型的文件,它顯示的結(jié)果為 20.25,如 SOAP 消息所示,它獲得以下返回結(jié)果 。
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"> <soap:Body> <ns2:return xmlns:ns2="http://scicalc.dw.ibm.com/" xmlns="http://www.w3.org/2005/08/addressing/wsdl"> 20.25 </ns2:return> </soap:Body> </soap:Envelope>
您可以看到答案是 20.25。使用 REST 隨便測(cè)試其他操作。接下來(lái),我們將使用客戶(hù)機(jī)執(zhí)行一次回歸測(cè)試。
現(xiàn)在,您知道服務(wù)已經(jīng)啟動(dòng)并使用 REST 測(cè)試了功能,您可以使用客戶(hù)機(jī)執(zhí)行更嚴(yán)格且全面的測(cè)試。要運(yùn)行客戶(hù)機(jī),請(qǐng)執(zhí)行以下操作:
在 Navigator 視圖中雙擊 Java 接口 單擊 Run > Run 選擇 Java Application > ScientificCalculatorClient_client_com.ibm.dw.scicalc 選擇 Arguments 選項(xiàng)卡 用 http://localhost:8080/ScientificCalculator/services/ScientificCalculatorService?wsdl 替換 “Program arguments” 窗格,如圖 9 所示 單擊 Run
單擊 Run 后,客戶(hù)機(jī)將運(yùn)行并在控制臺(tái)中執(zhí)行每項(xiàng)操作,如下所示。
通過(guò)切換到客戶(hù)機(jī)的控制臺(tái),您可以看到客戶(hù)機(jī)執(zhí)行后得到的服務(wù)器輸出,如下所示:
成功啦!您有了一個(gè)功能全面的 Web 服務(wù)。接下來(lái),我們將通過(guò)把 Web 服務(wù)部署到 Apache Tomcat 上執(zhí)行一次最終測(cè)試。
開(kāi)始在 Eclipse 內(nèi)部設(shè)置 Tomcat 之前,您需要先把一些 jar 復(fù)制到 Tomcat 的 shared/lib 目錄中,執(zhí)行以下操作:將除 cxf-integration-jbi-*.jar(注:星號(hào)表示通配符)或用于本教程的 cxf-integration-jbi-2.0-incubator-RC-SNAPSHOT.jar 以外的所有 jar 從 CXF-Runtime-install-directory/lib 復(fù)制到 Tomcat-install-directory/shared/lib。
好的 —— 您已經(jīng)準(zhǔn)備好繼續(xù)使用 Eclipse DTP 把軟件包部署到 Tomcat 上。您將開(kāi)始創(chuàng)建新的連接器(前四個(gè)步驟還可用于根據(jù)需要選擇性啟動(dòng) Eclipse 內(nèi)的 Tomcat 服務(wù)器):
單擊 File > New > Other 打開(kāi) Server 文件夾并選擇 Server 選擇 Apache 文件夾下的 Tomcat v5.5 Server 單擊 Finish 現(xiàn)在單擊 File > New > Other 打開(kāi) Connection Profiles 文件夾并選擇 Connection Profile 選擇 Tomcat Connection Profile 單擊 Next 輸入名稱(chēng) Tomcat 5.5,然后單擊 Next 瀏覽到 Tomcat 的安裝目錄(本教程中為 C:\apps\tomcat-5.5.20) 單擊 Finish
要部署到 Tomcat 上,請(qǐng)運(yùn)行 startup.bat (Windows®) 或 startup.sh (Linux®) 來(lái)啟動(dòng) Tomcat 服務(wù)器。Tomcat 運(yùn)行后,請(qǐng)通過(guò)以下操作部署 Web 服務(wù):
在 Navigator 視圖中選擇 WAR 文件 右鍵單擊并選擇 Deploy,如下所示
單擊已建立的連接配置文件 Tomcat 5.5,并單擊 OK 如果以前部署過(guò),您將獲得一條警告消息,如圖 13 中所示。單擊 OK
現(xiàn)在像以前一樣運(yùn)行客戶(hù)機(jī),并且您應(yīng)當(dāng)會(huì)獲得與圖 10 所示完全相同的輸出。Tomcat 的標(biāo)準(zhǔn)輸出還應(yīng)當(dāng)會(huì)顯示圖 11 中所示的內(nèi)容。
我們已經(jīng)使用 Eclipse STP 插件成功地構(gòu)建和測(cè)試了 Web 服務(wù)。
返回結(jié)束語(yǔ)
是不是很簡(jiǎn)單?使用某些工具進(jìn)行 Web 服務(wù)開(kāi)發(fā)有時(shí)可能十分困難,但是幸好,比較而言這還是很容易完成的。我們?yōu)?Java 接口進(jìn)行了注釋?zhuān)瑥纳煽蛻?hù)機(jī)樁和服務(wù)樁的 Java 接口生成了 WSDL。然后定義了樁代碼,成功地把服務(wù)部署到了 Eclipse 的獨(dú)立服務(wù)器和 Tomcat 上,并使用客戶(hù)機(jī)進(jìn)行了測(cè)試。
但是等等,還有更多功能。Eclipse SOA Tools Platform (STP) 插件只是處于發(fā)展初期,并且一直以來(lái)都在不斷添加更多功能。要了解關(guān)于它的更多信息,請(qǐng)查閱 參考資料。
返回下載
描述 名字 大小
下載方法
源代碼 os-eclipse-soatp.source.zip 39KB
HTTP返回參考資料
學(xué)習(xí)
查閱位于 Eclipse.org 的
Eclipse SOA Tools Platform (STP) 項(xiàng)目。 了解關(guān)于
Eclipse Service Creation (SC) 子項(xiàng)目 的信息。 在
Eclipse STP 維基 了解更多信息。 要了解關(guān)于面向服務(wù)的架構(gòu)(Service-Oriented Architecture,SOA)的更多信息,請(qǐng)查閱 developerWorks
SOA 和 Web 服務(wù)專(zhuān)區(qū)。 查閱 developerWorks 教程 “
網(wǎng)格與 SOA”。 在 “
What is Eclipse and how do I use it?” 中可以找到有關(guān) Eclipse 的問(wèn)題的答案。 訪問(wèn)
Eclipse Foundation 可以了解關(guān)于 Eclipse Foundation 及其眾多項(xiàng)目的更多信息。 查閱有關(guān)
Eclipse Test & Performance Tools Platform (TPTP) 的廣泛文檔、教程、演示和屏幕演示。 要獲得關(guān)于 Eclipse 平臺(tái)的優(yōu)秀介紹性文章,請(qǐng)參閱 “
Eclipse 平臺(tái)入門(mén)”。 查閱 “
Eclipse 推薦讀物列表”。 瀏覽 developerWorks 上的所有
Eclipse 文章 和
Eclipse 教程。 查閱 IBM developerWorks 的
Eclipse 項(xiàng)目資源中心 擴(kuò)展 PHP 技能。 收聽(tīng)針對(duì)軟件開(kāi)發(fā)人員的有趣訪談和討論,不要錯(cuò)過(guò)
developerWorks podcast。 隨時(shí)關(guān)注 developerWorks 的
技術(shù)事件和網(wǎng)絡(luò)廣播。 查閱最近將在全球舉辦的面向 IBM 開(kāi)放源碼開(kāi)發(fā)人員的研討會(huì)、展覽、網(wǎng)絡(luò)廣播和其他
活動(dòng)。 訪問(wèn) developerWorks
開(kāi)源軟件專(zhuān)區(qū),獲得豐富的 how-to 信息、工具和項(xiàng)目更新,幫助您使用開(kāi)放源碼技術(shù)進(jìn)行開(kāi)發(fā),并將其與 IBM 產(chǎn)品結(jié)合使用。
獲得產(chǎn)品和技術(shù) 獲得最新的
Eclipse SOA Tools Platform 下載。 訪問(wèn) Eclipse.org 下載
Eclipse 數(shù)據(jù)工具平臺(tái)項(xiàng)目。 在 Apache.org 下載
CXF Runtime。 在 Apache.org 獲得最新的
Apache Tomcat 下載。 在 IBM
alphaWorks 查閱最新的
Eclipse 技術(shù)下載。 使用
IBM 試用軟件 改進(jìn)您的下一個(gè)開(kāi)源開(kāi)發(fā)項(xiàng)目,這些軟件可以通過(guò)下載或從 DVD 中獲得。
討論 與 Eclipse 開(kāi)發(fā)人員和
Eclipse 郵件列表和新聞組 中的其他用戶(hù)聯(lián)系(要求進(jìn)行免費(fèi)注冊(cè))。 參與
developerWorks blog,加入 developerWorks 社區(qū)
返回