Rational?XDE TM 為最流行的集成開(kāi)發(fā)環(huán)境(IDE)提供了真正的無(wú)縫集成的可視化建模環(huán)境。Rational XDE 不但具有自動(dòng)化生成代碼和代碼/模型的同步的功能,它還具有其他更多的特性來(lái)輔助軟件的開(kāi)發(fā)。為了能夠更好的利用Rational XDE,你需要了解XDE所提供的強大的J2EE模式和代碼模板的能力,你既可以在開(kāi)發(fā)當中應用J2EE模式和代碼模板,也可以自己來(lái)定義和創(chuàng )建他們。本文將向大家展示如何使用Rational XDE 所提供的能力完成一個(gè)簡(jiǎn)單的J2EE項目的開(kāi)發(fā)。 一個(gè)簡(jiǎn)單應用的概述 為了展示如何使用Rational XDE 的獨特能力,我們將實(shí)現一個(gè)簡(jiǎn)單的Web應用的部分功能,這是一個(gè)貸款管理的應用系統,系統允許貸款者與貸款管理員執行一些簡(jiǎn)單的任務(wù)。 貸款者 - 在線(xiàn)支付
- 通過(guò)瀏覽器查看分期付款計劃
貸款管理員 - 為客戶(hù)建立一個(gè)或多個(gè)貸款項目
- 獲取有關(guān)預定還貸的信息
我們假設我們必須利用已有的基礎架構平臺:一個(gè)IBM WebSphere 應用服務(wù)器和幾個(gè)數據庫。 首先我們可以使用Rational XDE提供的自由形式的建模能力來(lái)不受限制的表達有關(guān)方案的方向和思想,比如圖1所示。 這種自由形式的圖給我們提供了顯而易見(jiàn)的好處:他們允許你仍然使用相同的工具,并且使將計劃文檔集成到項目中變的十分容易。 圖1: 自由形式圖更加廣泛的展示了方案的要點(diǎn) 自動(dòng)化分析和設計行為 一旦最初的計劃被完成,我們就可以開(kāi)始進(jìn)行分析與設計工作了。雖然Rational XDE運行在某一軟件開(kāi)發(fā)工具中,但它提供了完成傳統的分析與設計活動(dòng)的所有能力-用例建模,時(shí)序圖等等。實(shí)際上Rational XDE也提供了Rational Unified Process? Configuration for Java Developers (RCJD), RCJD為Java軟件的開(kāi)發(fā)提供了已被證明指南。 圖2顯示了簡(jiǎn)單的貸款管理系統的初始用例模型,此模型是通過(guò)與客戶(hù)的討論以及經(jīng)一步的細化而得到的。 圖2:簡(jiǎn)單的貸款管理系統的用例模型 為了簡(jiǎn)單起見(jiàn),我們將只對其中的一個(gè)用例進(jìn)行描述,以展示Rational XDE在此過(guò)程中的作用。我們選擇"顯示分期付款"這個(gè)用例。最初的時(shí)序圖細化了基本的用例場(chǎng)景,見(jiàn)圖3所示。 圖3:細化了顯示分期付款用例的基本流程的時(shí)序圖 顯然,這是一個(gè)高層次上的交互視圖,并沒(méi)有涉及到任何系統內部的工作的細節。Rational Unified Process 建議使用分析級別的類(lèi)來(lái)提供更加細節的內容。見(jiàn)圖4。 圖4:顯示分期貸款用例的細化了的主流程 如何更加精確的描述這個(gè)圖所表達的內容已經(jīng)超出了本文的范圍,你可以從文章最后所列的前三個(gè)資源引用中得到更詳細的信息。注意在例子中,我們選擇了將邊緣類(lèi)劃分為兩個(gè)頁(yè)面。一個(gè)更為簡(jiǎn)單的做法是通過(guò)單一的元素來(lái)接受所有的邊緣交互。 使用自定義模式創(chuàng )建模型 你可能對象"四人組"(Gang of Four)這樣的設計模式有一定的了解。這些已經(jīng)定義好的模式在Rational XDE中是被支持的,我們將在本文的后面部分展示某些模式的用法。Rational XDE更進(jìn)一步的支持了模式,它提供了通過(guò)UML來(lái)簡(jiǎn)化定義你自己的模式的能力。這種自定義模式的能力不但允許你實(shí)現自己的設計,而且可以自動(dòng)化一些在建模過(guò)程中枯燥乏味的工作,比如產(chǎn)生多個(gè)用例流程圖。典型的情況下用例擁有不止一個(gè)事件流。例如顯示分期貸款用例擁有至少兩個(gè)事件流:一個(gè)是成功存檔的場(chǎng)景,另一個(gè)是當盡力的獲取貸款詳細信息時(shí)操作失敗的場(chǎng)景。圖5 顯示了一個(gè)自定義的模式(UCArtifacts),它將為我們產(chǎn)生一個(gè)主事件流(成功),和兩個(gè)失敗的事件流。 圖5:自定義模式(UCArtifacts)自動(dòng)化產(chǎn)生用例的事件流程圖 這個(gè)簡(jiǎn)單的模式包含了兩個(gè)輸入參數:ausecase作為用例模型元素的輸入,anactor作為角色模型元素的輸入。模式用輸入參數的名字創(chuàng )建對象,用例的名字被加到Boundary, Control, or Entity名字中。這些對象被用于定義主事件流圖和兩個(gè)可選的事件流圖的時(shí)序圖的框架,這種定義是基于XDE所提供的標準的UML圖的。為用例創(chuàng )建時(shí)序圖是十分簡(jiǎn)單的,你可以通過(guò)在模型瀏覽器中拖/放相關(guān)的對象來(lái)完成創(chuàng )建時(shí)序圖的工作。兩個(gè)可選事件流的每一個(gè)都可以使用模式創(chuàng )建的角色、任何的邊緣(boundary)對象、控制(control)對象和實(shí)體(entity)對象。我們能夠通過(guò)在不同的對象之間畫(huà)被需要的消息和刪除任何沒(méi)有參與事件流的分析對象來(lái)完成用例圖。 實(shí)現設計 圖6:"顯示分期貸款"用例的初始類(lèi)圖 圖6顯示了"顯示分期貸款"用例初始的類(lèi)圖。 這個(gè)圖顯示了實(shí)現關(guān)鍵需求的基本角色,但并沒(méi)有考慮到其他用例實(shí)現當中用到的類(lèi)。為了實(shí)現統一的分析建模,我們需要用相同的方法分析其他的用例,然后將結果進(jìn)行合并。在這個(gè)階段,我們主要的目標是識別和排除重復的類(lèi),并且將相似和重疊的功能合并到同一個(gè)類(lèi)中。例如,我們可以將Amortization 和MakePaymentControl進(jìn)行合并成為一個(gè)單獨的控制對象,這個(gè)控制對象能夠處理多個(gè)用例。這里我們重點(diǎn)講述了"顯示分期貸款"用例,但并沒(méi)有顯示全部的用例操作。你可以通過(guò)本文最后參考資源部分的前三個(gè)獲取更多的關(guān)于用例的知識。 J2EE實(shí)現方案 到此為止我們所討論的幾乎是與具體的實(shí)現技術(shù)無(wú)關(guān)的?,F在讓我們來(lái)看一下本文之前所講述的XDE的能力是如何被應用到J2EE的開(kāi)發(fā)當中的。通常情況下,我們上面所討論的分析類(lèi)將被映射為以下的J2EE技術(shù): 邊緣對象(Boundary) - HTML
- JavaServer Page(JSP)
控制對象(Control) - Servlets
- Session Beans
- Message Driven Beans
實(shí)體對象(Entity) 對于在開(kāi)發(fā)你的應用系統時(shí)選擇正確合理的J2EE技術(shù),這只是一個(gè)開(kāi)始點(diǎn)。因為不同的技術(shù)可以被用來(lái)實(shí)現相似的方案,最合理的選擇取決于你的實(shí)現細節和系統的需求。 當然,Rational XDE J2EE模式最酷的部分是每一種模式都被XDE完全的實(shí)現了。你所要做的就是為你的應用提供業(yè)務(wù)邏輯。在這部分,我們來(lái)了解一下為了使用Front Controller模式,你所需要知道的具體細節。 建立請求與用例之間的關(guān)系 一個(gè)請求(例如,一個(gè)表單的提交)必須能夠被簡(jiǎn)單的指定給一個(gè)特定的用例。在我們討論的Front Controller模式的實(shí)現中,這個(gè)信息應該通過(guò)表單中的隱藏域來(lái)傳達,用例的名字應該在創(chuàng )建表單時(shí)被設置。當表單被提交時(shí),控制器簡(jiǎn)單的解析參數以決定哪一個(gè)用例應該被調用。當請求沒(méi)有被明確的指定某一用例時(shí),通常一個(gè)缺省的用例功能被設置用來(lái)處理該請求(見(jiàn)下面)。 <FORM Name="Form" METHOD="GET" ACTION="Controller"> <p align="left"> <b><i><u>Show Amortization</u></i></b> </p> <p> Enter the following information about the loan: </p> <p> Principal <input type="text" name="principal" size="8" value="250000"> dollars </p> <p> Rate <input type="text" name="rate" size="8" value="10.0"> % </p> <p> Duration <input type="text" name="termInYears" size="3" value="30"> years </p> <input type="hidden" name="UseCase" value="ShowAmortization"> <p> <input ID="IDCancel" Name="Cancel" Type="reset" Value="Cancel"> <input ID="IDOK" Name="OK" Type="submit" Value="OK"> </p></FORM>
|
通過(guò)控制器(Controller)處理請求 對于控制器來(lái)說(shuō)不需要任何的實(shí)現工作,模式的實(shí)現會(huì )根據所需邏輯抽取隱藏的參數,請求相關(guān)的helper bean,并且委托helper bean完成處理工作。圖7 顯示了頁(yè)面與控制器之間的靜態(tài)關(guān)系。完整的自動(dòng)產(chǎn)生的請求處理代碼,見(jiàn)圖7下方的代碼清單。 圖 7:表單和控制器間的關(guān)系 // Check if we have a use case name passed on the URL. String useCase = httpRequest.getParameter("UseCase"); IHelper ihelper = null; if (useCase != null) { // Dynamically instantiate a helper and call it. ihelper = (IHelper)theHelperFactory.create(useCase); if (ihelper == null) ihelper = (IHelper)theHelperFactory.createDefaultHelper(); } else { ihelper = (IHelper)theHelperFactory.createDefaultHelper(); } ihelper.processRequest(httpRequest, httpResponse);
|
建立用例和Helper Bean之間的映射關(guān)系 你能夠在設計時(shí)通過(guò)在HelperFactory的構造函數中添加映射信息來(lái)建立用例和Helper Bean之間的映射關(guān)系。對于"顯示分期貸款"用例和"設置貸款"用例來(lái)說(shuō)映射是簡(jiǎn)單的,請看下面的代碼片斷。 這段代碼僅僅需要在設計時(shí)被放置到HelperFactory構造函數的適當的、預先定義好的位置上。 // establish ShowAmortization use case mapping to its helper classusecasename = "ShowAmortization";classname = "ShowAmortizationHelper";addMap(usecasename, classname);// establish SetupLoan use case mapping to its respective helper classusecasename = "SetupLoan";classname = "SetupLoanHelper";addMap(usecasename, classname);
|
Helper Bean的實(shí)現 很明顯,這個(gè)場(chǎng)景下helper Bean的實(shí)現對于不同的用例來(lái)說(shuō)是應該是不同的。一般而言,一個(gè)helper Bean通常需要從請求中、被收集到的等價(jià)的額外信息中和其他參與者(例如:會(huì )話(huà)bean和實(shí)體bean)中提取適當的表單參數,然后,最終產(chǎn)生可以用于顯示的處理結果。 這個(gè)處理過(guò)程的部分例子見(jiàn)下面清單。注意XDE模式引擎完全消除了手工創(chuàng )建helper類(lèi)的需要。你需要做的只是在向導中簡(jiǎn)單的所選擇"Generated Value"選項,并且輸入helper類(lèi)的名字。圖8顯示了這個(gè)向導的截圖。 // extract the info from the request parameter String sPrincipal = httpRequest.getParameter("principal");…..// locate the amortization EJB using the service locator…...// call the remote method on the session beanfloat totalInterest = theRemote.amortize(principal, rate, termInYears); // put data in the AmortValueBean AmortValueBean avb = new AmortValueBean();avb.setPrincipal(principal);…..// set the session attributehttpRequest.getSession().setAttribute("avb", avb);
|
圖8: 自動(dòng)產(chǎn)生基本的Helper Bean 顯示結果 這里再一次強調,有不同的方法可以完成相同的工作。典型的情況下,數據對于JSP來(lái)說(shuō)應該是可得到的,JSP將負責數據的顯示格式。圖9 顯示了這種靜態(tài)的關(guān)系。對于此方法,JSP源代碼顯示在圖9 的下面。 圖9 :JSP與被格式化/顯示的數據之間的關(guān)系 extracts data from the ‘a(chǎn)vb‘ bean instance and formats/displays it<jsp:useBean class="AmortValueBean" id="avb" scope="session"/><b>Results of your loan amortization request: <br>Pricipal entered: <%= avb.getPrincipal() %><br>YY.Total Payments: <%= avb.getTotalPayments() %><br></b> <p><a HREF="MainLoan.html">Back to Main Page</a>
|
代碼模板(Code Templates) 代碼模板是另一個(gè)Rational XDE提供的用于簡(jiǎn)化開(kāi)發(fā)人員開(kāi)發(fā)工作的能力。他們?yōu)橐韵路矫嫣峁┓浅S行У臋C制: - 代碼片斷和算法的重用
- 對特定問(wèn)題實(shí)現基于代碼共享的一致性的解決方案以
- 創(chuàng )建標準的頭信息和注釋
Rational XDE 對代碼模板提供了實(shí)質(zhì)性的支持。除了可擴展的、內建的基礎結構外,它還提供了以下的能力: - 綁定一個(gè)或多個(gè)代碼模板到一個(gè)方法
- 根據需要去除一個(gè)代碼模板的綁定
- 重新安排綁定順序以滿(mǎn)足代碼產(chǎn)生的需要
- 參數化代碼模板
在我們的例子中,你能夠創(chuàng )建一個(gè)代碼模板以建立用例和helper類(lèi)的映射。然后你可以將代碼模板多次綁定到構造函數,并且為代碼模板簡(jiǎn)單的提供不同的缺省值以自定義代碼的生成。 圖10顯示了這樣的一個(gè)例子。 圖10:建立用例和Helper Bean映射的代碼模板 代碼模板也可以作為自定義模式的一部分來(lái)使用,因此你就可以使用Rational XDE創(chuàng )建更加有擴展性的應用框架。實(shí)際上,Rational XDE 內部也使用了代碼模板和模式的 能力來(lái)實(shí)現產(chǎn)品的其他各種能力。例如, getters and setters相關(guān)代碼的產(chǎn)生,設計模式的實(shí)現等等,都用到了代碼模板的能力。 端對端的場(chǎng)景 對于本文的簡(jiǎn)單應用我們已經(jīng)函蓋了設計和實(shí)現的具體細節,現在讓我們把這些片斷組合在一起。 接下來(lái)的兩個(gè)時(shí)序圖捕獲了不同對象間端到端的交互,包括來(lái)自于兩個(gè)模式實(shí)現的參與者。 圖11展示了前端的活動(dòng):表單被提交到控制器,控制器獲得helper bean并且要求它來(lái)處理外部的請求。 圖 11:表單被提交并且被控制器處理 圖12 是上一個(gè)時(shí)序圖的繼續。它顯示了helper bean的各種初始化的動(dòng)作,最終請求被轉發(fā)給了負責格式化和顯示計算結果的JSP頁(yè)面,JSP頁(yè)面將結果顯示給最終用戶(hù)。注意在獲取被需要的EJB的過(guò)程中使用了服務(wù)定位器模式。 圖12:Helper Bean執行處理過(guò)程并呈現結果 模式和代碼模板簡(jiǎn)化并加速了J2EE的開(kāi)發(fā) 我希望本文的討論向大家傳達了Rational XDE在J2EE項目中給開(kāi)發(fā)人員帶來(lái)的益處。Rational XDE中的模式和代碼模板給大家提供了一種簡(jiǎn)單的方法來(lái)利用經(jīng)典的解決方案以加速軟件的開(kāi)發(fā)。Rational XDE其他方面的能力-比如自動(dòng)同步和創(chuàng )建自定義模式和代碼模板的能力-將使開(kāi)發(fā)人員從枯燥的、反復的任務(wù)中解放出來(lái)并進(jìn)一步的加速軟件的開(kāi)發(fā)。 參考資料 - Khawar Ahmed 和 Cary Umrysh,所著(zhù)的《使用J2EE和UML開(kāi)發(fā)企業(yè)級Java應用》 Addison-Wesley, 2001.
- Ivar Jacobson, Magnus Christerson, Patrik Jonsson, and Gunnar Overgaard, 《面向對象的軟件工程》Addison-Wesley, 1992.
- 《Rational 統一過(guò)程指南》:分析類(lèi) 部分
- Grady Booch, James Rumbaugh, and Ivar Jacobson, 《統一建模語(yǔ)言用戶(hù)指南》e. Addison-Wesley, 1999.
|