Web服務使用一個復雜的體系結構為客戶應用程序提供一個簡單機制來從服務器應用程序調用方法和獲取結果,而不用計較源代碼使用的語言和主機平台有什麼不同。Sun ONE Studio提供的工具讓開發者能夠使用包含在現有的Java類中的Web服務、方法--而不需要對這種體系結構有更深的了解。本文從一個基於servlet的Web模塊中創建一個Web服務,演示如何使用現有的服務邏輯來生成新的客戶應用程序。
介紹
回顧一下Web服務的核心技術--XML和簡單對象訪問協議( SOAP)--很明顯這些技術實現已經在產業環境中存在了許多年了。在這段時間內,構建、測試和部署Web服務的工具已經極大地成熟了。在前段時間,對於這些關鍵技術的認識深度--例如SOAP信封的結構--是一個先決條件。現在,使用象Sun ONE Studio這樣的高級開發工具,一個Web服務可以在幾分鐘之內從一個現有的J2EE Web容器應用程序中生成--不需要像SOAP這樣的Web服務技術背景。
本文將模擬一個通用的案例:使用一個基於J2EE Web容器應用程序的現有的服務,並且把它展示為防火牆後的點對點同步集成的Web服務。當使用的示例不是實際的應用程序的時候,它的簡單性提供一個集中創建、部署和測試一個Web服務的處理的機會--被大部分全面的J2EE應用程序共用處理。諸如安全和事務這樣的相關主題雖然很重要,但是超出了本教程的范圍。
初始化設置任務
為了成功地遵循本文中的過程,必須設置一個類似的開發環境。這個環境包括Sun ONE Studio 4企業版和Sun ONE應用服務器7平台版本。
產品和文件下載
下面的表格概括了本教程中所需要的產品和文件下載。
產品/文件 注解 Sun ONE Studio 5標准版 Sun ONE Studio 5標准版預配置了Sun ONE Application Server 7,這個應用服務器是本文所需要的。如果Sun ONE Application Server 7已經安裝在你的開發環境中,那麼Sun ONE Studio 5將自動整合到現有的安裝中。 hellowebmod.zip 在一個Web模塊中的HelloWorld源程序 本教程使用的兩個源文件:HelloWorld.java hello程序包中的入口類,用於基於servlet的Web容器應用程序。兩個類文件都在com.sun.demo.hello程序包中。 Salutation.java 這是一個簡單的類,包含一個用來作為Web服務的方法。
察看文件擴展
默認情況下,IDE在Explorer窗口中隱藏了擴展名,但是出於明確性的原因,本文包括了文件的擴展名。為了使文件擴展名可見,你可以選擇性地執行下面的任務:
1.從IDE主菜單,選擇Tools> Options打開Options窗口。
2.打開IDE的Configuration > System,選擇System Settings。
3.設置Show File Extensions屬性為True。
環境配置
在本示例中,一個Web模塊被創建,並且兩個源文件(包括上面的)被添加來創建Web應用程序。在文件web.xml中,url模式/servlet/HelloWorld被配置用於本示例。
下面的過程將結束本文中的設置任務,配置你的環境並且安裝和演示示例Web模塊。
圖1:設置默認服務器。
1. 為本示例選擇或者創建一個工作目錄。然後在這個工作目錄之內創建一個名為hellowebmod的子目錄。
2. 解壓縮示例文件hellowebmod.zip <http://developers.sun.com/tools/javatools/articles/buildingWS/hellowebmod.zip>到hellowebmod目錄裡。
3.啟動Sun ONE Studio 5標准版。
4.啟動Sun ONE應用服務器7。使用Explorer窗口中的Runtime選項卡:
i.打開Installed Servers> Sun ONE Application Server 7> localhost 4848。如果在localhost 4848下沒有server1 ( localhost : port_no)節點,那麼右擊localhost 4848並且從上下文的菜單選擇Start來啟動Admin Server。
ii.右擊server1 ( localhost : port_no)節點,並且從上下文菜單中選擇Status。Sun ONE Application Server 7 Instance Status對話窗口將打開。
iii.單擊Start server,然後等到對話框中的狀態指示器變為Running。
iv.單擊OK關閉對話框。
5. 使用Explorer窗口中的Runtime選項卡(參見圖1),為J2EE Applications和Web Tier Applications驗證(或者設置,如果必要)默認服務器來運行Sun ONE應用服務器7實例:
i.打開默認服務器(Default Servers)節點。
ii.分別依次右擊每一節點。
iii.從上下文菜單選擇Set Default Server。iv.打開Select Default Application Server或者Select Default Web Server對話框。
v.打開Sun ONE Application Server 7 > localhost:4848 > server1 ( localhost:4848)下的節點。
vi.選擇server1 (localhost:80)。單擊OK關閉對話框。
6.在Filesystems窗口中加載本地目錄hellowebmod。打開加載的目錄展示它的WEB - INF目錄。驗證IDE是否已經認可hellowebmod作為一個Web模塊,通過WEB - INF旁邊的黃色方框中的綠色圓圈來指定。
7.右擊WEB - INF節點,並且從上下文菜單中選擇Deploy來部署示例Web應用程序。
一旦你的環境配置完成,下面的URL(或者類似的東西,取決於你的配置)應該返回下面表格中指定的問候語。
URL 問候語 http://localhost/servlet/HelloWorld Hello World! http://localhost/servlet/HelloWorld?m=0 Hello World! http://localhost/servlet/HelloWorld?m=1 Greetings, World! http://localhost/servlet/HelloWorld?m=2 Excuse me, I did not understand.
創建一個Web服務
下面的過程將展示,作為一個Web服務,Salutation.java中的getmessage()方法與它的int參數和String返回值一起。
圖2:Web服務向導。
1.在Explorer窗口中,選擇WEB-INF>Classes > com > sun > demo > hello。右擊hello節點,並且從上下文菜單選擇New > Web Service。
2. 將出現Web服務向導。
3.在Web Service Wizard的第一個頁面(見圖2):
4. 在Name字段中,輸入SalutationService。這將要成為Web服務的名稱,被用作servlet和Web服務規范的名稱的一部分。
5.驗證Package Name是否com.sun.demo.hello。
6.驗證Create From選擇是否為Java Methods。
7.對於Architecture,選擇Web centric(與之相反的是Multitier)。這將使Web服務可以在除了成熟的應用服務器之外的Web容器中運行。
8. 單擊Next按鈕,轉到Web Service Wizard的下一個頁面。
9.在Web ServiceService Wizard的第二個頁面中,選擇hellowebmod > WEB - INF > Classes > com > sun > demo > hello > Salutation.java > class Salutation > Methods。選擇getMessage ()方法,並且單擊Finish按鈕。
10.在Explorer窗口中,右擊SalutationService.xms節點,並且從上下文菜單中選擇Generate Web Service Files。
11. 這將生成SalutationService.wsdl文件和一個SalutationServiceGenServer文件夾名。生成的文件夾包含使用RMI的類來實現這條鏈的一部分,使用調用它的遠程進程來連接getMessage ()方法。
12. 注意:如果一個消息對話框出現,指明某些類被標記為RMI對象,只是不需要遵循它的指令來關閉對話框。所有用於運行Web服務所必要的代碼和配置文件現在已經被創建了。
所有用於運行Web服務所必要的代碼和配置文件現在已經被創建了。
SalutationService.wsdl是一個使用XML格式描述Web服務的Web服務定義語言( WSDL)文件可以多種途徑來使用。例如,一個WSDL文件可以發布為一個通用描述、發現和集成(UDDI)注冊,在這裡另一個應用程序可以找到它並且可以編程生成SOAP請求--所有的這些都可以不進行人工干預。這個過程類似於Java反射,這裡的方法可以在運行時間發現。
另一種使用方法是這個文件可以在一個組織(或者合作組織)內部共享並且有效地用作一個協約,定義提供了什麼服務並且如何使用。此外,"協約(contract)"的概念和Java接口背後的概念大不相同。此外,我們遲些將看到WSDL文件可用於創建一個Web服務客戶端,而這個Web服務客戶端將和用於本教程的Web服務示例相互作用。
包裝一個Web服務
到目前為止有兩個Web模塊:最初的servlet和新創建的Web服務。因為這兩個Web模塊基於同一個Salutation.java文件,這兩個Web模塊應該統一以便更新只需要在某處部署的salutation.class。一旦結束,一個訪問HelloWorld servlet的新的URL將可用,並且包含的Java類將出現在一個新的位置。
為了合並最初的servlet和新創建的Web服務。
1.在Explorer窗口中,右擊SalutationService.xms文件,並且從上下文菜單中選擇Export WAR file。
2.這生成WAR模塊文件salutationservice.war,包含web.xml,sun - web.xml和其它所需要的文件。
3.將打開一個詢問對話框,詢問你是否想為Web服務生成一個測試客戶端。點擊No。在本教程稍後的地方將生成一個測試客戶端。
4.右擊WAR模塊文件SalutationService.war,並且從上下文菜單中選擇Unpack as Web Module。
5.創建並且選擇SalutationService目錄,在這個目錄中打開Web模塊。加載SalutationService目錄作為Sun ONE Studio的一個文件系統。
6.Sun ONE Studio現在將識別這個文件系統作為一個Web模塊--通過它的WEB-INF節點旁邊的綠色的Web模塊圖標來標示。
7.從hellowebmod/WEB - INF/classes/com/sun/demo/hello/目錄中復制文件HelloWorld.java和Salutation.java。然後把它們粘貼到SalutationService/WEB - INF/classes/com/sun/demo/hello/目錄中。
8. 注意:對於Copy選項,選擇Paste而不是Create鏈接。同時,關閉可能出現"Changes recommended in deployment descriptor.."消息的對話框,並且不接受推薦的變更。
9. 把HelloWorld servlet添加到SalutationService Web模塊,如下:
. 在Explorer窗口中,選擇SalutationService>WEB-INF節點,右擊web.xml節點並且從上下文菜單中選擇Properties。
i. 找到Servlets屬性,並且點擊它的相應的Browse button (…)。將打開Servlets Property Editor對話框。
ii. 點擊Servlets Property Editor中的Add按鈕。將打開Add Servlet對話框。
iii. 設置Servlet Name字段為HelloWorld。通過點擊Browse (…)按鈕設置Servlet Class字段並且選擇SalutationService/WEB - INF/classes/com/sun/demo/hello/HelloWorld.java。
iv. 通過點擊相應的Browse ( Edit…)按鈕設置Mappings字段。將打開Edit Servlet Mappings對話框。
v. 點擊Edit Servlets Mappings對話框中的Add按鈕。將打開Add Servlet Mapping對話框。
vi. 在Edit Servlet Mappings對話框中設置Servlet Name為HelloWorld,並且設置URL Pattern為/hello。
vii. 在每個對話窗口中點擊OK按鈕關閉它們。(參見圖3)
圖3:把HelloWorld servlet添加到SalutationService Web模塊中。
10.右擊WEB - INF節點,並且打開它的屬性對話框。設置上下文根為/SalutationService。
部署一個Web服務
接下來的任務是在Sun ONE Application Server上部署Web服務。
Sun ONE Studio標准版可以使用它的組合式體系機構部署到各種應用服務器中,默認情況包括Tomcat和J2EE Reference Implementation服務器。 Sun ONE Application Server安裝程序將安裝插件。
一旦安裝正確,Sun ONE Application Server7應該在Sun ONE Studio中和在Explorer窗口的Runtime選項卡中以及Server Registry > Installed Server下可視。驗證它是否是默認應用服務器,然後使用一個簡單的步驟部署你的Web服務應用程序到這個容器中:
1.右擊節點SalutationService > WEB - INF,從上下文菜單中選擇Build All重新編譯新復制的類。
2.右擊WEB - INF節點,並且從上下文菜單中選擇Deploy來部署示例Web應用程序。
基於缺省值,現在可以在下面的URL中測試示例Web服務的部署(參見圖4):
§ http://localhost/SalutationService/SalutationService
圖4:訪問SalutationService Web服務。
下面的URL是可以訪問的相關servlet和它的參數值:
§ http://localhost/SalutationService/hello
§ http://localhost/SalutationService/hello?m=0
§ http://localhost/SalutationService/hello?m=1
§ http://localhost/SalutationService/hello?m=2
現在創建並部署了一個具有功能的Web服務和servlet。在最初的SalutationService Web模塊hellowebmod中的性能和源代碼已經在新的Web模塊中被重新構造了一遍。原來的hellowebmod現在就是多余的了,可以刪除掉了。
接下來,我們將創建一個能和我們的web服務編程交互的web服務客戶應用程序。
創建一個Web服務客戶程序
接下來的任務是創建一個能和剛剛配置的web服務編程交互的web服務客戶應用程序。
注意:如果你將在不同的機器或者文件系統上開發客戶程序,你必須首先把WSDL文件保存在http://localhost/SalutationService/SalutationService
1. 從Explorer窗口中的Filesystems選項卡中,在已有的SalutationService/WEB - INF/classes/com/sun/demo/文件夾中創建一個名為client的新建文件夾。
2. 右擊新的client目錄,從上下文菜單中選擇New > All Templates啟動New Wizard。然後選擇Web Services > Web Service Client並且按下一步。
3. Web Service Client Wizard的第一個頁面:
i. 設置Name字段為SalutationClient。
ii. 確認Package字段被設置為com.sun.demo.client,也就是說client目錄是在這之下創建的。
iii. 設置Create From字段為Local WSDL File。
iv. 單擊Next按鈕。
4. 在Web Service Client Wizard的第二個頁面,如下選擇Local WSDL文件:
i. 選擇節點SalutaionService > SalutationService.wsdl
ii. 單擊Next按鈕。
Web服務描述文件SalutationClient.wsc現在將被生成。
5. 右擊新生成的Web服務描述文件節點SalutationClient.wsc,並且從它的上下文菜單中選擇Properties,確認Soap Runtime屬性設置為JAXRPC。
6. 右擊SalutationClient.wsc並且從上下文菜單選擇Generate Client Files。
這個命令將生成完成這個客戶端所需要的類和文檔。
7. 再次右擊SalutationClient.wsc。這次,從上下文菜單中選擇Deploy。
這個命令將產生客戶程序代理程序類,組裝WAR模塊,並且把它配置到應用服務器中。
8. Web服務客戶程序現在可以在下面的URL處訪問(參見圖5):http://localhost/SalutationClient。
圖5:使用SalutationClient。
為了在你的浏覽器中測試新的Web服務客戶程序,輸入0~2之間的一個整數,並且點擊Invoke按鈕。客戶程序將發送一個SOAP格式的請求到Web服務,返回一個SOAP響應。然後客戶程序將顯示一個包括一個到原始SOAP格式的響應的鏈接的非常格式化的響應。
調試
如果你遇到因為類加載器不能發送上下文信息到JAXRPCContextListener的情況所引起的加載servlet類的問題,請檢查WEB-INF/classes/com/sun/demo/hello/forte4j/webdesigner/basecomponent/目錄中是否有KOMODOxxx.class文件。如果沒有這個文件,從Sun ONE Studio Filesystem中添加這些文件。