

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
第5章創(chuàng)建servletPAGE97第2章組織代碼VisualAgeforJava使用項目和包來組織你的工作。包是Java用來組織類和接口的標準方式;項目則是VisualAgeforJava特有的一種高層次的組織某個項目開發(fā)成果的方式。本章中,你將要學習如何在VisualAgeforJava中使用項目和包。VisualAgeforJava使用項目和包組織代碼。項目包括了某個開發(fā)者正在工作的所有對象;項目包含了包,包則包含了Java類和接口。項目還可以包括資源。資源不是Java文件,不被看作是應用程序的一部分,我們將在后面的“WorkbenchResources頁”中詳細討論資源。本章中,你將學習使用VisualAgeforJava提供的管理和維護開發(fā)工作的工具。你還要學會導入外部代碼和資源,導出你的工作成果。2.1VisualAgeforJava中的項目當你閱讀本書時,你已經(jīng)創(chuàng)建了一個項目來組織你所有的工作。項目提供了在最高層次上組織你的Java代碼的方式。只要你創(chuàng)建了一個新的包,它必定是存在于于某個現(xiàn)存的或是新的項目中。Java語言本身并沒有任何對象與項目相對應。在VisualAgeforJava3.5中,項目包含了Java包和別的資源。資源是與Java程序相關(guān)的一些文件,通常是Web應用程序的一部分,如圖片、多媒體、JSPs和靜態(tài)HTML文件等。第一次啟動VisualAgeforJava,進入Workbench,你會看到你的工作區(qū)中已經(jīng)有了幾個項目,每一個又包括了幾個包。表2-1列出了這些工程和他們的內(nèi)容。表2-1默認的VisualAgeforJava工程和它們的內(nèi)容項目內(nèi)容IBMJavaImplementationcom.ibm.uvm.*package,它實現(xiàn)并支持VisualAgeforJava虛擬機及其環(huán)境JavaClassLibrariesjava.*和javax.*包,它們包含了JavaClassLibrariesSunClassLibrariesPMWin32Sun.*包,它是對標準java.*包的擴展表2-1中項目的代碼是不能被刪除或修改的,它們是VisualAgeforJava正常運行必不可少的部分。2.1.1添加的特性要開發(fā)數(shù)據(jù)庫應用程序,servlets等程序,你還得添加幾個特性。要添加一個特性,從File菜單中選擇QuickStart或按F2鍵,在QuickStart對話框中選擇Features和AddFeatures,然后單擊OK按鈕。你可以從列表中選擇要添加的特性。運行本書中的范例需要添加WebSphereTestEnvironment,Servlet,IBMJSP例子和DataAccessBeans特性。2.2VisualAgeforJava中的包包是Java用來組織相關(guān)類和接口的容器。包的名字是完全合法類名的一部分。如何將不同的類用包組織起來是一個很重要的問題。你可以在使用完全合法類名和使用導入語句中選擇。VisualAgeforJava在工作區(qū)的類路徑中尋找外部包,類路徑可以在Option對話框中加以更改。2.3Workbench要理解VisualAgeforJava如何組織項目和包,你得多了解一些關(guān)于Workbench的知識。Workbench為當前的開發(fā)環(huán)境(即工作區(qū))提供了不同的視圖。Workbench窗口的布局依賴于窗格上的標簽選擇。要在項目、包、資源、類、接口和AllProblem頁面間轉(zhuǎn)換,只需要單擊相應的標簽。這些頁面的菜單欄也隨著標簽的轉(zhuǎn)換而轉(zhuǎn)換。在任何Workbench頁面中你都可以以兩種不同的方式訪問選定對象(項目、包、資源、類、接口和方法)的菜單:右鍵單擊選定對象,訪問彈出式菜單使用菜單欄Source窗格的彈出式菜單和它在菜單欄上的Edit菜單功能是一樣的,Browse窗格的彈出式菜單和它在菜單欄上的Selected菜單功能相同。Workbench也提供了一個工具欄以快速訪問某項操作,圖2-1顯示了該工具欄,表2-2對工具欄中圖標的功能進行了描述。圖2-1Workbench工具欄createaVersion 生成一個版本ToggleEditionNameCreateField 創(chuàng)建字段〖field〗CreateMethod 創(chuàng)建方法CreateInterface 創(chuàng)建InterfaceCreateApplicatipon 創(chuàng)建應用程序CreateServlet 創(chuàng)建ServletCreateInterface 創(chuàng)建InterfaceCreateApplet 創(chuàng)建AppletCreateclass 創(chuàng)建類AddPackage 添加包AddProject 添加項目Search(hassubmenuwithrightclick) 搜索(單擊右鍵有子菜單)OpenDebugger 啟動調(diào)試器Run(hassubmenuwithrightclick) 運行(單擊右鍵有子菜單)表3.工具欄圖標的功能圖標功能運行運行選定項目或包中的類或是選定的類。單擊右鍵顯示歷史記錄啟動調(diào)試器啟動調(diào)試器搜索搜索對某個字段的聲明或引用添加項目向當前工作區(qū)中添加一個項目添加包向當前選定的項目中中添加一個包創(chuàng)建類激活CreateanewClassSmartGuide創(chuàng)建Applet激活CreateanewAppletSmartGuide創(chuàng)建Interface激活CreateanewInterfaceSmartGuide創(chuàng)建Servlet激活CreateanewServletSmartGuide創(chuàng)建應用程序激活CreateanewApplicationSmartGuide創(chuàng)建方法激活CreateanewMethodSmartGuide創(chuàng)建字段在現(xiàn)存類中激活CreateanewFieldSmartGuideToggleEditionName顯示或隱藏程序元素的版本名版本生成一個版本2.3.1Workbench的Project頁Workbench的Project頁(見圖2-2)包含兩個窗格:瀏覽(Browse)窗格和源(Source)或注釋(Comment)窗格。圖2-2WorkbenchProject頁tabselection 標簽選擇browsepane 瀏覽窗格sourcepane 源窗格statusbar 狀態(tài)欄bookmarks 書簽filters 過濾器默認設置下,窗格是水平放置的,如果要改變放置方向,選擇Windows→FlipOrientation。如果你在瀏覽窗格中選中了一個包含有代碼的程序元素,如類、接口或方法的話,另一個窗格會是Source窗格,其中包含了源代碼。如果你選中的是包或項目的話,另一個窗格會是Comment窗格,其中包含了你添加到包或項目中的注釋。當你選擇Projects,Packages,Classes,Interface視圖時,你的工作區(qū)中載入的項目、包、類和接口會以目錄樹的方式顯示在Browse窗格中。第一次打開Workbench時,默認出現(xiàn)的是Project視圖。要展開或折疊列表上的任何對象,請單擊該對象左邊的“+”或“-”。要在Source窗格中顯示某個對象的代碼,選定該對象就可以了。你可以在任何瀏覽窗口中選擇Selected→Add→Project創(chuàng)建新項目。VisualAgeforJava提供的其它一些功能VisualAgeforJava提供了許多有用的功能來查看項目的不同部分。下面列出常用的四個功能:在Projects頁中設置書簽,只要單擊Browse窗格右上方的“+”就可以了。要回到特定的代碼,你可以單擊設置標簽時出現(xiàn)的數(shù)字。使用過濾器可以只顯示公共變量和靜態(tài)變量中的一種,或顯示所有變量。復制VisualAgeforJava中任何的窗口。選擇Window→Clone會打開一個環(huán)境與舊窗口相同的新窗口。當需要兩個類似的窗口時,復制窗口是很有用的。但它也會帶來問題,當你在兩個窗口中修改同一個類的時候,在一個窗口中所做的改動有可能被另一個窗口的改動所覆蓋。雙擊任何窗格的標題欄會使該窗格在窗口中最大化。再次雙擊則會將其恢復為普通的視圖。你也可以通過選擇Window→MaximizePane/RestorePane實現(xiàn)相同的功能。2.3.2Workbench的Packages視圖Workbench的Packages頁(見圖2-3)包含了三個Browse窗格-AllPackages、Types和Methods和一個Source窗格。圖2-3WorkbenchPackagepagepackageaccount;publicclassBankAccount{privatestringaccountId;privatedoublebalance;}你可以導入一個包中所有的類型或根據(jù)需要選擇導入的對象。請注意,導入一個包時并不會導入它的子包,你必須將它們分別導入。你可以使用星號(java.awt.*)導入包中的所有類型,但是你必須分別導入任何子包,如java.awt.event。如果在創(chuàng)建類的時候已經(jīng)知道它會用到的包,你應該使用Attributes對話框(要進入該對話框,你可以在CreateClass或InterfaceSmartGuide中單擊Next按鈕)。Attributes對話框指定要導入的包,單擊AddClass和AddPackage按鈕來瀏覽并選擇要導入到你的類中的包和類(見圖2-4)。圖2-4CreateClassSmartGuide:Importstatement對話框2.3.3Workbench的Resources頁WorkbenchResources頁(見圖2-5)顯示了項目中所有的資源。你還可以添加或清除與你的項目相關(guān)的資源或目錄結(jié)構(gòu)。圖中顯示了幾個與該項目有關(guān)的JSP和SQLJ文件。要添加或移去資源文件,單擊右鍵在彈出的菜單中選擇Add或delete。要編輯某個文件,雙擊該文件或使用open菜單項。VisualAgeforJava使用關(guān)聯(lián)應用程序打開資源文件。資源文件通常保存在VisualAgeforJava安裝目錄下的project_resources子目錄中,而不是拷貝到知識庫中。當你對包含該資源的項目賦予版本時,資源文件就會存放在知識庫文件中。圖2-5WorkbenchResources頁2.3.4Workbench的Class頁Workbench的Class頁(見圖2-6)包括三個窗格:ClassHierarchy窗格、Methods窗格和Sources窗格。圖2-6WorkbenchClass頁通過菜單欄上的Class→Layout或ClassHierarchy窗格右上方的layout圖標,你可以改變類的布局。你也可以通過Window→FlipOrientation來選擇Browse窗格的定向。單擊Member窗格右上角的RootMinusOne圖標可以顯示類的繼承成員。類視圖顯示了類型的類繼承關(guān)系,你可以快速查詢類的繼承樹。在類視圖中選擇Classes→GoToClass,然后輸入類名直到類的全名出現(xiàn)在列表中,你就能快速找到需要的類。導向輔助功能GoToClass功能只是Workbench提供的許多導航輔助功能中的一個,下面是另外常用的幾個:每個窗口都有不同的GoTo選項。每個窗口都有Opento菜單項,它會在選定瀏覽器中打開選定的內(nèi)容。每個窗口都有Clone功能,你可以對同樣的信息有兩種視圖。通過Workspace→Search,你可以搜索不同的內(nèi)容。通過Selected→ReferencesTo,你可以搜索引用到了某個選定類型的所有代碼2.3.5WorkbenchInterface頁除了一個顯示接口,一個顯示類以外,Workbench的Interface頁(見圖2-7)與Class頁(見圖2-6)很相似。Interface頁包含三個窗格:Interfaces,Methods和Source。圖2-7WorkbenchInterface頁2.3.6Workbench的AllProblems頁你可以在AllProblems頁中找到工作區(qū)中所有的錯誤代碼。如果某個方法中有錯誤代碼的話,該方法會用紅色的“X”標記出來,該方法所屬的類會用灰色的“X”標記(見圖2-8)。如果在類聲明和接口聲明中有錯誤代碼的話,該類或聲明會用紅色的“X”標記出來。圖2-8Workbench的AllProblems頁要是你知道某個問題的存在但暫時不想管它,你可以將它們?yōu)V掉。你可以有三種方法使用過濾器:選擇Showallproblems顯示所有問題。選擇Excludedeprecatedwarnings隱藏不想理會的警告。選擇Showonlyerrors隱藏所有的警告。使用工作集(workingsets)指定項目,你可以縮小搜索范圍。要使用工作集,請選擇FilterProblems→WorkingSet…,在出現(xiàn)的workingset對話框中選定要包括的項目。你目前的VisualAgeforJava環(huán)境中應該不會有錯誤,你可以生成一個錯誤來看看它的結(jié)果:(1)選中Workbench上的Project標簽。(2)展開HiThere類,選擇main(string[])方法。(3)在后大括號“}”前加入一行:x=2;保存該方法(Edit→Save或^S)。圖2-9顯示了你試圖保存生成的錯誤代碼時出現(xiàn)的警告對話框。你可以選擇Cancel,回到代碼中修改錯誤,或是保存錯誤的代碼。如果VisualAgeforJava能提出更正建議的話,它會將其顯示在下方的窗格中。你可以從各項建議中選擇一個,單擊Correct按鈕更正代碼。單擊警告對話框中的Save按鈕。圖2-9Warning對話框:未定義變量選擇Workbench上的AllProblem標簽(未顯示),選擇main方法,刪除x=2;行,保存方法,錯誤警告應該已經(jīng)消失了。大多數(shù)情況下,你輸入了錯誤代碼時會出現(xiàn)圖2-9所示W(wǎng)arning對話框。但在某些情況下,當VisualAgeforJava編譯器不能分析出代碼的錯誤時,你會看到Error對話框。這時,你必須回去修改代碼,否則錯誤代碼不能被保存。如果VisualAgeforJava能提出更正建議的話,它會在下方窗格中顯示出來。留下錯誤的代碼留下錯誤的代碼?這似乎有點奇怪。但在VisualAgeforJava中,它不會有太大風險。比如說,你在引用一個變量前沒有定義它,你可以保存引用該變量的代碼,以后再進入AllProblems頁,在類聲明中添加這個變量。在最壞的情況下,你有可能不知道如何修改錯誤,那么你可以回到該代碼的較早版本。2.4全源代碼編輯SourceView窗口提供了全源代碼編輯功能。這是為那些偏好編輯類的整個源文件而不是單獨的方法的開發(fā)者準備的。要在Workbench中使用SourceView,請選擇OpenSourceView菜單項。你也可以在類瀏覽器中使用全源代碼編輯,只要在類瀏覽器中單擊Source標簽就可以了。SourceView不是Workbench的一部分,而是一個獨立的窗口(見圖2-10)。SourceView瀏覽器由三個窗格組成:Elements,Source和Problems。圖2-10SourceView窗口Source窗格顯示所有的源代碼。點擊Elements窗格中相應的條目,你可以跳轉(zhuǎn)到任何方法或定義語句。方法的排列秩序在第一次導入時就確定了,但也可以在SourceView窗口中更改。導出類的時候,該秩序保持不變。VisualAgeforJava不會更改諸如換行和縮進之類的文件格式。SourceView只有一個窗口。每個類都在該視圖中有一個頁面,通過標簽,你可以同時修改多個類。你也可以在SourceView窗口和其它視圖中并行編輯某個類。2.5CodeAssists在編輯代碼時,VisualAgeforJavaCodeAssists可以幫助輸入代碼。它會分析你的輸入,然后將后面可能的輸入列表。要顯示該列表,按^Space鍵(見圖2-11)。圖2-11CodeAssist窗口2.6在VisualAgeforJava中導入或?qū)С瞿阋呀?jīng)了解到VisualAgeforJavaProfessionalEdition將項目儲存在知識庫中,而不是文件系統(tǒng)的目錄中。如果要應用你的Java項目,或是與別的開發(fā)人員共享代碼,你必須導入和導出Java類。向VisualAgeforJava環(huán)境中導入,導出類和資源有以下幾種方式:1.目錄你可以向文件系統(tǒng)中導入Java資源或類。導入的源代碼會被即時地編譯,包繼承關(guān)系也會保持下來。當你要與別的開發(fā)人員共享Java代碼,但你們的使用開發(fā)環(huán)境可能不同,或他使用的不是VisualAgeforJava提供的編輯器,那么你必須導出源代碼。如果指定某個路徑作為包,你可以導入該包中所有的子包。該功能也可以導入該目錄下的資源。要導入資源,單擊Resource復選框旁邊的Details按鈕,選擇你要導入的資源。2.JAR文件Java存檔(JAR)是一個與平臺無關(guān)的文件格式,它允許將一個Javaapplet和它的資源文件(如.class文件,圖片和聲音)包括到單個文件中。JAR文件是分發(fā)Javaapplet,Java應用程序及其相關(guān)資源文件的好辦法。該文件可以放在Web服務器中供瀏覽器訪問。你甚至可以將整個VisualAgeforJava項目都導出為一個JAR文件。3.知識庫(被當作VisualAgeforJava交換文件)知識庫文件可以被用來交換不同的VisualAgeforJavaProfessional環(huán)境中創(chuàng)建的Java類。這些文件保存了版本信息、注釋和可視化開發(fā)信息。導入某個知識庫文件時,它被載入到你的知識庫中。你需要將它從知識庫裝載到工作區(qū)中。如果你想讓它自動裝載到工作區(qū),請在Repositoryimport對話框中選中該選項。這種方法只能將知識庫載入最近用到的項目,某些時候,你可能要手工載入。從知識庫文件中導出的程序元素必須首先標記一個版本,版本和知識庫將在后面的“Workspaceversusrepository”部分詳細解釋。2.6.1向VisualAgeforJava中導入請注意:向VisualAgeforJava環(huán)境中導入代碼與在Java源代碼中使用import關(guān)鍵字不同。向VisualAgeforJava中導入代碼應采取以下步驟:(1)打開Import對話框,在下列的方法中選擇一個-File→Import,從任何頁的菜單欄中-Selected→Import,從Projects頁的菜單欄中-Package/Types→Import,從Package頁的菜單欄中-Class→Import,從Classes頁的菜單欄中-Interface→Import,從Interface頁的菜單欄中彈出一個SmartGuide窗口要求指定導入的源(見圖2-12)圖2-12向VisualAgeforJava中導入Java文件(2)選定導入的源:-Directory-.java或.class文件-Jarfiles-.jar文件-Repository-repository(知識庫)文件要導入目錄和Jar文件,請選擇:-導入文件的存放路徑-要導入的文件(源文件或字節(jié)碼文件)和資源-導入類的項目-是否覆蓋已存在的文件要導入知識庫,請選擇:-要導入的知識庫文件-導入知識庫的項目或包(見圖2-13)圖2-13從另一個知識庫中導入除普通的導入/導出選項外,你還可以使用一個可以容納一組項目的容器-解決方案。解決方案可以被用來成組地導入/導出互相關(guān)聯(lián)的多個項目,比如說,你提供給某個客戶的一批項目。解決方案和知識庫將在后面的“導入和導出的效果”部分中討論。本章著重于介紹導入/導出的工具,以及它們?nèi)绾螐?向JAR文件和目錄中導入/導出。2.6.2從VisualAgeforJava中導出從VisualAgeforJava中導出代碼應采取以下步驟:(1)選擇一個或多個項目、包、類或接口。-選擇包的時,該包中所有的類和接口都被導出。-選擇項目時,該項目中所有的類和包都被導出。(2)打開Export對話框(見圖2-14),你可以采用以下幾種方法:-File→Export,從任何頁的菜單欄中-Selected→Export,從project頁的菜單欄中-Packages/Types→Export,從Package頁的菜單欄中-Class→Export,從Class頁的菜單欄中-Interface→Export,從Interface頁的菜單欄中圖2-14ExportSmartGuide頁要生成或更新一個清單文件來包含類或bean的信息,請指定該清單文件的文件名。(3)選擇導出路徑:-Directory-.java或.class文件-JarFile-.jar文件-Repository-知識庫文件如果你選擇導出到Directory,請繼續(xù)選擇:-導出文件存放的根目錄-要導出的類(源代碼或字節(jié)碼)和資源-你還可以設置以下選項:導出被引用的類不導出BeanInfo和PropertyEditor類是否生成運行applet所需的HTML文件是否覆蓋現(xiàn)存文件是否在瀏覽器中瀏覽生成的HTML文件是否封閉該包(sealthepackage)每一個包都可以被封裝,封裝的信息將會記錄在JAR文件的清單文件中。如果你選擇導出到Jar文件(見圖2-15),除了導出到Directory的選項外,你還要選擇:圖2-15導出到Jar文件-要導出的bean或類-是否壓縮Jar文件如果你選擇導出到知識庫,請繼續(xù)選擇:-被導出的知識庫文件-被導出的項目或類有關(guān)導出代碼的提示VisualAgeforJava為導出代碼提供了一些有用的新特性。選擇Selectreferencedtypesandresources按鈕,你可以啟動DeploymentWizard。它自動包含了你的代碼需要的類型,這樣,你導出的Jar文件可以只包含你需要的代碼。導出Jar文件時可以選擇要導出的bean,這要求你的Jar文件必須有一個清單文件。清單文件使別的開發(fā)工具知道Jar文件中的bean,它還讓別的VisualAgeforJava環(huán)境自動將Jar文件中的bean添加到調(diào)色板中。如果一個JAR文件會被Java應用程序或applet直接從類路徑中使用,請不要對它進行壓縮。你還可以導出Java資源文件和類文件中的VisualCompositionEditor信息,這需要選中options對話框中的DesignTime部分的Generatemetadatamethod復選框。VisualAgeforJava會生成一個getBuilderdata方法,它包含了該類的VisualBuilder信息。第3章移植到Java2VisualAgeforJavaVersion3.5ProfessionEdition提供了完整的Java2SDKStandardEditionV1.2.2支持。它包括:JDK1.2.2IBMDeveloperKitforJava的代碼建立在SUN代碼的基礎上。IBM在對它的要求是:更高的性能、縮短的開發(fā)周期以及更強的可伸縮性。相比SUN提供的SDK,IBMJDK1.2.2提供了一些增強的功能,且便于維護。Swing1.1JSDK2.1+IBMExtensionJSDK2.1支持創(chuàng)建、測試Servlet2.1和測試JSP0.91或1.0(WebSphereApplicationServer+FIXPACK2支持JSP1.1,但VisualAgeforJava3.5+Patch2不支持)。3.1Fix/MigrateSmartGuideVisualAgeforJavaVersion3.5提供了Fix/MigrateSmartGuide,它使JDK1.1.x下的基本Java類和Swing類可以方便地向JDK1.2.2環(huán)境移植。它也可移植Swing類中的VisualComposition信息。所有的包或類名都可以被移植,如com.sun.java.swing.*==>javax.swing.*。你可以從VisualAgeforJavaVersion2或3中導入代碼。Migrate工具只能移植帶有版本號的代碼,請不要試圖移植沒有設置版本的代碼。選擇你要移植的類。要啟動Fix/MigrateSmartGuide,在Workbench窗口的菜單欄中選擇Selected→Reorganize→Fix/Migrate(見圖3-1)。Fix/MigrateSmartGuide窗口打開后,你可以在From/to條目中指出已改變的類或包的名字(見圖3-2)。選中IncludeJDK1.2renamedpackages檢驗欄以移植Java應用程序中的Swing類。單擊Next按鈕。在接下來的窗口中指定不需要改變包名的包(見圖3-3)。要指定一個包,請在包名后加上.*后綴。比如說,要調(diào)整myPackage包中所有的類,請輸入myPackage.*到To字段中,為被改名的類或包鍵入更改后的名字,單擊Add。圖3-1如何啟動Fix/MigrateSmartGuide圖3-2Fix/MigrateSmartGuide窗口圖3-3Fix/MigrateSmartGuide-Excludedpackages單擊Finish按鈕開始移植。你可以打開VisualCompositionEditor進行測試。3.2修理過程Fix/MigrateSmartGuide也可以修復在類向Java2SDK移植時或?qū)τ脩舳x的程序元素的重命名過程中損壞的類或包引用。由于這種修復不可能很精確,請在修復時遵循下列提示以獲得最好的修復效果。到Workbench的AllProblems頁查看損壞的引用,如果可能,最好在類這一級別上修復引用。這提供了對類修復次序的最大控制,減少了編譯錯誤。如果你必須要在包或類級別上修復的話,VisualAge會先處理Beaninfo類,然后才是關(guān)聯(lián)的bean類。優(yōu)先修復引用到的類,這樣可以保證當別的類要引用到它的時候,擁有更新過API的被引用的程序元素可用。如果某個類有關(guān)聯(lián)的Beaninfo類,先修復Beaninfo類。在所有的類都被修復以后,要修理可視化部件中存在的錯誤,你可以在VisualCompositionEdition中打開該部件,從Bean菜單中重新生成代碼。要把IBMDataAccessLibrariesVersion1.0中的引用移植到Version2.0中,請指定以下更改:COM.ibm.ivj.eab.data.*→com.ibm.ivj.eab.dab.*COM.ibm.ivj.javabeans.*→com.ibm.ivj.eab.dab.*要將引用移植到javax.swing.preview.JGileChooser.class,請指定以下更改:javax.swing.priview.*→javax.swing.*即使所有類引用向JavaSDK的移植都是成功的,它也不能保證所有的bean都按你的設想運行。Sun公司對某些bean的實現(xiàn)方法可能會有改變,請仔細的測試移植的bean。即使你是手工修復,你也必須通過該工具修復可視化組件。這是因為元數(shù)據(jù)(metadata)必須被修復,否則VisualAge可能會產(chǎn)生錯誤的代碼。VisualAge可以修復對下列程序元素的引用:類、接口和包:超類標示導入標示用戶自定義的字段和方法為可視化部件生成的字段和方法如果VisualAge在修理過程中遇到任何過渡性的錯誤,會彈出一個error窗口。你可以記下該錯誤,單擊OK按鈕繼續(xù)修復。大多數(shù)情況下,這些錯誤是由引用被修復的順序產(chǎn)生的,它們通常在所有的引用都被修復后就消失了。按照前面所示的提示來修復錯誤將會減少這類問題的發(fā)生。3.3移植你的Servlet和JSP如果你要將你的servlet升級到JSDK2.1(WebSphereApplicationServer3.0以后的版本對JSDK2.1提供了支持),你將需要升級下列已不被推薦使用的API。它們在不久的將來會被取消。SunAPIsHttpSessionContextHttpSession.getSessionContextHttpSession.isRequestedSessionIdFromUrlHttpServletResponse.encodeUrlHttpServletResponse.encodeRedirectUrlHttpServiceRequest.setAttributeHttpServiceResponse.callPageServletRequest.getRealPathServletContext.getServletIBMAPIscom.ibm.servlet.personalization.sam(removed)com.ibm.servlet.servlets.personalization.util(removed)com.ibm.servlet.connmgr如果你的JSP版本為JSP0.91,你應該將它升級到JSP1.0。目前還能使用0.91版,但將來則不一定。在升級前,確定你的代碼沒有使用不被推薦使用的API。如果你的代碼使用了com.sun.server.http.HttpServerRequest或com.sun.server.http.HttpServiceResponse,請將包名改為javax.servlet。將JSP0.91移植到1.0要移植你的JSP,請更改表3-1所示標簽。表3-1JSP轉(zhuǎn)換映射表JSP0.91JSP1.0<SERVLET><jsp:include><BEAN><jsp:useBean><REPEAT><tsx:repeat>第4章開始ATM項目本章介紹的范例程序?qū)⒁诒緯院蟮乃姓鹿?jié)使用。它概括了問題域,還展示了VisualAgeforJava解決方案整個的體系結(jié)構(gòu)。在問題域中還包含了面向?qū)ο蟮姆治?。對于那些讀過本書的舊版《ProgrammingwithVisualAgeforJava,Version2,0120212989》或IBM紅皮書《VisualAgeforJavaEnterpriseVersion2:DataAccessBeans–Servlets–CICSConnector,SG24-5256》的讀者,該范例程序看起來會很熟悉。但是請注意,這些程序的目標雖然是一致的,但采取的解決方案卻不同。本書著重于將它以Web應用程序的方式實現(xiàn),而Web應用程序的客戶端本質(zhì)上是無狀態(tài)的。4.1問題域本書將創(chuàng)建一個真正的Web應用程序,并以此來介紹VisualAgeforJava的豐富的特性,在程序創(chuàng)建過程中,我們將會應用到這些特性。首先,我們來介紹該程序要解決的問題。簡而言之,該程序?qū)⒛M用戶與ATM機(銀行設在鬧市區(qū)的自動取款機)的交互。對于ATM機,世界各個國家對它有不同的稱呼,但其基本原理都是一樣的:插入你的卡,輸入一串數(shù)字,選擇取款的數(shù)目,拿到錢,最后取出你的卡。不同的ATM機會在許多地方存在差別。一個差別就是這個金融業(yè)務在何時以及如何被記賬:許多時候它被直接從銀行帳戶中扣除,另外一些時候則把它看作是一次貸款。在上面的例子中,那些卡分別被稱為記帳卡或信用卡。當前,許多ATM機都可以處理兩種交易,不過本書只考慮記賬卡。相應的,當本書中提到卡的時候,你應該把它看作是記帳卡?,F(xiàn)實中的ATM機還可以提供別的很多服務:顯示銀行帳號的余額和歷史記錄,匯款,向電子錢包中存錢,申請短期貸款等。本書中討論的ATM機只能進行取款和顯示銀行帳號的一些情況。為了進一步地簡化問題,我們認為每張卡都與一個或多個銀行賬戶相關(guān)聯(lián)。除了存取金錢以外,一張卡應該還可以查詢關(guān)聯(lián)帳戶的余額和歷史交易記錄,取到的錢被直接從關(guān)聯(lián)的銀行帳戶扣除。在許多國家,一張卡可以與多個不同的銀行帳戶關(guān)聯(lián):一個人的帳戶通常只能使用一張卡訪問,但是,不同人擁有的多個帳戶也可以使用一張卡控制。另外,一個銀行帳戶本身可以與多張卡關(guān)聯(lián),如現(xiàn)實中的一個公司帳戶,公司中許多人都有一張可以從該帳戶中取錢的卡,整個公司共享這個帳戶。該范例程序并不理會帳戶的擁有者,它只是簡單地允許一張卡到多個帳戶,和一個帳戶到多張卡的關(guān)聯(lián),以滿足前述的情況。但該程序中的卡必須有一個擁有者?,F(xiàn)在我們將解釋“交易”的含義。本書認為交易發(fā)生在兩個帳戶之間:源帳戶中減少的金額與目標帳戶中增加的金額相等,且都等于交易指定的錢的數(shù)目。當交易涉及到收集現(xiàn)錢時,目標帳戶應該是與ATM機關(guān)聯(lián)的一個銀行帳戶。要向電子錢包中加款,必須要有一個虛擬的目的銀行帳號以表示該電子錢包是交易的實際目標。本書還規(guī)定交易的數(shù)額不能為負。每次存款,取款都被看作是一次交易。下面我們要區(qū)分支票帳戶(checkingaccout)和儲蓄帳戶(savingaccount)。一個支票帳戶帳戶可以允許有一定的透支限額,也就是說可以從帳戶中取出超出余額的錢,使帳戶中余額為負,當然,能超出的范圍有限。請注意,雖然它適用于其余的許多國家,但美國的支票帳戶體制不是這樣的。儲蓄帳戶也有一個特性:他的帳戶余額不能低于某個正的最小值。在本書的ATM機中,你既可以從支票帳戶也可以從儲蓄帳戶中取款,這并不適用于大多數(shù)的歐洲國家。另一個對現(xiàn)實的很大簡化是該程序忽略了零錢和匯率的問題:它考慮到了錢的數(shù)量,但不指定它的幣種,只是簡單地稱之為錢。該程序在許多方面還是類似于現(xiàn)實中的應用的。想象以下場景:一個“cyber”ATM(Internet上的Web站點),它允許用戶通過Internet用記帳卡上的錢給一個電子錢包加款。要完成這個目標,你還需要一個讀卡機和一個能給你的電子錢包加款的機器,他們必須都連到一臺Internet上的計算機上。當前的智能卡技術(shù)已使記帳卡和電子錢包合而為一,你就只需要一個智能卡讀卡機就夠了,當然,你還需要一臺電腦。這已經(jīng)在一些國家(如匈牙利)投入實際應用了。我們還會創(chuàng)建一個基于Swing的應用程序來解決同樣的問題,它將被用來展示如何使用VisualAgeforJava的圖形化編輯器(見第七章,“創(chuàng)建GUI程序”)。4.2創(chuàng)建ATM模型我們將為該范例程序創(chuàng)建一個模型:通過學習這里的圖表和注釋,完成本章后,你應該能很輕松地理解范例的代碼。如果你理解了本章中介紹的所有內(nèi)容,當然,你也能理解我們在本章末尾討論的程序。在前面的部分,我們已經(jīng)分析了要解決的問題,現(xiàn)在,我們要將它模型化,下面就是我們在范例程序中使用到的對象:Card(卡) 對一個或多個銀行帳戶有權(quán)訪問Bankaccount(銀行帳號) 要么是支票帳戶,要么是儲蓄帳戶Money(錢) 用一個數(shù)字代表,單位為特定的幣種Transaction(交易) 兩個帳戶間轉(zhuǎn)帳的記錄Person(用戶) 與ATM機交互的人Bank(銀行) 簽發(fā)卡和帳戶的機構(gòu)ATM 使用卡取錢的機器Electronicpurse(電子錢包) 可以被當作普通錢包使用的電子裝置PIN 用來保護卡的個人身份號碼在進一步定義操作前,我們應該熟悉以上定義。4.2.1操作現(xiàn)在,我們來討論人。這個用戶擁有一張可以在ATM機上使用的卡,他或她是唯一的與ATM應用程序交互的對象。圖4-1顯示了人機之間的交互關(guān)系,我們有八個操作:接受卡 ATM機顯示歡迎信息,用戶可以將卡插入ATM機的讀卡器中。驗證登錄 用戶向ATM機輸入PIN吃掉卡 如果用戶多次輸入錯誤的PIN,ATM機將卡存放在ATM機內(nèi)部,同時顯示一條信息。列出帳戶 列出與該卡關(guān)聯(lián)的所有帳戶,用戶可以選擇要存取的帳戶。顯示帳戶信息 ATM機顯示選定的帳號,讓用戶選擇取錢或是查看歷史交易記錄。取現(xiàn)款 ATM機詢問用戶取現(xiàn)款的數(shù)目,如果情況合適(帳戶中余額足夠,ATM機中有錢等),ATM機吐出現(xiàn)款。顯示帳戶記錄 ATM機顯示出當前帳戶的歷史交易記錄。吐出卡 用戶完成交易,讀卡器吐出卡,ATM機顯示信息讓用戶拿走卡。要獲得更詳細的對于圖中操作的描述,請瀏覽用RationalRose生成的HTML版的模型。RationalRose是資源包的一部分,你可以從Redbook網(wǎng)站下載或在隨書的CD-ROM中找到。(見附錄B,“使用附加材料”)圖4-1ATM操作圖表person 用戶insertcard 插入卡typepin 輸入PINselectaccount 選擇帳戶returncard 返回卡chooseaction 選擇操作specifyamount 指定數(shù)目ejectmoney 吐出錢acceptcard 接受卡listaccounts 列出帳戶showaccountdetail 顯示帳戶信息dispensecase 扣除現(xiàn)款validatelogin 驗證登錄showaccounthistory 顯示帳戶交易歷史記錄consumecard 吃掉卡ejectcard 吐出卡你或許已經(jīng)注意到其中有一個操作被稱為“扣除現(xiàn)款”,而不是“給電子錢包加款”。在詳細的描述了操作以后,我們發(fā)現(xiàn)試圖區(qū)分電子錢包卡和記帳卡會使問題更加復雜,而這些復雜其實是多余的。事實上,你會發(fā)現(xiàn)操作“扣除現(xiàn)款”和“給電子錢包加款”基本上是一樣的,當給電子錢包加款時,ATM機是將其當作現(xiàn)款扣除的。在開始部分,我們已經(jīng)提出了模型中對象的初步方案。現(xiàn)在,我們需要對它進行調(diào)整:電子錢包應該從對象消去。到目前為止,有兩個ATM機的組件已經(jīng)被提及多次,我們應該將它們加入到候選的應用程序?qū)ο笾腥ィ鹤x卡機現(xiàn)款扣除裝置我們在為一個操作指定狀態(tài)時應該考慮ATM機的狀態(tài)。4.2.2ATM機狀態(tài)表ATM機的狀態(tài)決定了允許進行一些操作,不允許進行另外的一些操作。在Web應用程序的設計中,狀態(tài)是重要的考慮因素。不同于普通的客戶機/服務器程序,Web客戶可能會提出進行當前系統(tǒng)狀態(tài)不允許的操作,該情況的原因有兩個。其一,傳統(tǒng)的客戶機/服務器程序中的兩方通訊所采用的協(xié)議相當安全(要保證安全也很容易),于是我們相信客戶機提供的身份。Web應用程序中使用HTTP協(xié)議使它易于被偽造客戶端欺騙(提供了安全措施的HTTPS是個例外),偽造的客戶端通常會在“錯誤的時刻”發(fā)出請求。其二,對于一個只能在恰當?shù)臅r間請求服務的客戶端,服務器不能回呼客戶機以驗證它是合法的??蛻舳吮旧硎菬o狀態(tài)的,HTTP協(xié)議也是單向、無狀態(tài)的,所以上述問題不能由普通的Web客戶端解決。UML為我們提供了狀態(tài)表,這可以幫助確定類型所處的特定狀態(tài)。該表可以顯示一個對象所處的所有可能狀態(tài),它還能代表對象在各個狀態(tài)間的過渡。狀態(tài)間的過渡可以由內(nèi)部或外部的操作引起。并不是所有可能的操作都被列表:如果它們對對象的狀態(tài)沒有影響,而且它們在所有的時候(在該對象的所有狀態(tài)下)都運行,狀態(tài)表一般不會將它們都列出來。在ATM系統(tǒng)中,我們使用了兩個狀態(tài)表,因為該系統(tǒng)有兩大類狀態(tài)。當ATM機被用戶使用時,它所有的狀態(tài)會共享一些公共的行為:別的用戶不能使用它、用戶在一定時間內(nèi)不進行操作,ATM交易可能會過期,等等。首先,我們把上述的“使用中(InUse)”狀態(tài)模型表示為一個,為了將它與其它狀態(tài)相比較,我們將詳細討論ATM機在被使用時的所處的不同子狀態(tài)。圖4-2顯示了ATM機可能處于的普通狀態(tài),圖4-3則展示了組成圖4-2“使用中”狀態(tài)的子狀態(tài)。圖4-2ATM狀態(tài)表outoforder 發(fā)生故障readytouse 可以使用inuse 使用中insertcard 插入卡initialize 初始化interrupt 中斷see“ATMinuse”diagram 見圖4-3insertcard 插入卡timeout 過期interrupt 中斷“插入卡”這一動作在前面已經(jīng)提到了兩次,它與ATM機的“可以使用(ReadytoUse)”狀態(tài)交互。當用戶插入一張讀卡器不能辨認的卡時,第一個“插入卡”的過渡發(fā)生了,讀卡器吐出卡,ATM機還是處于“可以使用”狀態(tài)。只有當卡被讀卡機辨認出來后,ATM機的狀態(tài)才能轉(zhuǎn)換為“使用中”,這個過程由圖中的第二個“插入卡”轉(zhuǎn)變表示?!笆褂弥小睜顟B(tài)會在兩種情況下結(jié)束。一個是因為長時間人機未發(fā)生交互而過期,另一個則是由于圖4-3中所示的一個過渡。圖4-3ATM機“使用中”狀態(tài)的子狀態(tài)readytouse 可以使用(見圖4-2)NotloggedOn 未登錄Bankaccountslisted 列出銀行帳戶Bankaccountschosen 選擇銀行帳戶Askamount 要求輸入數(shù)量Dispensemoney 扣除現(xiàn)款Transactionhistorylisted 列出交易記錄EnterPIN 輸入PINSTOP 交易中止Chooseaccount 選擇帳戶Listallaccounts 列出所有帳戶Choosemoneywithdraw 選擇取款金額Listhistory 列出帳戶交易歷史Getmoney 得到現(xiàn)款Collectmoney 取錢Returntoaccountdetail 回到帳戶insertcard 插入卡圖4-3顯示了ATM及“使用中”狀態(tài)的六個子狀態(tài):未登錄 卡在讀卡器中,但用戶未輸入PIN以證明自己的身份。列出銀行帳戶 ATM機將與該卡關(guān)聯(lián)的帳戶列表選擇銀行帳戶 用戶在帳戶列表中選擇一個帳戶。如果他的卡只與一個帳戶關(guān)聯(lián),則不用選擇。要求輸入數(shù)量 ATM機要求用戶輸入要取款的數(shù)額??鄢F(xiàn)款 ATM的現(xiàn)款扣除裝置從ATM機內(nèi)部取出要求的錢交給用戶。列出交易記錄 ATM機列出當前帳戶的交易記錄。我們建議你仔細地閱讀這些圖表的UML文檔。雖然我們在這一部分介紹了一些內(nèi)容,但或許你需要更多的材料以更好的理解這個問題??赐赀@些圖表,你應該注意到了一點:用戶可以在任何時候選擇終止交易,當然,現(xiàn)款扣除裝置取錢時例外。終止交易時,ATM機命令讀卡機吐出卡,系統(tǒng)回到“可以使用”狀態(tài)。另外一點是,用戶輸入PIN以后,ATM機的狀態(tài)有四種可能的轉(zhuǎn)換:正常情況下,PIN被驗證,ATM機顯示卡的關(guān)聯(lián)帳戶列表。PIN被驗證后,卡只有一個關(guān)聯(lián)帳號,ATM機直接進入該帳號。輸入的PIN錯誤,系統(tǒng)提示用戶重新輸入PIN多次輸入錯誤,ATM機吃掉卡。圖4-3中的兩個轉(zhuǎn)換被用“‘”號標出來?!叭″X”這個動作是由用戶實現(xiàn)的,現(xiàn)實中的現(xiàn)款扣除裝置可以察覺用戶取錢的動作。我們在范例程序中將其簡化為:經(jīng)過一段時間以后,ATM機自動地回到“選擇銀行帳戶”狀態(tài)。時間的長短與取款的金額有關(guān)。這意味著“取錢”這一動作不會被程序表示出來,它將會被自動進行。“未登錄”狀態(tài)和“可以使用”狀態(tài)間的轉(zhuǎn)換在多次錯誤的輸入PIN后發(fā)生。同樣是為了簡化,我們不考慮它。4.2.3分析類圖表讓我們再回頭看看那些有可能成為程序中對象的候選者。經(jīng)過前面的分析,我們可以拋棄其中的兩個:銀行在討論中沒有被提到,區(qū)分不同的銀行與我們的程序沒有什么關(guān)系。我們將讓BankAccount對象來處理所有的銀行帳戶,這種處理方法使用到了三個類型,ATM,Card和Transaction,程序需要維護它們的實例,并提供必要的行為以在這些對象的列表中選擇。另外一個我們提到了但是現(xiàn)在要拋棄的對象是用戶。普通程序的客戶端可以有它的屬性和行為,可是在Web應用程序中,我們不可能獲得Web客戶端的屬性,或是調(diào)用它的方法。Web客戶端是無狀態(tài)的,這使用戶也成為多余的了(請參考前面的“ATM狀態(tài)表”開頭部分對這個問題的討論)。下面是被我們淘汰后剩余的對象:Card(卡) 對一個或多個銀行帳戶有權(quán)訪問Bankaccount(銀行帳號) 要么是支票帳戶,要么是儲蓄帳戶Money(錢) 用一個數(shù)字代表,單位為特定的幣種Transaction(交易) 兩個帳戶間轉(zhuǎn)帳的記錄ATM 使用卡取錢的機器PIN 用來保護卡的個人身份號碼CardReader(讀卡機) ATM機上用戶插卡的的設備CashDispenser(現(xiàn)款扣除裝置) ATM機上用戶取款的設備圖4-4顯示了這些對象之間的關(guān)系,這里還列出了一些方法和最重要的屬性。圖4-4類分析圖表ATM ATMState 狀態(tài)Card 卡Owner 擁有者CardReader 讀卡機CashDispenser 現(xiàn)款扣除裝置Pin PINBankaccount 銀行帳戶Transaction 交易Savingaccount 儲蓄帳戶Checkingaccount 支票帳戶Money 錢Accept 接受Givesaccessto 允許訪問Secured 受保護Dispenses 出款Associated 關(guān)聯(lián)的Source/target 源/目的Balance 余額Amount 數(shù)量Ocverdraftlimit 最大透支額Minimumbalance 最低余額要對我們的Web程序的設計要求有一個徹底的了解,請仔細研究該圖表和相關(guān)文檔?,F(xiàn)在簡要介紹一下各對象間主要的關(guān)系。我們認為卡由一個PIN保護:只有當正確的號碼被輸入后,ATM機才會允許用戶對卡進行進一步的操作——允許訪問與卡關(guān)聯(lián)的一個或多個帳戶。所有的交易都有源帳戶和目的帳戶。不知道你是否記得,不通過一次交易,沒有錢可以被儲蓄或取出:在一次ATM取現(xiàn)款的過程中,ATM機與一個(目標)銀行帳號關(guān)聯(lián),它接受用戶從選擇的帳戶中轉(zhuǎn)入的現(xiàn)款。每次交易都要記住牽涉到的金錢的數(shù)量。銀行帳戶有一個余額,除此以外,支票帳戶受最大透支額保護,儲蓄帳戶則受最低余額限制。錢通過ATM機的現(xiàn)款扣除裝置吐出。我們用這個模型代表了在問題域中要解決的問題。它已經(jīng)可以被用來分析這個問題了。下一步我們將調(diào)整它使其真正地成為能解決該問題的設計模型。4.2.4設計類圖表該部分中,我們將討論如何將前面建立的模型實現(xiàn)為一個系統(tǒng),該系統(tǒng)將業(yè)務對象實例化,可以解決實際問題:我們已經(jīng)進入設計階段了!作為本書的介紹對象,我們選中Java作為實現(xiàn)該系統(tǒng)的編程語言。本來設計階段應該分為兩個獨立的部分,一個部分與編程語言無關(guān),另一個則用Java實現(xiàn)前一部分,但這樣的劃分會使本章過長,因此我們選擇了將兩者混合起來講述。我們首先看一下在分析階段中提到的“輸入PIN”(圖4-4)。這個模型將PIN定為只能由卡訪問。PIN所有的職責就是將輸入的字符串與它本身相比較,以鑒別卡的所有者?,F(xiàn)在我們將PIN合并到卡中:如圖4-5所示,卡承擔了驗證PIN的任務。對象分析圖中ATM機和BankAccount之間的聯(lián)系決定了每次取現(xiàn)款的數(shù)量不能大于ATM機中實際現(xiàn)款的數(shù)量。取現(xiàn)款的目的帳戶是與ATM機關(guān)聯(lián)的,這表明取現(xiàn)款的交易有可能會由于上述限制失敗。我們不得不在程序中的某個地方實現(xiàn)這個限制:它要么由ATM機實現(xiàn),要么通過BankAccount加以限制。我們可以把檢查ATM機中是否有足夠的金錢這個問題與前面談到的兩個限制相比較,在取款中限制取款數(shù)額的支票帳戶的最大透支額和儲蓄帳戶的最低余額(它們都會導致交易失?。?。我們決定將上述限制的實現(xiàn)交給銀行帳戶。具體來說,我們建立了一類新帳戶――ATM帳戶。要使該帳戶工作,我們賦予它一個新的屬性,該屬性表示了ATM機中在交易開始時最大的可提取的現(xiàn)款的數(shù)量。每次錢被提出的同時,同樣數(shù)量的錢都會被從用戶帳戶轉(zhuǎn)到ATM帳戶中,每次它還會進行一些必要的檢驗。每次取款都會被在關(guān)聯(lián)的ATM帳戶中存款而補償,從而保持ATM機的“價值”永遠不變。你可以將ATM帳戶與出納員帳戶相比較,該出納員帳戶被用來登記某個出納員處理的所有金錢交易。該帳戶的余額和出納員抽屜中的現(xiàn)款數(shù)目之和應該在所有的時候都相等。我們并沒有使用另一個對象表示現(xiàn)款扣除裝置中實際擁有的現(xiàn)金數(shù),它實際就是ATM機最大現(xiàn)款數(shù)額和ATM帳戶余額之差。card 卡ATM ATM機CardReader 讀卡機Cashdispenser 現(xiàn)款扣除裝置BankAccount 銀行帳戶Id IDPin PINState 狀態(tài)Currentcard 當前的卡Associated 關(guān)聯(lián)currentBankAccount 當前的銀行帳號圖4-5設計模型中與ATM機相關(guān)的部分上面的圖表顯示除了ATM帳戶以外,ATM機也包含讀卡器和現(xiàn)款扣除裝置。ATM機的這三個子部分被完全地與ATM機本身捆綁起來:它們同時創(chuàng)建,不能脫離ATM機存在,從ATM機外部不可見。ATM機通過它們實現(xiàn)它的行為,ATM機分析所有對ATM機的請求,以決定是否將它們發(fā)送到這三個部分中的一個。在圖4-5中,我們給每張卡,銀行帳戶,ATM機和交易賦予了一個身份(ID),這允許我們區(qū)分這些對象的不同實例。你也可以把ID當作是區(qū)分這些對象的實例的主鍵。我們希望所有的這些ID都有一些公共的行為(轉(zhuǎn)向/來自字符串的轉(zhuǎn)換,比較大小等等),我們也希望避免將指向不同類型的對象的ID混雜起來,使用內(nèi)部類并擴展一個公共的PrimaryKey類(見圖4-6)可以滿足上述要求。我們不但要將主鍵(primarykey)存放在一個數(shù)據(jù)庫中,還要把它包括在Web網(wǎng)頁中,這需要轉(zhuǎn)向/來自字符串的轉(zhuǎn)換和一個構(gòu)造器。為了方便,我們提供了一個缺省的構(gòu)造器,它自己就可以產(chǎn)生一個主鍵。圖中的hashCode()方法(和equals()方法)使我們能使用HashMap類型儲存并區(qū)分業(yè)務對象。圖4-6與主鍵相關(guān)的類設計圖表所有可驗證業(yè)務對象的類,它們負責跟蹤它們自己所有的實例,這些類都有一個Finder方法:它們接受對應類型的主鍵,并查看是否能找到一個與該主鍵對應的對象。如果它找不到對應的類,那么我們將創(chuàng)建一個具有適當?shù)哪J狀態(tài)的新對象。這將大大的簡化我們的測試代碼,因為它在沒有提供測試數(shù)據(jù)時也可以工作。交易也是上述BO(業(yè)務對象)中的一個,它可以由自己的專門的PrimaryKey驗證。如圖4-7所示,創(chuàng)建交易對象的唯一方法是使用交易類方法CreateTrx()。該方法保證了沒有存款就不能取款。當它不能創(chuàng)建一個完整的交易時,它將會發(fā)出TransactionAbortedException異常并將所有已做的更改恢復到該方法起始的狀態(tài)。圖4-7交易BankAccount 銀行帳戶Transaction 交易Savingsaccount 儲蓄帳戶Checkingaccount 支票帳戶ATMAccount ATM帳戶Money 錢Id IDsrcAccount 源帳戶trgtAccount 目的帳戶balance 余額trxAmount 交易數(shù)量minimumBalance 最低余額overdraftAmount 最大透支額initialAmountCash 最大現(xiàn)款額度這里的TransactionAbortedException是圖4-8所示異常(exception)的父異常:當一個ATM帳戶嘗試存款(以彌補取款)但會使其中的余額大于最大現(xiàn)款額度(initialAmountCash)時,它會發(fā)出NotEnoughCashException信號,這避免了用戶要求從ATM機的取款額度超出ATM機實際存放的現(xiàn)款數(shù)目。另外兩個異常來自于ExceedLimitException異常,它指示了用戶的帳戶中余額不夠完成取款。OverdraftLimitExceededException顯示當前的取款行為將使帳戶余額大于支票帳戶的最大透支額,BelowMinimumBalanceException的功能與之相似,它顯示的是低于儲蓄帳戶的最小余額。圖4-8TransactionAbortedException圖表當使用JSP定制Web應用程序的出錯消息時,圖4-8所示結(jié)構(gòu)很容易實現(xiàn)(第六章,“創(chuàng)建JSP”)。程序的內(nèi)部的處理邏輯將會處理TransactionAbortedException,我們還可以將這些JSP設計得更加精細,使它們可以根據(jù)子異常的類型幫助用戶找到出錯的地點。請注意這些異常類型只有一個構(gòu)造器。它將出錯信息用一種用戶可讀的格式顯示出來,這方便了調(diào)試和測試過程。另一個目前看起來多余的對象是錢。我們將它在模型中作為一個單獨的對象,這為了便于以后在將該程序應用到現(xiàn)實中時添加對匯率和零錢的支持。另外一個優(yōu)點是大家都熟悉的Java對類型的檢驗:在人為的誤輸入中,當接收到一個Money類型的參數(shù)時,你不太可能錯誤地使用某些方法,因為它們只能接受普通數(shù)值類型的賦值。即使你錯誤使用了,如果賦值的類型錯誤的話,編譯器也能在運行程序前檢測到該錯誤。仔細查看上面的圖表和附錄B“使用附加材料”中的整個設計,你會注意到對于那些可以驗證的業(yè)務對象,并沒有提供任何方法能將它們移去。這是我們的又一個簡化:增加這些方法并不能為我們的討論帶來更多的內(nèi)容,不理會它們卻可以減少對HashMap同步存取的討論,免除對這些對象的引用。4.2.5交互圖表我們畫出了圖4-9所示的序列圖,它展示了前面提到的業(yè)務對象如何共同工作,以完成程序的目標。我們選擇了最基礎的場景——取款。1.先決條件用戶已經(jīng)將卡插入ATM機,通過了PIN驗證,選擇了一個支票帳戶,并要求取錢:ATM機處于ASK_AMOUNT狀態(tài),它詢問取款的數(shù)量。用戶想要取100,被選擇的帳戶中有足夠的錢,ATM機中也有100的現(xiàn)款。2.場景用戶輸入100。ATM即從當前帳戶中取出100,現(xiàn)款扣除裝置吐出100。用戶拿走錢,ATM返回顯示當前帳戶。序列圖顯示出用戶輸入100相當于給ATM機發(fā)出消息:getMoney,ATM機要求“交易”這個對象創(chuàng)建一個實例,該實例以選定的帳戶為源帳戶,該ATM的ATM帳戶為目的帳戶,數(shù)額為100:creatTrx?!敖灰住眲?chuàng)建一個自己的新實例,在選定帳戶中調(diào)用withdrow方法。該選定帳戶檢查它的余額,并減去取款數(shù)量。交易然后要求ATM帳戶執(zhí)行deposit方法,ATM帳戶先要進行檢驗然后將取款數(shù)量增加到它的余額中。交易到這里已經(jīng)成功了,它將該交易實例加入到歷史記錄中。ATM機將狀態(tài)轉(zhuǎn)換為DISPENSE_MONEY,要求現(xiàn)款扣除裝置執(zhí)行dispenseMoney方法。當現(xiàn)款扣除裝置吐出錢以后,ATM機回到BANK_ACCOUNT_CHOOSEN狀態(tài)。圖4-9“取款”場景的序列圖你應該已經(jīng)對該程序的設計有了一個基本的了解。如果你還有不理解的地方,請參考整個模型及其文檔(見附錄B,“使用附加材料”)。我們現(xiàn)在將討論程序的底層結(jié)構(gòu),并將它們通過不同的解決方式中加以實現(xiàn)。4.3整體體系結(jié)構(gòu)這部分將把該范例程序應用的不同環(huán)境一一展示出來。我們在前面設計時確定的業(yè)務對象會組成它們的基礎。這些對象構(gòu)成了解決方案的模型,并唯一地負責執(zhí)行業(yè)務邏輯。如果除了這些業(yè)務對象以外,系統(tǒng)中別的地方也存在業(yè)務邏輯,它們將不會對這些業(yè)務對象的邏輯過程產(chǎn)生任何影響。那些業(yè)務邏輯應該是被用來解決特定情況的輔助過程。舉個例子,輸入的PIN必須是數(shù)字,其中不能含有非法字符,對PIN輸入的檢查可以通過在HTML中加入JavaScript來實現(xiàn)。雖然該項規(guī)則檢查也可以由業(yè)務對象實現(xiàn),但在客戶端用JavaScript完成可以減少服務器與客戶端的不必要的來回通信,這種通過Internet的通信可能會增加程序的響應時間。4.3.1整體圖圖4-10所示業(yè)務對象處于整個圖的中心地位。本書介紹的體系結(jié)構(gòu)是一個基本的三層結(jié)構(gòu)。頂層代表持續(xù)性儲存(它儲存交易的記錄),中層是設計的業(yè)務對象的實現(xiàn)(BO層),中層以下所有的類型都代表了接口,它們特定于該應用程序用戶的環(huán)境。底層(表示層)的作用基本上是翻譯程序內(nèi)部處理邏輯和并負責與外部環(huán)境間的輸入和輸出。圖4-10體系結(jié)構(gòu)圖transaction 交易Money 錢card 卡ATM ATM機CardReader 讀卡機Cashdispenser 現(xiàn)款扣除裝置ATMAccount ATM帳戶Checkingaccounts 支票帳戶Savingsaccounts 儲蓄帳戶Insertcardservlet InsertcardservletEnterPINservlet EnterPINservletChooseaccountservlet ChooseaccountservletShowATMservlets ShowATMservletsChoosewithdrawalhistoryservlet ChoosewithdrawalhistoryservletEnteramountservlet EnteramountservletOutoforder 發(fā)生故障Readytouse 可以使用Notloggedon 未登錄Bankaccountslisted 列出銀行帳戶Bankaccountchosen 選擇銀行帳戶Askamount 要求輸入數(shù)量Dispensemoney 扣除現(xiàn)款Transactionhistorylisted 列出交易記錄JSPs JSPCardbean CardBeanCardBeanHome CardBeanHomeBankaccountbean BankaccountBeanJavabeans JavaBeansBrowser 瀏覽器GUIClient GUI客戶你在圖中可以見到兩種主要的表示層實現(xiàn)方式:GUI,傳統(tǒng)的C/S客戶瀏覽器,Web應用程序4.3.2GUI客戶該程序的GUI(GraphicalUserInterface,圖形用戶界面)版是一個Java應用程序。這個客戶端采用了VisualAgeforJava的VCE(VisualCompositionEditor)部件,為了換換花樣,它并不實現(xiàn)與ATM機的交互,而是提供了一些對ATM系統(tǒng)的管理功能。你在第七章“創(chuàng)建GUI程序”將看到,VCE采用JavaBean工作,圖4-10中的方塊區(qū)域中顯示了一些包圍著業(yè)務對象的JavaBean。要提示的是,原來業(yè)務對象中類一級的職責現(xiàn)在被交給了一個帶有Home后綴的JavaBean:比如,CardBeanHome將關(guān)于卡的請求發(fā)送到相應的卡類的方法,它起了原來卡的Finder方法的作用4.3.3瀏覽器客戶Web應用程序可以被看作是一個轉(zhuǎn)換器。它將HTTP請求轉(zhuǎn)換為傳遞給業(yè)務對象的消息,業(yè)務對象的處理結(jié)果被轉(zhuǎn)換為HTML(還是使用HTTP協(xié)議)格式傳回瀏覽器客戶。上面介紹的Web應用程序包含兩個程序部件:ServletJavaServerPage(JSP)第五章,“創(chuàng)建Servlet”解釋了servlet的概念,并用其實現(xiàn)整個范例程序,并沒有用到JSP。第六章,“創(chuàng)建JSP”解釋了JSP,并向前面創(chuàng)建的只使用servlet的程序中加入了JSP技術(shù)。在本章的開頭,我們指出了傳統(tǒng)的客戶機/服務器應用程序和Web應用程序(它的客戶端是無狀態(tài)的)的一個重要區(qū)別:簡單地說,Web應用程序要在任何時候準備接受對任何方法的調(diào)用,而這些調(diào)用在當時的狀態(tài)下可能是不合法的。在設計該程序的時候,我們通過確定ATM機的狀態(tài)來判斷并處理這些不合法的調(diào)用。ATM機的狀態(tài)明白無誤地表明了在交易的任一階段可以進行的操作。由于現(xiàn)實中ATM機的狀態(tài)只要看一眼就可以確定,我們可以將ATM機的狀態(tài)與ATM機的不同顯示聯(lián)系起來。Servlet和JSP兩種實現(xiàn)方式都采用了這個處理方法。該處理方法的中心部分是ShowATMServlet,它負責將ATM機當前的狀態(tài)返回給客戶端。該servlet是唯一響應客戶瀏覽器的部分(它會間接地通過JSP):客戶對所有別的servlet(包含JSP)的請求都被交給ShowATMServlet。這種設計確保了任何時候?qū)Τ绦虻脑L問都是合法的。別的servlet使用ATM對象來提交對ATM機進行操作的請求。這些操作(來源于ATM系統(tǒng)的用戶的操作)可以在操作圖表(見圖4-1)找到。每個servlet對應于用戶的一項用戶操作引起的操作。通過這種設計,不同的功能需求和它們的執(zhí)行之間的對應就十分明顯了。分析和檢驗完HTTP請求后,那些操作servlet調(diào)用業(yè)務對象中對應的方法,在本范例中主要是ATM。這些調(diào)用的結(jié)果可能會是ATM機狀態(tài)的改變,或是出錯。兩種情況下ATM機都必須顯示出來(即使還附帶出錯信息),所以這些ATMservlet總是將請求發(fā)給ShowATMServlet,以依據(jù)ATM機當前的狀態(tài)產(chǎn)生相應。4.3.4數(shù)據(jù)庫訪問為了簡化,圖4-10中的業(yè)務對象層和圖頂端的數(shù)據(jù)庫之間的連接是在別的業(yè)務對象中實現(xiàn)的。更好的解決辦法是通過中間的持續(xù)性層實現(xiàn)。本書只介紹VisualAgeforJavaProfessional版的特性,它不包括PersistenceBuilderFeature,而這是有效地實現(xiàn)持續(xù)性層的必要工具。要想找到關(guān)于如何創(chuàng)建持續(xù)性層的內(nèi)容,請參加專門的講座。第十章,“使用關(guān)系型數(shù)據(jù)庫”討論了基于數(shù)據(jù)庫的持續(xù)性的解決方案。該方案將與我們下面即將討論的基于內(nèi)存的持續(xù)性的參考解決方案完全兼容:你只需要修改所有的客戶層的import語句,讓它引用下列兩個相應的包:com.ibm.itso.sg245264.atm.memory 它包含了以下部分的將數(shù)據(jù)儲存于內(nèi)存中的范例解決方案com.ibm.itso.sg245264.atmk.database 它包含了第十章“使用關(guān)系型數(shù)據(jù)庫”中介紹的數(shù)據(jù)庫解決方案我們將通過JDBC2.0訪問數(shù)據(jù)庫,這使你可以在任何平臺上使用任何的數(shù)據(jù)庫引擎,只要有它的驅(qū)動。使用JDBC的另一個好處是,以上的三層可以分別存在于不同的計算機。更多的關(guān)于數(shù)據(jù)庫部分的敘述,請閱讀第十章“使用關(guān)系數(shù)據(jù)庫”。4.4范例的實現(xiàn)我們將會有三個不同的客戶端程序來訪問業(yè)務對象,還有兩種不同的解決方案。在該部分中,我們將討論參考解決方案,它著重于實現(xiàn)前面討論的設計模型的業(yè)務邏輯。開始創(chuàng)建程序時,最簡單的的辦法就是直接從設計工具生成Java類的框架代碼。我們使用了一個連接工具來連接RationalRose和VisualAgeforJava。要使用這個工具,你需要下載并安裝一個補丁程序和RationalRose建模工具。請參考以下網(wǎng)址:/support/downloadcenter/upgrades/rose.jsp所有在這里討論到的代碼和程序其余的部分都可以在附加資源中找到:見附錄B,“使用附加材料”,因此,你不需要自己輸入所有的代碼。作為一次訓練,你有可能會完成程序中的一部分,然后拷貝其余的代碼以完成整個IDE。我們還提議你進行第二個訓練以保證你的確掌握了本書所講的內(nèi)容:回到問題域部分,找出需要增加或改進的功能,在現(xiàn)有代碼的基礎上描述并實現(xiàn)它們。在我們開始介紹的同時,你也應該開始你自己的項目了,我們假設你剛剛安裝了VisualAgeforJa
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 農(nóng)業(yè)用地土地使用權(quán)轉(zhuǎn)讓合同
- 我的一周生活記錄:周記作文(13篇)
- 《國際音標基礎知識:初中英語發(fā)音教學教案》
- 創(chuàng)新培養(yǎng)模式下地理學學科的互饋機制構(gòu)建
- 英語醫(yī)學術(shù)語應用能力考試內(nèi)容
- 個人學習進展記錄表
- 高性能機器人電驅(qū)動關(guān)節(jié)生產(chǎn)線項目可行性研究報告(范文模板)
- 2025年應用統(tǒng)計學專業(yè)資格考試試題及答案
- 2025年網(wǎng)絡數(shù)據(jù)分析與優(yōu)化策略考試題及答案
- 2025年農(nóng)村經(jīng)濟與社會發(fā)展能力測評試題及答案
- 2022秋公共部門人力資源管理形考任務3試題1及參考答案
- 建設用地審查報批講解課件
- 化工工藝學理論知識考核題庫與答案
- 《民法典》合同編實務培訓課件
- 強風雷電暴雨應急預案
- 靜脈輸液課件PPT
- 統(tǒng)一的企業(yè)文化建設實施策劃方案
- 倫敦銅期權(quán)及實際操作-精選課件
- 貴州省黔東南州2021-2022 學年七年級下學期期末文化水平測試 數(shù)學試卷 (含答案)
- 2025年退役士兵轉(zhuǎn)業(yè)軍人文化考試試題題庫答案
- 超星爾雅學習通 數(shù)學大觀(北京航空航天大學) 章節(jié)測試含答案
評論
0/150
提交評論