虽说J2EE是当今企业级开发的主要平台,但也很难根据当前业务需求很快地发布J2EE解决方案。本书给出了可以贯穿整个项目周期的完整、实用的快速开发基础,其中介绍的最佳实践和工具不仅可以加速开发,而且还有助于开发人员更好地适应项目不断增加的复杂度和不断的修改。读者将学习如何充分应用迭代开发、模型驱动架构(MDA)、代码生成工具、面向方面编程(AOP)、测试驱动开发等等。此外,本书还介绍了:
●定义端到端的J2EE开发策略,这些策略可以在不降低软件质量的前提下提高开发速度。
●理解设计时的决策是如何影响整个项目进度的。
●构建能够促进快速开发的敏捷应用架构。
●使用UML模型流线化系统设计和验证。
●通过代码生成和对象-关系映射加速数据库开发。
●实用的测试驱动开发方法,包括构建自动化的单元测试套件以及使用模拟对象进行内部测试。
●充分发挥Eclipse和其他IDE的功能。
如果你是J2EE开发人员、项目负责人或经理,可能经常会处于快速发布高质量应用程序的压力之下,本书提供了所有必需的技巧和资源。
无
“三个月,否则你就完了!”
这是在我很久以前参加的一个会议的主发言人的开场白。该发言人认为,三个月是将想法变成真正产品或解决方案的期限。超过三个月,这个想法就会过时,就会由于竞争被淘汰。
这个发言人演讲的其他部分已经逐渐被我淡忘。我只记得这个发言人后来还谈到了B2B和C2B电子商务的复杂性问题,但是当时我的注意力不在那里。但有一点我印象深刻:业务世界已经进入Internet时代,使用Internet,就有了新的度量单位——Internet时间。
该发言人的开场白成为了我的软件工程方法的分水岭。质量是所有项目的基础。然而,支持快速变化的需求还带来了另一个极重要的问题:快速。
当今业务以非常快的速度向前发展,支撑这些业务的企业系统要求与这些业务保持同步。作为软件专业人士,我们不仅要发布高质量的软件,而且还需要减少开发时间。将二种要求结合将提高系统的复杂度。如今,系统框架局限于单个组织的时代已经过去,Internet电子商务的诱惑产生了需要在全球范围进行集成系统的需求。
满足这些需求并不简单。事实上,从来没有简单过。在Fredrick P. Brooks的著作《No Silver Bullet》中,Brooks指出软件开发技术没有重大突破,因此生产力的提高只在一个数量级内变化[Brooks,1987]。尽管这篇著作是十几年前发表的,但是Brooks的论断还是正确的。尽管这篇著作已经认识到无法解决软件开发的必要复杂问题,但是业务世界还将持续对软件专业人士提出需求,而不管IT行业内在中短期时间内发布高质量软件的历史纪录有多糟糕。进一步分析该问题会发现,这是由于软件开发商之间残酷的竞争造成的,开发商都希望通过高风险的投标获得新项目,从而压倒竞争对手。
因此,IT专业人士面临着一个障碍。要保持与这些稳步提高的需求以及不断激烈的竞争同步,软件开发人员不得不采用许多新的或已有方法、技术和工具。敏捷方法就是这些无法按时完成项目的人的万能药。“敏捷”这个词深受欢迎,敏捷建模技术的支持者希望能对整个系统开发方法进行革新。同样,也有人在考虑使用除面向对象以外的模式,探寻是否可以应用面向方面编程及其编织(weave)和切入点(crosscut)特性。支持这些新思想和技术是最先进开发工具的基础,这些工具将有助于软件工程师为Java 2平台引入这些技术。
IT世界是一个快速变化的世界,这不仅仅是针对技术领先性而说的。如今,那位发言人的话更正确了:三个月,否则你就完了。
本书内容
本书并不是旨在推广能够大大减少项目开发时间的新开发方法,也不是无条件地讨论速度问题,更不是要提高开发速度而牺牲产品质量。相反,本书定义了一系列软件工程实践,旨在提高J2EE项目的效率和质量。
本书所介绍的大多数技术都是主流技术,并且提供了企业快速解决方案的新视角。此外,并不是所有的技术都适用于所有给定的情景。相反,重点在于用与当今构建性价比优异的高质量解决方案流程相关的新思想和实用技巧武装软件工程师的头脑。
本书的读者对象
本书适用于任何希望从事J2EE平台企业级别系统开发的人员。无论读者是架构师、设计人员、开发人员或测试人员,本书将有助于您提高工作效率。
首先,本书首要读者群是软件工程师。不过,同样适用于与开发人员协同工作或管理开发人员的人群。
软件工程师的称谓应该进一步提高。IT专业人士都喜欢将所有的称谓打印在其商业名片上,从系统分析师到企业架构师,以及质量专家和IT顾问。然而,真正的软件专业人员其实是真正的多面手,他们可以担任一个项目中的多个预定义角色,当然没必要是所有角色。只有这种软件工程师,才是真正的软件工程师。暂且将角色的技术性描述或相关的计算机科学家的称谓放在一边,软件工程师不仅要了解其职业,同样还要了解职业所需的技术,并且可以在项目的不同阶段做出贡献,无论是分析、设计、实现或测试。而且,软件工程师会不断探索改进工作思路。简而言之,软件工程师应该理解自我提高和持续学习是作为IT专业人士的基本要求。
如果你认为以上介绍适合你,就可以开始阅读本书。
本书的组织结构
本书内容由四部分组成。
第一部分:适应性流程
第1章:J2EE适应性基础。本章介绍创建快速开发的适应性基础的基本概念。
第2章:快速应用程序开发。本章介绍了软件快速开发相关的常见技术,包括快速开发语言、创建原型的方法以及时间盒式开发方法。
第3章:应用适应性方法。本章介绍了应用迭代式方法构建软件这种轻权方法的重要性。
第二部分:敏捷架构
第4章:快速开发的设计。本章介绍如何根据项目时间框架在设计阶段做出选择。
第5章:软件建模。本章介绍应用模型构建软件架构,具体包括如何使用UML图实现系统设计的交流、验证和解释。
第6章:代码生成。本章介绍了主动和被动代码生成的优点。结合示例,详尽介绍了使用XDoclet以及Apache的Velocity模板引擎如何生成企业JavaBean代码制品。
第7章:快速开发和数据库。数据访问代码的重复性使得这些代码非常适合代码生成技术。本章将介绍如何使用代码生成工具(例如Middlegen)节省开发时间,以及对象-关系映射产品如何方便地将面向对象技术与数据库的关系技术进行混合。
第8章:模型驱动的架构。本章将模型与代码生成技术相结合来探讨MDA模式。此外,还结合示例,介绍如何使用开源的MDA工具AndroMDA。
第三部分:快速语言
第9章:脚本。本章将介绍脚本语言的优点以及与Java兼容的脚本语言Jython。
第10章:使用规则。本章介绍了使用规则引擎维护业务逻辑的优点。开源工具专家系统shell——Jess作为基于规则语言的例子进行介绍。
第11章:面向方面编程。面向方面编程(AOP)为模块化相交关注点提供了新的语言结构。它是在应用程序动态应用变化的强大机制。本章还介绍了AOP语言AspectJ和AOP框架AspectWerkz。
第四部分:动态环境
第12章:最优构建。本章介绍了使用高效优化流程执行快速开发的重要性。
第13章:集成式开发环境。本章介绍使用完善的集成式开发工具的必要性。开源工具Eclipse将作为适合J2EE开发环境的例子进行介绍。
第14章:测试驱动的开发。测试驱动的开发是定义支持需求和设计变化方法的关键。本章将介绍构建自动化单元测试组件的重要性,此外还包括了对能编写单元测试以及测试中使用的模拟对象的JUnit框架的介绍。
第15章:高效的质量保证。最后一章将介绍如何使用自动化测试工具执行功能测试和性能测试。开源工具HttpUnit和Apache的JMeter将作为示例介绍。
关于软件
本书所使用示例都尽可能使用了开源软件。这种方法为快速开发技术提供了低成本的选择。在没有可用的开源软件产品时,我选择了一些能够提供免费试用版本的商业产品。只有很少的示例使用了商业产品,这是因为这些商业产品是特定技术的最佳效果产品。
本书所包含的内容
本书内容部分属于软件管理,部分属于软件开发,如果不应用这两方面的原则,快速开发将无法实现。
尽管本书内容横跨了整个开发流程,但这并不是项目生命周期的教科书。本书只是给出了一些关于思想、流程和技术的详细信息,读者可以根据需要定制适用于企业级别J2EE开发的流程。
并不是所有的技术都适用于所有情况。相反,必须熟悉本书给出的思想,然后再根据自己掌握的技巧和经验确定哪些技术能够为特定项目带来益处。
本书给出的技术和实践包括了所有有代表性的软件工程最佳实践。其用意是介绍更广泛的内容,而不是局限在特定内容上。快速示例也说明了所介绍的概念,这样读者可以快速掌握特定话题。每章都包括了一些链接和参考,通过它们能够找到所介绍技术和实践的更多信息。
致 谢
很少有书是一个人能完成的,本书也不例外。我要感谢帮助我完成本书编写的所有人,以及帮助我审校草稿,提供建议,或者是鼓励我继续前进的人。
自从编写本书以来,Prentice Hall的组稿编辑Jill Harry就一直密切关注、帮助我完成编写图书的整个过程。同样,开发编辑Jennifer Blackwell教会我一些如何保持良好写作风格的技巧。
我有一个伟大的审校团队:Bernard Farrell、Beth Stearns、Madhu Siddalingaiah、Martin Westacott、Satadip Dutta和Shane Griggs。感谢你们当中的所有人,感谢你们严谨的工作态度和花时间回答我的问题。
非常感谢Ian Macfarlane与我共享他关于本书结构的想法,以及不时帮助我审校这些章节。
还要感谢Garry Downes,是他不断地为我指出相关的文章、论文和Web站点的位置。Garry提供的意见帮助我在这本书中实现了我所有的想法和概念。
此外,还要感谢我的父母Sheila和Derek,以及我的姐妹Jill和Ann。尽管他们在地球的另一端,但是他们通过电话和电子邮件给了我巨大的鼓励。
最后还要感谢我的合伙人Mary,是她在我编写此书时帮我搜集了大量资料,并且一直支持我。谢谢你,Mary,感谢你的耐心、支持以及敏锐的眼光。
Alan Monnox:Alan Monnox: Alan Monnox是HP公司的解决方案架构师,专门负责J2EE平台企业解决方案的开发。他对面向对象项目有15年以上的经验,曾参与过银行系统以及GPS浏览软件等项目的开发。Alan对在更短的时限内开发更高质量的软件具有独到见解,他在面向对象项目开发中所获得的大量经验,为他解决J2EE项目中涉及的复杂性和延期问题提供了必要的知识。
武欣 董怡然 贾顺林 等:暂无简介
J2EE平台开发是一个非常大的话题,这是由于J2EE本身的复杂性和可应用技术的多样性造成的。快速开发则是当今软件行业所追求的目标之一。IT行业,尤其是软件行业的专业人士都知道,软件开发最缺乏的资源就是时间。本书介绍了如何合理利用这个稀缺资源,如何利用不同的方法来实现快速开发。
本书结合一些开源工具,详尽介绍了如何实现J2EE平台下的快速开发。可以看出,本书作者积累了大量软件开发的经验,能够从软件开发的常规流程角度对问题进行深入浅出的剖析。
本书结构合理,言简意赅;但是介绍的内容具有一定的难度,对于不熟悉J2EE平台以及快速开发的开发人员来说,需要具有一定的预备知识才能掌握并消化本书介绍的内容。
从内容上看,本书所涵盖的内容比较丰富,包括:
1) J2EE适应性流程,其中包括适应性基础的创建、快速应用程序开发方法论以及适应性方法的应用。
2) 架构介绍,其中包括快速开发所需的设计、建模以及代码生成等。这几项内容都是结合当今最流行的开源工具进行介绍,实用性很强。
3) 快速开发所使用的语言,包括脚本、规则引擎以及面向方面编程的介绍。其中面向方面编程是最近非常热门的开发模式。
4) 开发环境的建设,其中包括所使用的IDE工具的选择、脚本语言的使用以及测试驱动的开发方法。
本书最大的特色是能够结合当今流行的开源工具进行介绍,它非常适于希望从事J2EE开发的编程人员以及负责项目管理、能够影响项目决策的高层人员阅读。
参与本书翻译工作的有:武欣、董怡然、贾顺林、于苗苗、邓一凡、余勇、罗云峰、吴晓华、张春梅、管丁以及李国梁。本书由武欣统一审校。由于能力有限,加之时间较紧,错误和失误在所难免,恳请专家读者不吝指出。
第一部分 适应性流程
第1章 J2EE适应性基础
11 快速开发的需要
12 企业挑战
13 J2EE平台
14 定义适应性基础
141 为什么需要基础
142 为什么是适应性
15 确定快速开发的基础
151 人员
152 工具
153 框架
154 实践
155 标准
156 流程和过程
157 培训
158 持续的改进
16 基础投资的优点
17 关键的成功因素
171 获得开发人员的认可
172 教育
173 管理层支持
18 小结
第2章 快速应用程序开发
21 RAD的常见元素
211 时间盒式开发
212 与领域相关的语言
213 软件重用
214 高效率工具
215 快速建立原型
22 使用原型
221 建立原型的方法和原型类型
222 抛弃式和进化式原型的选择
23 小结
第3章 应用适应性方法
31 为什么要使用方法学
32 瀑布生命周期模型
321 经典的瀑布模型
322 优点和缺陷
323 示例研究
33 迭代式开发
331 迭代式方法的优点
332 迭代式流程
34 RUP的介绍
341 用例驱动的流程
342 在RUP中使用迭代式开发
343 RUP流程的阶段
344 原则
345 RUP的元素
346 计划
347 企业项目的支持
348 RUP的缺点
35 敏捷方法
36 XP的介绍
361 XP实践
362 计划
363 设计
364 编码
365 测试
366 XP的角色
367 对J2EE项目采用XP
37 小结
第二部分 敏 捷 架 构
第4章 快速开发的设计
41 架构和设计目标
42 RAD架构和设计
421 发挥团队力量
422 使用最佳特性的框架
423 预先思考
424 注意重用设计
425 应用正交设计
426 采用分层架构
43 走近J2EE架构
431 两层架构和多层架构
432 企业JavaBean
433 远程和本地客户端视图
434 分布式组件
435 选择合适的设计
436 以Web为核心的架构
437 以EJB为核心的架构
44 小结
第5章 软件建模
51 为什么要使用模型
511 交流
512 验证
52 架构的多视图
53 统一建模语言
531 用例图
532 活动图
533 类图
534 交互图
535 状态图
536 部署图和组件图
54 常见缺陷
55 建模工具
551 选择建模工具
552 UML支持
553 模型验证
554 正向工程和反向工程
555 设计模式支持
56 为什么建模工具会失败
57 成功使用建模工具
58 小结
第6章 代码生成
61 什么是代码生成
62 被动代码生成器
621 使用Apache Velocity生成代码
622 被动代码生成的优点
63 主动代码生成器
631 主动代码生成的优点
632 主动代码生成器和样板代码
64 面向属性编程
641 属性是什么
642 属性和预处理器指令
643 J2SE 50的注释与属性
65 XDoclet的介绍
651 安装XDoclet
652 设置Ant构建文件
653 创建会话bean
66 使用主动生成的代码
67 小结
第7章 快速开发和数据库
71 数据库的困境
711 企业数据的价值
712 对象-关系阻抗不匹配
72 数据访问选项
721 Java数据库连接
722 对象/关系映射工具
723 实体bean
724 Java数据对象
73 代码生成和O/R映射
731 Hibernate的介绍
732 Middlegen的介绍
74 设置数据库
741 MySQL的介绍
742 创建数据库模式
743 运行数据库脚本
75 生成持久层
751 使用Ant运行Middlegen
752 Middlegen的GUI
753 Hibernate O/R映射文档
754 从映射文档到Java文件
755 完成往复过程
76 小结
第8章 模型驱动的架构
81 MDA工具的承诺
82 MDA的介绍
821 平台
822 模型
823 映射
83 MDA与传统建模的比较
831 优点
832 缺陷
84 MDA兼容工具
85 AndroMDA的介绍
851 使用XMI与模型交互
852 PIM标记
853 MDA Cartridge
854 Cartridge的剖析
855 Cartridge模板
856 应用AndroMDA
857 AndroMDA 30
86 小结
第三部分 快 速 语 言
第9章 脚本
91 为什么用脚本语言
92 脚本语言的特性
921 团队经验
922 跨平台
923 与Java类的集成
93 Jython介绍
931 安装Jython
932 运行脚本
933 Jython语言
934 与Java集成
935 构建用户界面原型
936 创建Jython servlet
94 Groovy
95 小结
第10章 使用规则
101 业务规则
1011 业务规则是什么
1012 业务规则的结构
1013 业务规则的动态特性
102 软件的业务规则
1021 硬编码的规则
1022 规则定义语言
1023 系统和业务逻辑的紧耦合
1024 规则重复
103 规则引擎
1031 基于规则的系统
1032 企业系统的规则引擎
104 Jess的介绍
1041 安装Jess
1042 Jess示例
1043 Jess和Java
105 Java规则引擎API
106 企业级别的规则引擎
1061 企业规则引擎特性
1062 规则引擎评估条件
107 小结
第11章 面向方面编程
111 为什么使用AOP
1111 正交关注点
1112 代码混乱和分散
1113 解决正交关注点的传统方法
112 AOP的介绍
1121 概念和术语
1122 单驼峰和龙
1123 编织方法
113 AspectJ的介绍
1131 AspectJ和Eclipse
1132 AspectJ编译器
1133 AspectJ示例
114 语言和框架
115 AspectWerkz的介绍
1151 XML的方面定义
1152 作为元数据注释的方面
1153 AspectWerkz编织选项
1154 面向方面的中间件
116 应用 “方面”
1161 开发 “方面”
1162 产品化 “方面”
1163 AOP和其他模式
117 小结
第四部分 动 态 环 境
第12章 最优构建
121 时间和动作
1211 软件生产线
1212 软件开发的时间和动作
122 构建流程
1221 设计构建流程
1222 J2EE构建需求
1223 热部署是什么
123 Ant的介绍
124 使用Ant实现最小构建
1241 构建依赖的重要性
1242 定义Ant中的构建依赖关系
125 使用子项目
126 查看构建依赖关系
127 标准的构建目标
128 项目的组织
1281 源代码目录
1282 类库目录
1283 构建目录
1284 发布目录
129 与IDE的集成
1210 使用Jython扩展Ant
12101 创建新的Ant任务
12102 编译Jython类
12103 测试新任务
1211 小结
第13章 集成式开发环境
131 为什么使用IDE
132 Eclipse的介绍
1321 Eclipse是什么
1322 安装和运行Eclipse
1323 Eclipse工作区
1324 Eclipse工作台模式
1325 使用插件工具扩展工作台
133 企业级开发所需的IDE特性
1331 代码向导
1332 编辑器对多文件类型的支持
1333 Ant集成
1334 使用代码生成器
1335 服务器控制和应用程序部署
1336 建模支持
1337 数据库访问
134 使用Eclipse调试J2EE应用程序
1341 Java平台调试器架构
1342 调试J2EE应用程序
1343 热交换
1344 JSP调试
1345 调试指南
135 小结
第14章 测试驱动的开发
141 测试作为开发模式
1411 测试驱动开发的优点
1412 测试驱动开发的代价
142 JUnit的介绍
143 生成单元测试
1431 使用Eclipse生成单元测试
1432 单元测试和MDA
1433 使用AndroMDA生成测试用例
144 彻底测试
1441 模拟对象是什么
1442 使用模拟对象
1443 模拟对象类型
1444 动态模拟对象
1445 静态模拟对象和动态模拟对象的选择
145 小结
第15章 高效的质量保证
151 质量保证
1511 项目环境
1512 测试流程
1513 RAD项目测试
152 自动化测试
1521 J2EE测试的挑战
1522 自动化测试工具
153 功能测试
154 HttpUnit的介绍
1541 HttpUnit和JUnit
1542 使用HttpUnit编写测试
155 负载测试和压力测试
156 JMeter的介绍
1561 使用JMeter测试MedRec
1562 创建一个线程组
1563 配置元素
1564 逻辑控制器
1565 采样器
1566 侦听器
1567 执行测试计划
1568 分析结果
157 JMeter使用指南
158 小结
附 录
附录A 缩略词
附录B 参考用书