這個由四篇文章組成的系列使用最新的 IBM® 工具和技術來開發和部署基于 Web 服務的應用程序。這個系列是以前的由四篇文章組成的系列 Web Services Development and Deployment with WebSphere® V4 Tools and Technologies(于 2001 年 11 月出版)的更新的、改進的版本。這個系列的文章描述如何使用 WebSphere Studio application Developer 5.0(以下稱為 Application Developer)來開發和測試 Web 服務和 Web 應用程序、如何把 Web 服務部署到 WebSphere Application Server 5.0 以及如何在 IBM WebSphere UDDI Registry 中發布和查找 Web 服務。
IBM 確信 Web 服務是下一代電子商務 — 隨需應變電子商務(e-business on demand)的要害構件。本系列文章將演示 IBM 是如何使用最新的電子商務基礎結構和工具來兌現這一承諾的。這些文章的重點是以下這些 IBM 工具和技術:
這些文章為您講述如何使用這些 IBM 工具和技術來為隨需應變電子商務創建基于 Web 服務的解決方案。這一系列將包括以下主題:
Application Developer 為應用程序開發者提供了多項功能,這些功能包括 Web 應用程序的開發和測試、xml 的開發和測試以及 Web 服務的開發和測試(本系列的重點)。當您安裝完 Application Developer 后,請花些時間看一下 Application Developer 的聯機幫助,非凡是“Web Services Development”主題。這個主題講述如何利用 java™ bean(本系列的研究內容)、DADX 文件、企業 bean 和 URL 來創建 Web 服務。
在本文中,我們將創建 Web 服務,這個 Web 服務制作從 National Weather Service(NWS)實時獲取的天氣預告。下面的清單顯示的是 forecast.WeatherForecast
Java bean 的公共方法,我們將使用這個 bean 來創建 Web 服務。本文中用到的所有資源的源代碼可從下面下載。構造函數(未被列出)讀取屬性文件,該文件包含一個屬性,這個屬性表示 Web 服務應該真正地與 NWS 聯系以獲取預告還是應該使用“現成的”數據。getStates()
方法返回另一個 Java bean forecast.beans.States
,這個 bean 包含被硬編碼在返回的 bean 中的州名縮寫的列表。getCities()
方法返回另一個 Java bean forecast.beans.Cities
,這個 bean 包含在請求的州中有報告的城市的列表。在 NWS 在線的情況下使用私有方法來從 NWS 檢索城市列表,在 NWS 不在線的情況下從文件中檢索城市列表,該方法把州和城市信息存在高速緩存中以提高性能。getForecast()
方法返回另一個 Java bean forecast.beans.Forecasts
,這個 bean 是一個城市的多時段的預告。在 NWS 在線的情況下從 NWS 檢索預告,在 NWS 不在線的情況下從文件中檢索預告,該方法使用高速緩存的州和城市信息以提高性能。
package forecast;public class WeatherForecast { public forecast.beans.States getStates() {...} public forecast.beans.Cities getCities(String state) {...} public forecast.beans.Forecasts getForecast(String state, String city) {...}
下面的清單顯示的是 States
bean 的說明。您可以看到,它是“數據”bean,它有一個屬性,即州名縮寫的 String
的數組。
package forecast.beans;public class States { public String[] getStates() { return state; }}
下面的清單顯示的是 Cities
bean 的說明。它也是數據 bean,它有兩個屬性:表示州名的 String
和城市名的 String
數組。它還包括被 WeatherForecast
用來把城市添加到 bean 中的方法。
package forecast.beans;public class Cities { public void setState(String state) {...} public String getState() {...} public void setCities(String[] cities) {...} public String[] getCities() {...} public void addCity(String city) {...}}
下面的清單顯示的是 Forecasts
bean 的說明。它是有三個屬性的數據 bean:表示預告適用的位置的 String
、表示發布預告的時刻的 String
和 forecast.beans.Forecast
bean 數組(請參閱下面的描述)。Forecasts
bean 也包括讓 WeatherForecast
把 Forecast
bean 添加到數組中的方法。
package forecast.beans;public class Forecasts { public void setLocation(String l) {...} public String getLocation() {...} public void setIssued(String i) {...} public String getIssued() {...} public void setForecasts(Forecast[] f) {...} public Forecast[] getForecasts() {...} public void addForecast(Forecast f) {...}}
下面的清單顯示的是 Forecast
bean 的說明。它是有兩個屬性的簡單的數據 bean:表示預告所跨越的時段的 String 和給出預告的 String。
package forecast.beans;public class Forecast { public void setPeriod(String p) {..} public String getPeriod() {...} public void setForecast(String f) {...} public String getForecast() {...}}
為了創建 Web 服務,我們將執行以下步驟:
在創建 Web 項目前,請在 J2EE 或 Web 透視圖中選擇 J2EE Navigator 視圖。為了開始創建 Web 項目,請選擇 File => New => Web PRoject。如圖 1 所示,Create a Web Project 向導被打開。該向導提示您輸入項目的名稱。請在 Project name 域中輸入 WForecast
。您可以接受該面板的其余部分的缺省值,所以只需單擊 Next。
圖 1. Create a Web Project 向導:Web 項目面板.
現在您可以看到 J2EE 設置面板,如下面的圖 2 所示。請輸入企業應用程序歸檔(Enterprise Application Archive,EAR)文件的名稱;對于這個示例,請使用 WForecastEAR
。您可以使用這個面板來為(WebSphere Application Server V4 所支持的)J2EE 1.2 環境或(WebSphere Application Server V5 所支持的)J2EE 1.3 環境創建項目。Application Developer 支持這兩個環境。我們需要 J2EE 1.3,所以選擇 Finish。Application Developer 將完成 Web 項目的構造并構建相應的歸檔。
圖 2. Create a Web Project 向導:J2EE 設置面板.
下一步,請導入 Web 服務的 Java 和資源文件。請先下載并解壓縮(unzip)本系列文章中提供的源代碼。
請展開 WForecast 項目,選擇 WForecast 項目中的 Java Source 文件夾,然后選擇 File => Import。在后續的 Import 向導中,請選擇 File system,然后單擊 Next。在 Import 向導的 File System 面板中(如下面的圖 3 所示),請選擇 Browse,然后瀏覽到您解壓縮源代碼的位置。請選擇 WForecast/Java Source/
文件夾,再單擊 OK。請展開源代碼文件夾,選擇 forecast 旁邊的復選框,然后單擊 Finish。
圖 3. 導入源代碼.
Application Developer 將導入 WeatherForecast.java
、一個屬性文件、兩個 Html 文件和以上描述的數據 bean。現在,Application Developer 的 J2EE Navigator 視圖如下所示:
圖 4. 導入文件后的 WForecast 項目.
為了把 WeatherForecast bean 轉換成 WForecast Web 項目中的 Web 服務,請選擇 WeatherForecast.java,右鍵單擊,然后選擇 New => Other。您將看到圖 5 中的 New 對話框:
圖 5. New 對話框.
請在左邊選擇 Web Services,在右邊選擇 Web Service,然后選擇 Next。Web Service 向導的第一個面板被打開(下面的圖 6)。它讓您選擇您將用來創建 Web 服務的組件類型。因為我們預先選擇了 Java bean,所以它已被選擇。假如您需要的話,您可以選中其它選項,但是請確保再次選擇 Java bean Web Service。因為我們需要生成代理,所以您必須選擇該選項。同樣,因為我們需要通過生成的代理來測試 Web 服務,所以您應該選擇該選項。然后,選擇 Next。在后續的面板中,請驗證 WForecast
Web 項目被標識,然后單擊 Next。
圖 6. Web Service 向導:類型選擇.
現在您可以看到 Deployment Settings 面板,如下面的圖 7 所示。Application Developer 5.0 的這個新的功能部件使您可以選擇運行時協議和服務器環境。在此時,僅支持 SOAP/HTTP 協議。服務器選項包括 WebSphere Application Server 4 和 5 以及 Apache Tomcat 的幾個版本。該面板上的缺省值(包括目標 Web 項目)正是我們所需要的,所以只需選擇 Next。后續的 Java Bean Selection 面板讓您確認向導使用正確的 bean 且應該顯示 forecast.WeatherForecast
。選擇 Next。
圖 7. Web Service 向導:Deployment Settings.
您現在可以看到圖 8 中的 Java Bean Identity 面板。一般來說,用來標識部署描述符中的 Web 服務的 Web service URI 應該是唯一的,但在這一情況下沒有必要是唯一的。這個面板還讓您為 Web 服務選擇類似 HTTP 的處理范圍。WeatherForecast bean 被設計成在會話范圍中運行。所以,您必須把 Scope 域更改為 session
,這將確保每個用戶有一個新實例且使 bean 中的信息的高速緩存能夠正確運行。
圖 8. Web Service 向導:Java Bean Identity.
在 Application Developer 5.0 中,Identity 面板中的 WSDL 文檔域顯示更多新的功能部件。現在,向導為接口、綁定和服務 WSDL 元素缺省地生成不同的 WSDL 文檔。實際上,向導生成兩個不同的綁定,一個用于上一步選擇的協議(在這里是 SOAP/HTTP),另一個用于 Java 綁定。這一新的缺省行為使您可以使用高級的功能部件,這些部件不在本文的討論范圍內。假如您想讓向導生成一個 WSDL 文檔,那么您只需在接口、綁定和服務文檔中使用相同的名稱。這些域的缺省值對于這個練習來說是可接受的,所以選擇 Next。
下面的圖 9 顯示的是 Java Beans Methods 面板,該面板讓您選擇需部署的方法。在缺省的情況下,向導預先選擇了所有的公共方法,這正是我們所需要的。您也可以修改用于輸入和輸出的編碼樣式。輸入字符串和輸出 bean 的缺省 SOAP 編碼是正確的,所以您只需單擊 Next。
圖 9. Web 服務向導:Java Bean Methods.
Binding Proxy Generation 面板(如下面的圖 10 所示)使您可以選擇您要求生成的代理使用 Web 服務提供的哪種綁定類型。在這里,我們要使用 SOAP 綁定,所以不必作什么修改。該面板上的所有其它缺省值也是正確的,所以選擇 Next。
圖 10. Web 服務向導:Binding Proxy Generation.
現在您可以看到測試面板,如圖 11 所示。Application Developer 5.0 的另一個新的功能部件讓您選擇用來測試 Web 服務代理的工具。最適合 WeatherForecast Web 服務的工具是 Web service sample jsps(缺省)或 Universal Test Client。請選擇 Web service sample JSPs。您也可以選擇您想測試的方法。帶有 setEndPoint()
和 getEndPoint()
方法的代理被生成,這些方法使相同的代理能夠與不同的實現交互。我們不想測試這些方法,所以不選擇它們,然后單擊 Finish。
圖 11. Web 服務向導:測試.
Application Developer 生成描述 Web 服務的 WSDL 文件,生成 SOAP 部署描述符,并在 Application Developer WebSphere Test Environment 中部署 Web 服務。
Application Developer 5.0 有重要的、新的代理生成功能。Application Developer 5.0 可創建新的 Web 項目(在這里被命名為 WForecastClient
),項目中包括客戶機可用來訪問 Web 服務的代理。Application Developer 把可被用來測試代理和 Web 服務的示例客戶機(在這里是一組 JSP)放在相同的 Web 項目中。下面的圖 12 顯示的是 WForecastClient 項目的內容。proxy.soap.WeatherForecastProxy
代理類似于 WForecast
項目中的 WeatherForecast
bean。
新項目還包括代理使用的一組數據 bean,這些 bean 類似于 WForecast
項目的 forecast.beans
包中的數據 bean。這些 bean 是在完全不了解原先的包中的實現的情況下全部從 WSDL 中生成的,這使客戶機實現可以使用 bean,使用方式與原先的 bean 的使用方式完全相同,但仍然完全獨立于 Web 服務的實現。與原先的 bean 相比,新的 bean 有完全相同的包和類名。與原先的 bean 相比,說明略有不同,因為它們是真正的數據 bean,每個屬性有 set...() 和 get...() 方法,沒有其它方法。
圖 12. WForecastClient 項目.
當您創建 Web 服務以及服務的 WSDL 描述、代理、示例客戶機等的時候,Application Developer 自動地在內置的 WebSphere Test Environment 中部署 Web 服務和客戶機并啟動該環境。下面的圖 13 顯示的是運行時體系結構。Web 服務及其客戶機均在 Application Developer 測試環境中運行。假設 forecast.properties
文件的 OFFLINE 屬性被設為 false
,那么 WeatherForecast
Web 服務通過因特網訪問 NWS。否則,這個 bean 從與 bean 一起被導入的本地資源文件中讀取現成的數據。
圖 13. 測試的運行時體系結構.
Application Developer 還啟動內置的瀏覽器以用于查看由 Web 服務向導生成的測試客戶機 JSP。下面的圖 14 顯示的是瀏覽器的初始頁面。正如在 Web 服務向導中所要求的那樣,測試客戶機僅公開 Web 服務的“業務”方法。
圖 14. 測試客戶機:初始頁面.
為了使用示例客戶機來測試 Web 服務,請選擇 Methods 面板中的 getStates。Inputs 面板將出現變化。單擊 Invoke。在 Result 面板中,您將看到由州名縮寫組成的數組,如圖 15 所示:
圖 15. 測試客戶機:getStates 調用.
現在,請選擇 Methods 面板中的 getCities。Inputs 面板將出現變化。請輸入以上數組中的州名縮寫,然后單擊 Invoke。在 Result 面板中,您將看到由有預告的城市所組成的數組。該示例使用 TX。結果顯示在圖 16 中:
圖 16. 測試客戶機:getCities 調用.
現在,請選擇 Methods 面板中的 getForecast。Inputs 面板發生了變化。請輸入與以上的一個組合相匹配的州名縮寫和城市名稱,然后單擊 Invoke。您將在 Result 面板中看到結果,如圖 17 所示(在這里是 Texas 的 Austin),其中位置和發布時間為 String
。五個時段的實際預告被簡單地顯示為 forecast.beans.Forecast
bean 的實例。對于更深入的分析,您可以使用 Universal Test Client 選項,它可能是測試的更好的選擇,因為它支持 Forecast
實例的分析。但是,它的使用方法更復雜。
圖 17. 測試客戶機:getForecast 調用.
本文為您講述了如何使用 Application Developer 5.0 來創建和測試 Web 服務。與 V4 相比,V5.0 使這一過程更靈活、更輕易控制 - 例如,改進了復雜參數和返回值的處理。所以,Application Developer 5.0 是創建和測試 Web 服務的更好的工具。
Greg Flurry 是 IBM 奧斯汀實驗室(位于得克薩斯州)的 IBM Software Group Emerging Technologies 小組的高級技術人員。他的職責包括推進 IBM 電子商務技術的發展。您可以通過 [email protected] 與 Greg 聯系。
新聞熱點
疑難解答