本書講解使用J2EE核心技術實現企業(yè)應用過程中的模式、最佳實踐、設計策略以及經過驗證的解決方案,涵蓋了JSP、servlet、EJB、JMS等技術,其中J2EE模式目錄包括21個模式以及大量策略,幫助讀者迅速熟練掌握J2EE技術,從而構建出健壯、高效的企業(yè)應用。本書是計算機應用開發(fā)人員、架構師、技術經理等人員的必備參考書。本書前言譯者序為一部由GradyBooch和MartinFowler作序的作品寫序言,這個念頭本身就足夠荒謬和僭越,不啻于在莎翁之后再寫一個關于丹麥王子復仇的劇本。大師們的判斷是中肯而毫不含糊的:“沒有這本書,就別開發(fā)EJB?!彼麄兊膿W阋源_認本書在其論域中舍我其誰的地位。是的,這就是“那本”J2EE書。當然,對于廣大中國開發(fā)者而言,我們早就已經在“沒有這本書”的條件下開發(fā)了大量J2EE乃至EJB應用系統。那些波折的、不乏磨難的開發(fā)歷程似乎使不少人具備了一種不無理由的自信,在掌握了若干API細節(jié)、若干應用服務器配置訣竅、若干框架類庫用法之后,他們或是公開、或是暗自地把自己當成了當之無愧的Java企業(yè)開發(fā)專家?!唬@些話沒有任何揶揄的意思:我們想說的其實是,本書恰恰是為以上這一類開發(fā)者寫的。對于他們想成為“Java企業(yè)開發(fā)專家”的隱秘欲望,本書就是最大限度的補救和成全。如果說,此前的各種教程都是在介紹J2EE開發(fā)中的“內容”要素—也就是,教給我們“做什么”的話,本書關注的則是這里的“形式”要素,即“怎樣做”才能開發(fā)出高效的、優(yōu)雅的J2EE系統。讀者從中學到的,將不僅僅是“J2EE技術”,而是“如何使用J2EE技術進行設計”。換句話說,如果你以前沒有進行過J2EE實踐,但明早將應聘一個需要“1年J2EE開發(fā)經驗”的職位,本書中不包含你今晚要徹夜吞咽的那一類知識;相反,如果你,這位未來的“Java企業(yè)開發(fā)專家”,追求的職位是“資深Java應用系統架構師”,如果你預料到未來的上司明天將問起“怎樣實現訪問控制”、“何時采用細粒度的接口設計”等“高階”問題,那么恭喜你,今晚—乃至今后—閱讀本書,你選對了補課的讀物。作為本書第1版的忠實讀者,我們(半是欣喜、半是驚訝地)發(fā)現,眼前的這部第2版構成了全新的閱讀體驗。作者們按照最新版J2EE技術規(guī)范(尤其是EJB2.1)全面修訂了技術細節(jié);根據模式社區(qū)的研究交流,作者們補入了若干模式;即使是一些不涉及技術更新的部分,論述方式、示例也完全不同于第1版;原有的PSA項目(第1版“尾聲”一章)融入了其余各章的“示例代碼”部分;而新增的討論“微架構”的尾聲、對WebService等技術的關注、對各種的持久化方案(定制持久化、EJB、JDO等)的深入討論,都體現出作者們對本書新版的大量投入。受益于本書有年,在此,我們想冒昧地為本書的中國讀者們建議一條高效的閱讀路徑:與第1章相比,第5章“J2EE模式概覽”是讀者更合理的起步點。請?zhí)貏e關注其中對“分層”、“術語”和模式/策略區(qū)別的討論,這些都是貫穿全書的重要概念!其次,應該通讀第2章“表現層設計考慮和不佳實踐”和第3章“業(yè)務層設計考慮和不佳實踐”:即使你不打算使用任何模式,甚至,即使你根本不關心J2EE開發(fā),只要你的工作與分布式企業(yè)應用系統有關,這兩章涉及的問題都是你遲早會遇到的。至于每個具體模式本身,我們則推薦讀者留意其中詳盡的“策略”部分和那些散布其中的“設計手記”。前者討論了對同一個模式的多種實現方案,后者則突出介紹了特定開發(fā)領域的一些核心概念和考慮。一部英文技術論著在漢語中的旅行,永遠是一段難以捉摸的行程。對于本書的漢語譯者,“技術難度”并非挑戰(zhàn):全書討論的正是譯者們最為熟知的一個領域,所以我們能夠負責任地說,在這個中譯本里,沒有任何技術細節(jié)會因為譯者的無知或生疏而發(fā)生變形或曲解。這次翻譯的原則和前提是對原文的徹底領會。事實上,譯者在翻譯工作中遇到的困難主要發(fā)生在“語匯”層面。簡單地說,J2EE專著的譯者總要面對“翻,還是不翻”的兩難處境:對象、函數的名稱,UML圖中的各種元素,這些內容由英語表示早就是約定俗成,即使是英語程度略低的開發(fā)者大概也都能讀懂,所以,在讀者能夠理解的部分盡可能保留原文似乎是一種合理的做法—畢竟開發(fā)工作最終是與代碼有關,而代碼則肯定是要用“英文”的。但在另一方面,翻譯的責任就在于讓不諳英文的讀者也能通達作品,如果譯文中大量段落(不包括示例代碼)都仍保留為英文或“類英文”,那么讀者也就無法直觀地獲得原文包含的信息。反復權衡之后,在這個譯本中譯者的解決方式還是折衷的。工作中我們采取了以下原則:1)術語盡可能采用通用文獻定譯,不自創(chuàng)譯法。對于各個模式的名稱、模式文檔模板各部分名稱、重構手法名稱,我們參考了李英軍等譯《設計模式》(機械工業(yè)出版社,2000年)、熊節(jié)等譯《重構》(中國電力出版社,2003年)等譯作,以及IBMDeveloperWorks中文網站的部分資源。2)本領域的一些常見術語,如果沒有定譯,本書也不自創(chuàng)新語,強譯為中文,而是保留英文原字。這一類的術語包括:applet、servlet、bean、JavaBean、entitybean、sessionbean、EJB、finder、Context、cookie、RowSet、null、scriptlet、WebService。根據我們的觀察,國內的開發(fā)者在日常工作中已經習慣按原文使用以上術語。在一些情況下,我們也以注釋形式澄清了這些術語的用法。另外,一些非常直觀的英文表達方式,比如“versus/vs”(“AversusB”即“A對B”、“A與B相比較/對照”),我們也徑用原文—改為漢語既羅嗦,也不直觀。3)模式中的對象名稱,往往按照代碼風格命名,比如“BusinessObject”、“CustomerTO”等。如果對此完全不加翻譯,那么很多充斥這類表達的段落就很難理解。我們的原則是,在每個自然段第一次出現某個這類表達方式時,用括號注明,比如“BusinessObject(業(yè)務對象)”、“CustomerTO(客戶傳輸對象)”等。希望這個做法能夠維持易懂和簡潔之間的平衡。4)書中示例代碼占有相當大的比重,而代碼注釋則是理解這些代碼的關鍵。我們把所有代碼注釋譯為中文。而對在視圖中顯示特定結果的代碼(比如調試信息等),我們沒有改為中文,只是在必要時對輸出信息的含義加以注解。如果讀者更信賴代碼原貌,還可以從本書官方網http://www.corej2eepatterns.com/下載原始代碼。5)原書不包含注解,目前的所有注解都是譯注。6)原書申義未暢處,譯文中以方括號[]加以解釋、補足,略去生澀。這與上面三條原則一樣,都類似于在原作講話時的插嘴—但翻譯任務本身,似乎本就已經是一種“插嘴”了。在博學的讀者看來,有時候譯者或許還不如保持體面的沉默—但我們只能力圖做到插嘴而不多嘴。7)原書引用了Apache項目的若干代碼,所以附錄中包含Apache軟件授權協議一頁。中譯本照錄了這份法律文件,未加翻譯。8)幾個關鍵術語的譯名考慮:*application:一般譯為“應用程序”或“應用”。本書中這個詞單獨出現時,往往指的是“企業(yè)應用”,亦即企業(yè)信息應用系統。考慮到“應用程序”容易被理解為“桌面程序(desktopapplication)”,在該詞含有“企業(yè)應用”意味時,我們譯為“應用系統”,其他情況下則譯為“應用”,以示區(qū)別。*client:譯為“客戶端”。但本書中所說的“客戶端”常常是指特定組件的調用者,不一定是“桌面程序客戶端”,反倒很可能本身也是另一種組件、甚至一個子系統。希望讀者注意該詞在書中的用法。*POJO:軟件方法論大師MartinFowler在《PatternsofEnterpriseApplicationArchitecture》(PEAA)中創(chuàng)造的說法,是plainoldJavaobject的縮寫,指普通Java對象(而不是EJB等組件)。中譯本仍采用“POJO”名稱。*enterprisebean:直譯為“企業(yè)bean”,在本書中就是“enterpriseJavaBean/EJB”的另一說法。為了直觀,我們統一譯為“EJB”。*tier/layer:字面上都是“層”/“層次”。本書中“tier”指的往往是“架構”意義上的分層,比如“表現層”、“業(yè)務層”、“集成層”等,而“l(fā)ayer”既分享了前者的含義,有時也指tier內部的中間層次,比如“會話門面”就構成了客戶端和業(yè)務服務之間的一個“l(fā)ayer”。這兩種意思實在很難區(qū)分,中譯本只能都譯為“層”、“層次”。希望讀者在閱讀中體察這種細微差別。*delegate:是設計模式中的重要概念。一般譯為“委派”。但在我們看來,這個譯法還不完整,因為“委派”在漢語中只是動詞,而delegate往往還充當名詞。這次中譯本的做法是,動詞delegate仍譯為“委派”,比如“A把功能F委派給業(yè)務層的B”,而名詞delegate則譯為“代表”,比如“B是A在業(yè)務層的代表”。希望讀者體察,并推薦更好的譯法。原書中所有模式、重構手法、策略的名稱以斜體標出,要點以黑體標出。中譯本一仍其舊。原書經多人、多版修訂完成,難免有錯漏、亂排之處。譯者根據本書官方網站的最新勘誤表訂正,并結合參照本書第1版《CoreJ2EEPatterns:BestPracticesandDesignStrategies》(AddisonWesley,2001),另外修正了數十處錯誤。