第1部分 介绍 1
第1章 本书概述 2
1.1 使用开放源码技术 2
1.2 了解设计和开发理论 3
1.2.1 先测试 3
1.2.2 少即多 3
1.3 考察PetSoar项目 4
1.4 抓住基础 4
1.2.3 总是问傻问题 4
小结 5
第2章 应用概况 6
2.1 另一个宠物商店 6
2.2 了解可维护性的重要性 7
2.3 了解PetSoar的需求 7
2.4 检查结构和技术 8
2.4.1 查看结构 8
2.4.2 查看实用库 9
2.4.4 使用Web前端 10
2.4.3 使用存留和搜索 10
2.5 测式 11
小结 11
第2部分 建立开放源码工具箱 13
第3章 用JUnit进行单元测试 14
3.1 测试的类型 14
3.2 使用JUnit 15
3.2.1 JUnit的特征 15
3.2.2 写一个单元测试 15
3.2.3 运行一个单元测试 17
3.2.4 运行多个测试 18
3.2.5 你需要知道JUnit的一切 21
小结 28
第4章 用Mocks测试对象的交互作用 30
4.1 测试对象的交互作用 30
4.1.1 考察测试状态中的一些易犯错误 30
4.1.2 探索替换物:测试交互作用 31
4.2 使用模拟对象 32
4.2.1 实例场景 32
4.2.2 了解模拟对象的角色 34
4.2.3 了解模拟对象库 35
4.2.4 使用动态模拟 35
小结 39
第5章 用Hibernate存储对象 40
5.1 了解持久化的复杂性 40
5.2 用Hibernate 2持久化对象 41
5.2.1 创建持久类 41
5.2.2 映射类到数据库中 43
5.2.3 配置Hibernate 45
5.2.4 获得一个会话 47
5.2.5 在数据库中存储对象 49
5.2.6 从数据库中检索对象 51
5.2.7 查询对象 51
5.2.8 持久化对象间的联系 53
5.3 持久化层次结构对象 58
5.4 了解Hibernate工具箱 60
5.5 Hibernate同其他竞争技术的比较 60
5.5.1 Hibernate与EJB 60
5.5.2 Hibernate与JDO 61
小结 62
5.5.3 Hibernate与DAO框架 62
第6章 使用WebWork实现MVC模式 63
6.1 了解模型视图控制器 63
6.1.1 检查模型层 63
6.1.2 检查视图层 64
6.1.3 检查控制器层 64
6.1.4 把全部层联系在一起 64
6.1.5 考证使用MVC的理由 65
6.2.2 考察WebWork 66
6.2 了解MVC、WebWork和XWork 66
6.2.1 考察XWork 66
6.3 进一步了解活动 68
6.3.1 一个简单的XWork实例 68
6.3.2 配置XWork 69
6.3.3 构造活动(活动组成) 69
6.3.4 从XWork中调用一个活动 71
6.3.5 使用参数和ActionContext 72
6.4.1 了解XWork结果和活动链 73
6.4 应用物理学中的牛顿第三定律 73
6.4.2 考察WebWork结果和Servlet环境 74
6.4.3 配置WebWork 75
6.4.4 了解调度的角色 76
6.4.5 考察JSP和Velocity中的视图实例 77
6.4.6 基于组件的Web开发 80
6.5 表达你自己 84
6.5.1 使用基础表达式 85
6.5.2 使用高级表达式 86
6.5.3 了解ValueStack 87
6.6 考察类型转换 89
6.6.1 深入研究一个日期实例 89
6.6.2 指定默认转换规则 90
6.6.3 指定新的转换规则 90
6.7 采用截取器分离事务 91
6.7.1 配置截取器栈 91
6.7.2 使用记录截取器 92
6.8.1 考察一个没有使用XWork验证框架的实例 93
6.8 Validation——一个强大的截取器 93
6.7.3 构建自己的截取器 93
6.8.2 考察一个采用XWork验证框架的实例 94
6.8.3 使用内置的和用户自定义的验证 95
6.8.4 使用验证表达式 97
小结 97
第7章 用SiteMesh简化布局 98
7.1 识别布局的问题 98
7.2.1 装饰器设计模式 102
7.2 使用面向对象的解决方案 102
7.2.2 组合设计模式 104
7.2.3 结合模式 105
7.3 用SiteMesh实现解决方案 106
7.3.1 SiteMesh的基本原理 106
7.3.2 创建一个装饰器 106
7.3.3 组成网页 109
7.3.4 考察SiteMesh 112
7.4.1 将装饰器分组 115
7.4.2 不要惧怕引用 115
7.4 使用技巧 115
7.4.3 CSS是你的朋友 116
7.4.4 最小化HTML 116
7.4.5 分散关注点 116
小结 117
第8章 用Lucene添加搜索能力 118
8.1 了解搜索的复杂性 118
8.2.2 索引一个文件 119
8.2.1 了解Lucene的元素 119
8.2 Lucene简介 119
8.2.3 搜索文件 122
8.2.4 重新索引和删除一个已索引的文档 124
8.2.5 使用高级搜索 124
8.2.6 定制标志的进程 125
小结 126
第9章 用XDoclet生成配置文件 127
9.1 XDoclet简介 127
9.2 用XDoclet了解面向属性编程 127
9.2.1 了解属性的语法 129
9.2.2 运行XDoclet 130
9.2.3 用XDoclet应用高级的Hibernate或映射 133
9.2.4 使用XDoclet生成更复杂的工件 135
9.2.5 了解XDoclet任务和子任务 138
9.2.6 有效地使用XDoclet 139
小结 141
第10章 交流与工具 142
10.1 考察PetSoar开发 142
10.2.2 使用源码交流 144
10.2.1 用一切可能的方法交流 144
10.2 管理不完善的交流 144
10.2.3 使用交流作为学习的工具 146
10.3 考察工具箱 146
10.3.1 源代码配置管理——CVS 146
10.3.2 知识管理——WiKi 147
10.3.3 邮件目录——Majordomo 147
10.3.4 实时讨论——IRC和即时消息 147
10.3.5 IDEIDEA和Eclipse 147
10.4 使用连续集成 148
10.3.6 问题追踪和任务管理——JIRA 148
小结 149
10.5 把工具连接在一起 149
第11章 省时工具 151
11.1 了解实用组件 151
11.2 了解OSCache 152
11.2.1 介绍SampleNewscom 152
11.2.2 使用LOOP测试 152
11.2.3 考察OSCache标识符库 154
11.2.4 了解OSCache概念 155
11.2.5 缓存时间实例 156
11.2.6 查看高级的OSCache特征 157
11.3 了解Commons Lang 157
11.3.1 考察最有用的类 158
11.3.2 使用Builder类 158
11.4 了解Commons Collections 161
11.5.1 考察Commons Logging的优点 162
11.5.2 一个简单的实例 162
11.5 了解Commons Logging 162
11.6 了解Commons Digester 163
11.6.1 考察一个Digester实例 164
11.6.2 了解Digester规则 166
小结 167
第3部分 开发应用 169
第12章 建立开发环境 170
12.1 在IDE内工作 170
12.1.1 问题:IDE不是自动化的 171
12.2.1 问题:Ant不是万灵药 172
12.1.2 解决办法:自动构建工具 172
12.2 将Ant用于你全部的构建需要 172
12.2.2 解决办法:使用有意义的方法 173
12.3 使用杂交处理方法 173
12.4 组织你的项目 174
12.4.1 通过类型组织文件结构 175
12.4.2 通过部署组织文件结构 176
12.4.3 选择一个结构 177
12.4.4 PetSoar怎样 177
12.5.1 了解测试类型 178
12.5 管理单元测试 178
12.5.2 考察测试小组、JUnit和批量测试 179
12.6 使用版本控制 180
12.7 部署PetSoar 180
小结 182
第13章 了解测试驱动开发 183
13.1 为什么先测试 183
13.1.1 先测试与后测试 184
13.1.2 锁定需求 185
13.2.2 从不跳过失败的测试 186
13.2 了解测试技术 186
13.2.1 将单元测试与代码放在同一程序包中 186
13.2.3 使用模拟对象孤立无法测试部分 187
13.2.4 何时使用接口和类 187
13.2.5 保持简洁 187
13.2.6 自顶向下工作 188
13.2.7 使用许多小的对象 188
13.2.8 保证测试组快速运行 188
13.3.1 使用TDD的实例场景 189
13.2.9 避免静态和单件 189
13.3 测试TDD循环 189
13.3.2 实例场景重访 191
13.3.3 加强功能 192
小结 194
第14章 管理生命周期和组件依赖 195
14.1 了解组件和服务 195
14.2 处理依赖 195
14.2.1 使用直接实例化 195
14.2.2 使用工厂 196
14.2.3 使用注册 197
14.2.4 使用容器 197
14.3 了解组件生命周期 198
14.4 了解反转控制 198
14.4.1 考察优点 199
14.4.2 考察缺点 199
14.5 了解分离关注点(Separation of Concerns) 200
14.6 使用容器来定义范围 200
14.7.1 配置容器 201
14.7 使用XWork的容器 201
14.7.2 了解容器是如何工作的 202
14.8 测试XWork组件 203
小结 205
第15章 定义域模型 206
15.1 考虑域模型的优势 206
15.2 处理层 206
15.2.1 层驱动与特性驱动方法的比较 207
15.2.2 选择自底向上、自顶向下、中间分离 208
15.3 确定当前的目标 209
15.4 向店中添加一个宠物 209
15.4.1 使用Hibernate实现PersistenceManager 212
15.4.2 我们的进展 220
15.5 检索宠物 220
15.5.1 检索一个单一的宠物 223
15.5.2 我们的进展 226
15.6 持续分类目录 227
15.6.2 实现CategoryPet关联 230
15.6.1 我们的进展 230
15.6.3 我们的进展 234
15.7 考虑性能和可维护性 235
小结 236
第16章 创建基于Web的界面 237
16.1 添加一个宠物 237
16.1.1 创建AddPet活动 237
16.1.2 为AddPet创建视图 240
16.1.3 把全部连在一起试用 242
16.2.1 创建一个ViewPet活动 243
16.2 显示一个宠物 243
16.2.2 重构活动 246
16.3 编辑宠物 249
16.3.1 检查有效性 251
16.3.2 把全部连接在一起——第二次试用 251
16.4 把宠物从这里拿走 252
16.5 重构CRUD 256
16.5.1 消除在ViewPet和RemovePet中的重复 256
16.5.2 剩下的工作 258
16.5.3 完成最后一个重构 260
16.5.4 解耦验证 261
16.6 更换宠物 264
小结 266
第17章 定义导航、布局、视觉和感觉 267
17.1 组件化窗口组件表单 267
17.2 形成更美妙的视感和感觉 270
17.3 使用样式化风格 272
17.4 导航到更好的用户界面 275
小结 277
第18章 实现浏览和查询功能 278
18.1 定义应用需求 278
18.2 浏览分类列表 278
18.3 浏览宠物列表 280
18.4 搜索商店中的宠物 283
18.4.1 实现LuceneSearehcr 285
18.4.2 实现LuceneIndexer 288
18.4.3 进行到哪里了 296
18.4.4 查询任何类型的数据 296
18.4.5 进行到哪里了 303
18.4.6 实现全文检索 304
18.4.7 实现分页 305
18.5 把它组装起来 308
小结 310
第19章 增加购物车 311
19.1 创建购物车 311
19.2 创建WebWork活动 313
19.3 购物车结账 315
小结 325
第20章 保护应用 326
20.1 理解J2EE安全模型 326
20.2 简化安全 328
20.2.1 使用HTTP请求包装器 328
20.2.2 使用安全过滤器 329
20.2.3 使用登录过滤器 330
20.2.4 在保护下工作 331
20.3 使用更优雅的方法 332
小结 333