2007 年 1 月 04 日 使用面向 Java 編程語言的 SCA 客戶機(jī)與實(shí)現(xiàn)模型構(gòu)建和集成應(yīng)用程序。本文說明了實(shí)現(xiàn)示例 SCA 應(yīng)用程序的基本步驟,包括本地和遠(yuǎn)程服務(wù)以及組裝各種服務(wù)。 本文將說明開發(fā)和部署 SCA 應(yīng)用程序的主要概念。我們將說明如何創(chuàng)建組件實(shí)現(xiàn)來提供遠(yuǎn)程服務(wù)、本地服務(wù)、配置屬性和服務(wù)引用以及如何創(chuàng)建組件、入口點(diǎn)、外邊服務(wù)和模塊。 示例應(yīng)用程序:Innova Solutions 開發(fā) 我們將詳細(xì)說明一家名為 Innova solutions 的虛構(gòu)軟件公司所進(jìn)行的活動(dòng),該公司向其員工提供不同的服務(wù),以便查看自己的工資單信息、休假詳細(xì)信息、能力詳細(xì)信息、個(gè)人信息和績效評級。 以 下示例說明了構(gòu)建用于查看員工的工資單信息的服務(wù)的過程,可以通過 Web 應(yīng)用程序和 Web 服務(wù)客戶機(jī)訪問此服務(wù)。Innova solutions 將其應(yīng)用程序?qū)崿F(xiàn)為兩個(gè)模塊,從而提供了可重用性和靈活性。這兩個(gè)模塊分別為 Payroll 模塊和 Web 前端模塊: 圖 1. Payroll 模塊關(guān)系圖 ![]() innovasolutions.payrollmodule 模塊表示 payroll 服務(wù),此服務(wù)用于使用 Web 服務(wù)協(xié)議訪問遺留系統(tǒng)中的員工工資單信息。它包含以下內(nèi)容:
下圖顯示了 Web front-end 模塊的不同組件: 圖 2. Payroll front-end 模塊 ![]() innovasolutions.webclientmodule 模塊可對用于將信息記錄到系統(tǒng)中和訪問員工工資單信息的基于瀏覽器的功能起到促進(jìn)作用。它包含以下內(nèi)容:
示例應(yīng)用程序開發(fā)涉及到兩個(gè) SCA 模塊的開發(fā),下面我們將對此進(jìn)行介紹。 創(chuàng)建 innovasolutions.payrollmodule SCA 模塊 innovasolutions.payrollmodule 是通過這樣構(gòu)建的:在文件系統(tǒng)中構(gòu)建一個(gè)名為 innovasolutions.payrollmodule 的文件夾,并在該文件夾的根目錄下放置一個(gè) sca.module 文件。 清單 1 顯示了 sca.module 的內(nèi)容,該文件是一個(gè) xml 文件。 清單 1. sca.module
Payroll Data Service Implementation:我們首先創(chuàng)建由 PayrollDataService 服務(wù)提供的 PayrollDataService 接口;此服務(wù)向其員工提供工資單信息。然后,我們將創(chuàng)建 PayrollDataServiceImpl,以向 Innova solutions 的員工提供 PayrollDataService 服務(wù)。 我們創(chuàng)建名為 services/payrolldata 的子目錄,并將所有組成 PayrollDataServiceImpl 實(shí)現(xiàn)的文件放置到其中。 清單 2 顯示了 PayrollDataService Java 接口。 清單 2. PayrollDataService Java 接口
清單 3 說明了 PayrollDataServiceImpl Java 實(shí)現(xiàn)。 清單 3. PayrollDataServiceImpl Java 實(shí)現(xiàn)
上面的代碼片段實(shí)現(xiàn)了之前的 PayrollDataService 接口。在實(shí)現(xiàn)中使用了一個(gè) @Service Annotation 來聲明服務(wù)及其接口。 清單 4 顯示了上述實(shí)現(xiàn)的組件類型、side 文件。 清單 4. 組件類型、side 文件
Payroll Data Service Component:SCA 組件是通過配置實(shí)現(xiàn)的引用和屬性創(chuàng)建的。配置引用需要將其連接到其他組件提供的服務(wù)或外部服務(wù)。此處,我們將通過配置 PayrollDataServiceImpl 創(chuàng)建 PayrollDataServiceComponent。 將使用 component 元素將所創(chuàng)建的 SCA 組件添加到 sca.module 文件,該元素具有一個(gè) name 屬性,指定組件的名稱。 清單 5 顯示了創(chuàng)建 payrollDataServiceComponent 后的 sca.module 文件。 清單 5. 創(chuàng)建了 payrollDataServiceComponent 后的 sca.module 文件
創(chuàng)建 TaxRateRules Web 服務(wù)外部服務(wù):此處我們將創(chuàng)建一個(gè)外部服務(wù) TaxRateRulesService,以提供向 innovasolutions.payrollmodule 的員工提供 TaxRateRulesService 接口的服務(wù)。 我們首先創(chuàng)建一個(gè)名為 services/taxraterules 的子目錄,以將 TaxRateRulesService 外部服務(wù)所需的所有文件放入其中。業(yè)務(wù)合作伙伴實(shí)際實(shí)現(xiàn)此外部服務(wù),將提供一個(gè) TaxRateRulesService.wsdl。為了處理靜態(tài)數(shù)據(jù)類型,我們?yōu)?wsdl portType 創(chuàng)建了對應(yīng)的 Java 接口。 清單 6 顯示了 wsdl portType 的 Java 接口的大致情況。 清單 6. wsdl portType 的 Java 接口
接下來,我們將以下代碼添加到前面指定的 sca.module 文件,以創(chuàng)建名為 TaxrateRulesService 的外部服務(wù)。 清單 7 顯示了添加 TaxrateRulesService 后的 sca.module 文件。 清單 7. 添加 TaxrateRulesService 后的 sca.module 文件
Payroll Service Implementation:此處我們將討論 PayrollServiceImpl 的實(shí)現(xiàn),該實(shí)現(xiàn)提供一個(gè)服務(wù),此服務(wù)在 innovasolutions.payrollmodule 中向其員工提供 PayrollService 接口。此實(shí)現(xiàn)使用兩個(gè)其他服務(wù)提供的接口引用這兩個(gè)服務(wù),即 PayrollDataService 接口(本地服務(wù))和 TaxRateRulesService 接口(外部服務(wù))。 我們將首先創(chuàng)建名為 services/payroll 的子目錄,并將所有組成 PayrollServiceImpl 實(shí)現(xiàn)的文件放入其中。 清單 8 顯示了 PayrollService Java 接口。 清單 8. PayrollService Java 接口
上面的 PayrollService Java 接口包含一個(gè) getPayrollStatement() 方法,其參數(shù)是 employeeID,將返回 PayrollStatement 對象。由于這需要為外部服務(wù),因此使用 @Remotable Annotation 將接口聲明為遠(yuǎn)程接口。在此實(shí)現(xiàn)中,通過遠(yuǎn)程服務(wù)交換的所有參數(shù)都是服務(wù)數(shù)據(jù)對象(Service Data Objects,SDO)類型的數(shù)據(jù)。 清單 9 顯示了 PayrollStatement Java 接口。 清單 9. PayrollStatement Java 接口
清單 10 顯示了 PaySplitUP Java 接口。 清單 10. PaySplitUP Java 接口
清單 11 說明了 PayrollServiceImpl Java 實(shí)現(xiàn)類。 清單 11. PayrollServiceImpl Java 實(shí)現(xiàn)類
上面所示的 PayrollServiceImpl 類實(shí)現(xiàn)了 PayrollService 接口。PayrollServiceImpl 使用 @Reference Annotation 定義了兩個(gè)成員變量,以引用另外兩個(gè)服務(wù),即 PayrollDataService 和 TaxRateRulesService。SCA 運(yùn)行時(shí)通過注入解析這些引用。PayrollServiceImpl 使用 @Property Annotation 在運(yùn)行時(shí)配置成員變量 currency。PayrollStatement 對象是使用 SDO 數(shù)據(jù)工廠 API 作為服務(wù)數(shù)據(jù)對象 (SDO) 創(chuàng)建的。 清單 12 顯示了上述 PayrollServiceImpl 的組件類型文件。 清單 12. PayrollServiceImpl 的組件類型文件
Payroll Service Component:現(xiàn)在我們將通過配置上面實(shí)現(xiàn)的 PayrollServiceImpl 來創(chuàng)建 PayrollServiceComponent。我們將對上面指定的 sca.module 文件添加若干行代碼來包括 PayrollServiceComponent,如清單 13 中所示。 清單 13. 添加了額外代碼行的 sca.module 文件
創(chuàng)建 payroll 服務(wù) Web 服務(wù)入口點(diǎn):下一步我們將創(chuàng)建名為 PayrollService 的入口點(diǎn)來發(fā)布 PayrollService,以便 Web 服務(wù)客戶機(jī)能夠訪問 PayrollService。需要首先創(chuàng)建 SCA 運(yùn)行時(shí)用于綁定到入口點(diǎn)的 WSDL 定義文件,然后才能在 sca.module 文件中創(chuàng)建入口點(diǎn)。我們向 sca.module 文件添加數(shù)行代碼來表示 PayrollService 入口點(diǎn)的創(chuàng)建。 清單 14 顯示了添加到上面指定的 sca.module 文件中的代碼行。 清單 14. 添加了額外代碼行的指定 sca.module 文件
創(chuàng)建 innovasolutions.webclientmodule 在 此部分,我們將創(chuàng)建 Innova Solutions Web 應(yīng)用程序,以訪問名為 payroll service 的外部服務(wù),此服務(wù)使用了本地服務(wù)組件、SCA 范圍管理、JSP 和 Servlet。Innova Solutions Web 應(yīng)用程序允許其員工登錄并使用范圍確定為 HTTP 會(huì)話的本地服務(wù)跟蹤自己的概要,還向其提供了對工資單系統(tǒng)的訪問和顯示他們每月的工資單。它將首先把用戶導(dǎo)航到登錄頁,然后前進(jìn)到工資單系統(tǒng),在其中顯示 每月的工資單。 以下各個(gè)部分將說明如何創(chuàng)建 InnovaSolutions Web 應(yīng)用程序外部的各個(gè) SCA 服務(wù),即 login、user profile 和 payroll。然后我們將了解如何由 Servlet、JSP 和標(biāo)記庫訪問這些服務(wù),以提供用戶界面。 我 們將首先實(shí)現(xiàn) LoginServiceImpl,此服務(wù)負(fù)責(zé)將用戶登錄到應(yīng)用程序中。LoginServiceImpl 提供服務(wù) LoginService,該服務(wù)在 innovasolutions.webclientmodule 中向員工提供 LoginService 接口。 首先,我們創(chuàng)建名為 services/profile 的子文件夾,并將屬于 LoginServiceImpl 實(shí)現(xiàn)的所有文件放入其中。 清單 15 顯示了 LoginService Java 接口。 清單 15. LoginService Java 接口
接下來,編寫實(shí)現(xiàn) LoningService 接口的 LoginServiceImpl Java 實(shí)現(xiàn),該實(shí)現(xiàn)使用其接口 profileservice 引用本地服務(wù)。 清單 16 給出了 LoginServiceImpl Java 實(shí)現(xiàn)。 清單 16. LoginServiceImpl Java 實(shí)現(xiàn)
上面的 LoginServiceImpl 實(shí)現(xiàn)了 LoginService 接口,并使用其接口 profileservice 引用本地服務(wù)。 Login Component:此處我們將通過配置 LoginServiceImpl 實(shí)現(xiàn)來創(chuàng)建 LoginServiceComponent。讓我們看看顯示包含 LoginServiceComponent 的 innovasolutions.webclientmodule 的 sca.module 文件的代碼。 清單 17 顯示了 innovasolutions.webclientmodule 的 sca.module 文件。 清單 17. innovasolutions.webclientmodule 的 sca.module 文件
Profile Service Implementation:在此部分,我們將簡要地給出 profileServiceImpl,此實(shí)現(xiàn)提供了由接口 ProfileService 訪問的服務(wù)。通過使用 ProfileService,可以在用戶的 Web 應(yīng)用程序內(nèi)導(dǎo)航時(shí)跟蹤用戶狀態(tài)。我們使用前面創(chuàng)建的子文件夾 services/profile 來放置組成 profileServiceImpl 實(shí)現(xiàn)的所有文件。 profileService Java 接口使用 @Scope Annotation 來聲明 ProfileServiceImpl 實(shí)例的范圍由會(huì)話確定。 清單 18 顯示了 ProfileService Java 接口。 清單 18. ProfileService Java 接口
ProfileServiceImpl 實(shí)現(xiàn)了 ProfileService Java 接口。清單 19 說明了 ProfileServiceImpl Java 實(shí)現(xiàn)。 清單 19. ProfileServiceImpl Java 實(shí)現(xiàn)
Profile Service Component:現(xiàn)在我們將清單 20 中所示的代碼片段添加到 innovasolutions.webclientmodule 的 sca.module 文件中,從而創(chuàng)建 ProfileServiceComponent。 清單 20. 添加了額外代碼行的 sca.module 文件
清單 21 顯示了在 component 元素下添加的三行代碼 LoginServiceComponent。 清單 21. LoginServiceComponent
Payroll Service Web Service External Service:在此部分,我們將創(chuàng)建名為 PayrollService 的外部服務(wù),該接口在 innovasolutions.webclientmodule 中向用戶提供名為 PayrollService 的接口。 我 們首先創(chuàng)建一個(gè)名為 services/payroll 的子目錄,以將 PayrollService 外部服務(wù)所需的所有文件放入其中。此外部服務(wù)提供一個(gè) PayrollService.wsdl 文件。我們?yōu)?wsdl portType 創(chuàng)建對應(yīng)的 Java 接口,即 PayrollService、PayrollStatement 和 PaySplitUP,以便在使用 PayrollService 時(shí)處理靜態(tài) Java 類型。 最后,我們添加清單 22 中所示的代碼,以在 innovasolutions.webclientmodule 的 sca.module 文件中創(chuàng)建名為 PayrollService 的外部服務(wù)。 清單 22. 經(jīng)過修改以創(chuàng)建 PayrollService 的 sca.module 文件
Login HTML 頁:login.html 頁將當(dāng)前用戶的用戶名和密碼發(fā)送給 login Servlet。 Login Servlet:login Servlet 處理從 login.html 獲得的用戶名和密碼,并使用 ModuleContext API 調(diào)用 login 本地服務(wù)。CurrentModuleContext.getContext() 返回當(dāng)前的模塊上下文,并隨后調(diào)用 locateService("LoginServiceComponent") 查詢本地服務(wù)。 Payroll Statement JSP: PayrollStatement.JSP 顯示 payroll 服務(wù)返回的員工的所有工資單信息。為了讓 Payroll Statement 頁不受實(shí)現(xiàn)細(xì)節(jié)的限制,Payroll Statement.jsp 使用了一系列 JSP 標(biāo)記,即 login 標(biāo)記、service 標(biāo)記和 payroll status 標(biāo)記。 以下部分對子系統(tǒng)構(gòu)件進(jìn)行說明。 創(chuàng)建 innovasolutions.payrollsubsystem 在此部分,我們將創(chuàng)建 innovasolutions.payrollsubsystem,此子系統(tǒng)對 innovasolutions.payroll 模塊進(jìn)行配置。首先,在文件系統(tǒng)中創(chuàng)建名為 innovasolutions.payrollsubsystem 的文件夾,并在根目錄放置 sca.subsystem 文件。 清單 23 顯示了 innovasolutions.payrollsubsystem 的 sca.subsystem 文件。 清單 23. innovasolutions.payrollsubsystem 的 sca.subsystem 文件
創(chuàng)建 innovasolutions.webclientsubsystem 在此部分,我們將創(chuàng)建 innovasolutions.webclientsubsystem,此子系統(tǒng)對 innovasolutions.webclient 模塊進(jìn)行配置。首先,在文件系統(tǒng)中創(chuàng)建名為 innovasolutions.webclientsubsystem 的文件夾,并在根目錄放置一個(gè) sca.subsystem 文件。 清單 24 顯示了 innovasolutions.webclientsubsystem 的 sca.subsystem 文件。 清單 24. innovasolutions.webclientsubsystem 的 sca.subsystem 文件
我們已經(jīng)演示了應(yīng)用程序 Innova Solutions 開發(fā)過程,以幫助您使用 SCA 客戶機(jī)和實(shí)現(xiàn)模型利用 Java 編程語言構(gòu)建和集成應(yīng)用程序。SCA 應(yīng)用程序提供了服務(wù)的可移植性、可重用性和靈活性,從而將開發(fā)人員從中間件編程的復(fù)雜性中解放出來。
|