本书讲解使用J2EE核心技术实现企业应用过程中的模式、最佳实践、设计策略以及经过验证的解决方案,涵盖了JSP、servlet、EJB、JMS等技术,其中J2EE模式目录包括21个模式以及大量策略,帮助读者迅速熟练掌握J2EE技术,从而构建出健壮、高效的企业应用。本书是计算机应用开发人员、架构师、技术经理等人员的必备参考书。本书前言译者序为一部由GradyBooch和MartinFowler作序的作品写序言,这个念头本身就足够荒谬和僭越,不啻于在莎翁之后再写一个关于丹麦王子复仇的剧本。大师们的判断是中肯而毫不含糊的:“没有这本书,就别开发EJB。”他们的担保足以确认本书在其论域中舍我其谁的地位。是的,这就是“那本”J2EE书。当然,对于广大中国开发者而言,我们早就已经在“没有这本书”的条件下开发了大量J2EE乃至EJB应用系统。那些波折的、不乏磨难的开发历程似乎使不少人具备了一种不无理由的自信,在掌握了若干API细节、若干应用服务器配置诀窍、若干框架类库用法之后,他们或是公开、或是暗自地把自己当成了当之无愧的Java企业开发专家。—不,这些话没有任何揶揄的意思:我们想说的其实是,本书恰恰是为以上这一类开发者写的。对于他们想成为“Java企业开发专家”的隐秘欲望,本书就是最大限度的补救和成全。如果说,此前的各种教程都是在介绍J2EE开发中的“内容”要素—也就是,教给我们“做什么”的话,本书关注的则是这里的“形式”要素,即“怎样做”才能开发出高效的、优雅的J2EE系统。读者从中学到的,将不仅仅是“J2EE技术”,而是“如何使用J2EE技术进行设计”。换句话说,如果你以前没有进行过J2EE实践,但明早将应聘一个需要“1年J2EE开发经验”的职位,本书中不包含你今晚要彻夜吞咽的那一类知识;相反,如果你,这位未来的“Java企业开发专家”,追求的职位是“资深Java应用系统架构师”,如果你预料到未来的上司明天将问起“怎样实现访问控制”、“何时采用细粒度的接口设计”等“高阶”问题,那么恭喜你,今晚—乃至今后—阅读本书,你选对了补课的读物。作为本书第1版的忠实读者,我们(半是欣喜、半是惊讶地)发现,眼前的这部第2版构成了全新的阅读体验。作者们按照最新版J2EE技术规范(尤其是EJB2.1)全面修订了技术细节;根据模式社区的研究交流,作者们补入了若干模式;即使是一些不涉及技术更新的部分,论述方式、示例也完全不同于第1版;原有的PSA项目(第1版“尾声”一章)融入了其余各章的“示例代码”部分;而新增的讨论“微架构”的尾声、对WebService等技术的关注、对各种的持久化方案(定制持久化、EJB、JDO等)的深入讨论,都体现出作者们对本书新版的大量投入。受益于本书有年,在此,我们想冒昧地为本书的中国读者们建议一条高效的阅读路径:与第1章相比,第5章“J2EE模式概览”是读者更合理的起步点。请特别关注其中对“分层”、“术语”和模式/策略区别的讨论,这些都是贯穿全书的重要概念!其次,应该通读第2章“表现层设计考虑和不佳实践”和第3章“业务层设计考虑和不佳实践”:即使你不打算使用任何模式,甚至,即使你根本不关心J2EE开发,只要你的工作与分布式企业应用系统有关,这两章涉及的问题都是你迟早会遇到的。至于每个具体模式本身,我们则推荐读者留意其中详尽的“策略”部分和那些散布其中的“设计手记”。前者讨论了对同一个模式的多种实现方案,后者则突出介绍了特定开发领域的一些核心概念和考虑。一部英文技术论著在汉语中的旅行,永远是一段难以捉摸的行程。对于本书的汉语译者,“技术难度”并非挑战:全书讨论的正是译者们最为熟知的一个领域,所以我们能够负责任地说,在这个中译本里,没有任何技术细节会因为译者的无知或生疏而发生变形或曲解。这次翻译的原则和前提是对原文的彻底领会。事实上,译者在翻译工作中遇到的困难主要发生在“语汇”层面。简单地说,J2EE专著的译者总要面对“翻,还是不翻”的两难处境:对象、函数的名称,UML图中的各种元素,这些内容由英语表示早就是约定俗成,即使是英语程度略低的开发者大概也都能读懂,所以,在读者能够理解的部分尽可能保留原文似乎是一种合理的做法—毕竟开发工作最终是与代码有关,而代码则肯定是要用“英文”的。但在另一方面,翻译的责任就在于让不谙英文的读者也能通达作品,如果译文中大量段落(不包括示例代码)都仍保留为英文或“类英文”,那么读者也就无法直观地获得原文包含的信息。反复权衡之后,在这个译本中译者的解决方式还是折衷的。工作中我们采取了以下原则:1)术语尽可能采用通用文献定译,不自创译法。对于各个模式的名称、模式文档模板各部分名称、重构手法名称,我们参考了李英军等译《设计模式》(机械工业出版社,2000年)、熊节等译《重构》(中国电力出版社,2003年)等译作,以及IBMDeveloperWorks中文网站的部分资源。2)本领域的一些常见术语,如果没有定译,本书也不自创新语,强译为中文,而是保留英文原字。这一类的术语包括:applet、servlet、bean、JavaBean、entitybean、sessionbean、EJB、finder、Context、cookie、RowSet、null、scriptlet、WebService。根据我们的观察,国内的开发者在日常工作中已经习惯按原文使用以上术语。在一些情况下,我们也以注释形式澄清了这些术语的用法。另外,一些非常直观的英文表达方式,比如“versus/vs”(“AversusB”即“A对B”、“A与B相比较/对照”),我们也径用原文—改为汉语既罗嗦,也不直观。3)模式中的对象名称,往往按照代码风格命名,比如“BusinessObject”、“CustomerTO”等。如果对此完全不加翻译,那么很多充斥这类表达的段落就很难理解。我们的原则是,在每个自然段第一次出现某个这类表达方式时,用括号注明,比如“BusinessObject(业务对象)”、“CustomerTO(客户传输对象)”等。希望这个做法能够维持易懂和简洁之间的平衡。4)书中示例代码占有相当大的比重,而代码注释则是理解这些代码的关键。我们把所有代码注释译为中文。而对在视图中显示特定结果的代码(比如调试信息等),我们没有改为中文,只是在必要时对输出信息的含义加以注解。如果读者更信赖代码原貌,还可以从本书官方网http://www.corej2eepatterns.com/下载原始代码。5)原书不包含注解,目前的所有注解都是译注。6)原书申义未畅处,译文中以方括号[]加以解释、补足,略去生涩。这与上面三条原则一样,都类似于在原作讲话时的插嘴—但翻译任务本身,似乎本就已经是一种“插嘴”了。在博学的读者看来,有时候译者或许还不如保持体面的沉默—但我们只能力图做到插嘴而不多嘴。7)原书引用了Apache项目的若干代码,所以附录中包含Apache软件授权协议一页。中译本照录了这份法律文件,未加翻译。8)几个关键术语的译名考虑:*application:一般译为“应用程序”或“应用”。本书中这个词单独出现时,往往指的是“企业应用”,亦即企业信息应用系统。考虑到“应用程序”容易被理解为“桌面程序(desktopapplication)”,在该词含有“企业应用”意味时,我们译为“应用系统”,其他情况下则译为“应用”,以示区别。*client:译为“客户端”。但本书中所说的“客户端”常常是指特定组件的调用者,不一定是“桌面程序客户端”,反倒很可能本身也是另一种组件、甚至一个子系统。希望读者注意该词在书中的用法。*POJO:软件方法论大师MartinFowler在《PatternsofEnterpriseApplicationArchitecture》(PEAA)中创造的说法,是plainoldJavaobject的缩写,指普通Java对象(而不是EJB等组件)。中译本仍采用“POJO”名称。*enterprisebean:直译为“企业bean”,在本书中就是“enterpriseJavaBean/EJB”的另一说法。为了直观,我们统一译为“EJB”。*tier/layer:字面上都是“层”/“层次”。本书中“tier”指的往往是“架构”意义上的分层,比如“表现层”、“业务层”、“集成层”等,而“layer”既分享了前者的含义,有时也指tier内部的中间层次,比如“会话门面”就构成了客户端和业务服务之间的一个“layer”。这两种意思实在很难区分,中译本只能都译为“层”、“层次”。希望读者在阅读中体察这种细微差别。*delegate:是设计模式中的重要概念。一般译为“委派”。但在我们看来,这个译法还不完整,因为“委派”在汉语中只是动词,而delegate往往还充当名词。这次中译本的做法是,动词delegate仍译为“委派”,比如“A把功能F委派给业务层的B”,而名词delegate则译为“代表”,比如“B是A在业务层的代表”。希望读者体察,并推荐更好的译法。原书中所有模式、重构手法、策略的名称以斜体标出,要点以黑体标出。中译本一仍其旧。原书经多人、多版修订完成,难免有错漏、乱排之处。译者根据本书官方网站的最新勘误表订正,并结合参照本书第1版《CoreJ2EEPatterns:BestPracticesandDesignStrategies》(AddisonWesley,2001),另外修正了数十处错误。