第1篇 总述 3
第1章 概述 3
1.1 EJB前奏 4
1.1.1 软件组件 4
1.1.2 呼唤组件化 4
1.2 分布式应用的中间件需求 5
1.2.1 应用服务器级软件 7
1.2.2 标准化组件框架 7
1.3 企业Bean技术 8
1.3.1 钟情Java 9
1.3.2 业务层组件——EJB 10
1.3.3 分布式计算:EJB的支撑 11
1.3.4 EJB中间件服务 13
1.3.5 EJB应用生命周期中的角色 14
1.3.6 EJB生态圈 17
1.4 面向服务架构及EJB 19
1.5 终极无间——可重用服务 20
1.6 Java EE 5.0 22
1.7 小结 26
2.1 传统EJB组件的具体构成 27
第2章 传统的EJB 27
2.2 开发与部署传统EJB组件 29
2.2.1 远程接口 31
2.2.2 本地接口 31
2.2.3 Home接口 32
2.2.4 本地Home接口 33
2.2.5 Bean类 34
2.2.6 部署描述符 35
2.2.7 部署企业Bean组件 35
2.2.8 HelloWorldEJB客户 36
2.3.1 复杂性——EJB 2.x的突出问题 38
2.3 剖析EJB 2.x 38
2.3.2 如何改进EJB 2.x 41
2.4 小结 42
第3章 新一代EJB 43
3.1 介绍EJB 3.0 43
3.1.1 EJB容器 44
3.1.2 EJB组件类型 46
3.1.3 EJB使用的RMI-IIOP 48
3.1.4 EJB与位置透明性 49
3.1.5 EJB环境 50
3.1.6 剖析EJB 3.0 51
3.1.7 Home与对象接口的作用 54
3.2.1 消除Home与对象接口 55
3.2.2 消除组件接口 55
3.2 简化的EJB 3.0 API 55
3.2.3 使用注释 56
3.2.4 简化对环境的访问 59
3.3 打包并部署EJB 3.0组件 60
3.4 EJB 3.0组件实例 61
3.4.1 业务接口 62
3.4.2 Bean类 62
3.4.4 EJB客户 63
3.4.3 部署描述符 63
3.5 术语集合 64
3.6 小结 65
第2篇 EJB组件和实体 69
第4章 会话Bean介绍 69
4.1 会话Bean的生命周期 69
4.2 会话Bean的子类型 70
4.2.1 无状态会话Bean 70
4.2.2 有状态会话Bean 71
4.3.1 实现实例池功能 72
4.3 有状态会话Bean的不同点 72
4.3.2 维护会话状态的规则 73
4.3.3 激活和挂起回调 74
4.3.4 回调方法小结 77
4.3.5 一个简单的有状态会话Bean组件 77
4.3.6 会话Bean的生命周期流程图 86
4.4 小结 89
第5章 将会话Bean发布为Web服务 91
5.1 Web服务概念 91
5.1.1 Web服务标准 93
5.1.2 XML文档和平台无关性 96
5.2 实现Web服务 97
5.2.1 WSDL和XML/Java映射 99
5.2.2 打包和部署暴露Web服务的会话Bean 100
5.3 实现Web服务客户 101
5.4 小结 102
第6章 Java持久化API 103
6.1 对象关系映射 104
6.2 何为实体 106
6.2.1 实体与会话Bean 107
6.2.2 持久化提供者 107
6.2.3 实体类 108
6.2.4 访问持久化上下文中的实体 110
6.2.5 打包和部署实体类 114
6.3 EntityManager API 115
6.3.1 实体的生命周期 116
6.3.2 数据库同步 119
6.4 小结 125
第7章 消息驱动Bean介绍 127
7.1 使用消息的动机 127
7.2 Java消息服务 129
7.2.1 消息域 130
7.2.2 JMS API 131
7.3 集成JMS和EJB 134
7.4 开发消息驱动Bean 138
7.4.1 语义 138
7.4.2 一个简单实例 140
7.5 高级概念 145
7.5.1 事务 145
7.5.2 安全性 145
7.5.3 负载均衡 145
7.5.4 群集中消息的重复消费 146
7.6 基于JMS的消息驱动Bean陷阱 147
7.6.3 坏消息 148
7.6.1 消息顺序 148
7.6.2 错过调用@PreDestroy 148
7.6.4 如何将结果返回给消息生产者 151
7.6.5 异步方法调用 154
7.7 小结 155
第8章 扩充EJB组件的功能 157
8.1 从EJB组件调用其他EJB组件 157
8.2 Annotation 159
8.2.1 公用注释 159
8.2.2 业务接口注释 160
8.2.3 用于有状态会话Bean的注释 161
8.2.4 依赖注入 164
8.2.5 拦截器 167
8.3 小结 172
第3篇 高级EJB概念 175
第9章 高级持久化概念 175
9.1 继承 176
9.1.1 各类继承结构使用单个表 179
9.1.2 各子类使用单独的表 184
9.1.3 各具体实体类使用单个表 186
9.1.4 其他继承模式 186
9.2 多态 188
9.3 关系 190
9.3.1 关系类型 190
9.3.2 1∶1关系 191
9.3.3 1∶N关系 196
9.3.4 M∶N关系 204
9.4 改进的EJB-QL 210
9.4.1 批量更新和删除 211
9.4.2 连接操作 214
9.4.3 GROUP BY和HAVING从句 214
9.4.4 投影 215
9.4.5 高级查询操作 216
9.4.6 在SELECT从句中构造对象 217
9.5 小结 218
第10章 事务 219
10.1 使用事务的动机 219
10.1.1 原子操作 220
10.1.2 网络或机器故障 221
10.1.3 多用户共享数据 221
10.2 事务带来的优势 222
10.3 事务模型 224
10.3.1 平面事务 225
10.3.2 嵌入式事务 226
10.3.3 其他事务模型 227
10.4 分布式事务 227
10.4.1 持久性和2PC协议 228
10.4.2 事务通信协议和事务上下文 229
10.5 Java事务服务和Java事务API 230
10.5.1 OTS和Java事务服务 230
10.5.2 Java事务API 230
10.5.3 JTS和跨应用服务器的分布式事务互操作 231
10.6.2 容器管理、Bean管理及客户控制的事务 232
10.6.1 底层事务系统抽象 232
10.6 EJB事务 232
10.6.3 选择事务风格 235
10.7 容器管理事务 236
10.7.1 EJB事务属性的取值 236
10.7.2 容器管理事务实例 239
10.7.3 应用事务属性到各种EJB组件中 241
10.8 Bean管理事务 243
10.8.1 javax.transaction.UserTransaction接口 243
10.8.2 Bean管理事务实例 245
10.9 客户控制的事务 246
10.10.1 并发控制的必要性 247
10.10 事务隔离 247
10.10.2 隔离级别 248
10.10.3 脏读问题 249
10.10.4 不可重复读和可重复度 250
10.10.5 幻影读问题 251
10.10.6 事务隔离小结 251
10.10.7 在EJB应用中使用各种隔离级别 251
10.10.8 悲观和乐观并发控制 252
10.11 设计EJB中的事务会话 253
10.12 小结 255
第11章 安全性 257
11.1 介绍 257
11.1.1 侵害、弱点和风险 258
11.1.2 控制 259
11.2 Web应用的安全性 260
11.2.1 Web应用的认证 261
11.2.2 授权 262
11.2.3 机密性和集成性 263
11.3 理解EJB安全性 263
11.3.1 EJB应用的认证 263
11.3.2 EJB中的授权 273
11.3.3 安全性传播 283
11.4 安全性互操作 284
11.4.1 基于SSL的IIOP 284
11.4.2 CSIv2 285
11.5 Web服务中的安全性 286
11.5.1 端对端的安全性 287
11.5.2 XML数字签名和XML加密 288
11.5.3 SAML 290
11.5.4 WS-Security 291
11.6 小结 293
第12章 EJB定时器 295
12.1 任务调度 295
12.2 EJB和任务调度 296
12.3 EJB定时器服务 297
12.3.1 定时器服务API 297
12.3.2 EJB同定时器服务的交互 300
12.4 定时器实例——CleanDayLimitOrdersBean 301
12.4.1 CleanDayLimitOrders业务接口 301
12.4.2 CleanDayLimitOrdersBean类 302
12.4.3 CleanDayLimitOrders EJB的部署描述符 304
12.4.5 运行客户 305
12.4.4 CleanDayLimitOrders EJB的客户 305
12.5 EJB定时器服务的优缺点 306
12.6 小结 307
第13章 EJB最佳实践 309
13.1 何时使用EJB 309
13.2 如何选用同EJB协同工作的Web应用框架 311
13.3 在EJB项目中实施MDD 313
13.4 在EJB项目中实施极限编程 314
13.5 测试EJB 316
13.5.1 EJB单元测试 316
13.5.2 借助于框架完成EJB的单元测试 317
13.6 如何在EJB中实现客户端回调功能 319
13.6.1 JMS 319
13.6.2 远程对象调用 319
13.6.3 Web服务 320
13.7 选用Servlet或无状态会话Bean作为服务端点 320
13.8 在EJB项目中考虑使用AOP技术 321
13.8.1 AOP 321
13.8.2 何时在EJB应用中使用AOP 321
13.9 反射、动态代理和EJB 322
13.10 将EJB部署到不同Java EE应用服务器 323
13.11 调试EJB 324
13.12 EJB中的继承和代码复用 326
13.13 在EJB中实现单例(Singleton) 327
13.14 何时在EJB中使用XML 327
13.15 选择消息或RMI-IIOP的时机 328
13.16 小结 330
第14章 EJB性能调优 331
14.1 提前关注 331
14.2 从性能角度看待:有状态对无状态 332
14.3 如何借助于容量规划来保证响应时间 334
14.4 使用会话外观改善性能 335
14.5 选择本地接口还是远程接口 336
14.6 区分资源 337
14.7 无状态会话Bean调优 338
14.8 有状态会话Bean调优 339
14.9 实体调优 340
14.10 MDB调优 342
14.11 Java虚拟机调优 343
14.12 其他调优技巧 344
14.13 正确选用EJB服务器 345
14.14 小结 346
第15章 EJB集成 347
15.1 研究集成的必要性 347
15.2 EJB和集成 348
15.3.1 引入Java EE连接器的理由 349
15.3 Java EE连接器架构 349
15.3.2 资源适配器同Java EE组件交互 351
15.3.3 资源适配器同应用服务器交互 352
15.4 Java EE连接器API 354
15.4.1 javax.resource包 354
15.4.2 javax.resource.cci包 354
15.4.3 javax.resource.spi包 356
15.4.4 javax.resource.spi.endpoint包 358
15.4.5 javax.resource.spi.security包 358
15.5.1 生命周期管理 359
15.4.6 javax.resource.spi.work包 359
15.5 系统契约 359
15.5.2 连接管理 360
15.5.3 安全性管理 363
15.5.4 事务管理 365
15.5.5 工作管理 368
15.5.6 外来消息管理 369
15.6 连接器实例:OutboundLoanRA 371
15.6.1 实例架构 371
15.6.2 JavaLoanApp.java 372
15.6.3 LoadApp.dll 373
15.6.4 OutboundLoanRA 374
15.6.5 LoanRatesEJB 396
15.6.6 LoanRatesClient 398
15.6.7 运行客户 398
15.6.8 扩展OutboundLoanRA 403
15.7 集成最佳实践:使用合适的技术 404
15.7.1 何时使用JMS和基于JMS的MDB 404
15.7.2 何时使用Java EE连接器 404
15.7.3 何时使用Java Web服务 404
15.8 小结 405
16.1 大型系统概述 407
第16章 群集 407
16.1.1 何为大型系统 408
16.1.2 负载均衡和容错 410
16.1.3 基于并排或分布式Java EE容器实施群集 413
16.2 装备群集EJB 415
16.2.1 如何群集EJB 415
16.2.2 幂等性概念 416
16.2.3 群集无状态会话Bean 417
16.2.4 群集有状态会话Bean 419
16.2.5 群集实体 420
16.2.6 群集MDB 422
16.3 其他EJB群集问题 423
16.3.1 初次接触 423
16.3.2 初始访问逻辑 424
16.4 小结 424
第17章 EJB-Java EE集成——构建完整的应用 425
17.1 业务问题 425
17.2 预览最终网站 426
17.3 圈定技术需求 429
17.3.1 业务逻辑层 430
17.3.2 前端展示层 435
17.4 实例代码 440
17.5 小结 450
附录A RMI-IIOP和JNDI教程 451
A.1 Java RMI-IIOP 451
A.1.1 远程方法调用 452
A.1.2 远程接口 454
A.1.3 远程对象实现 455
A.1.4 存根和骨架 456
A.2 对象序列化和参数传递 457
A.2.1 传值 457
A.2.2 CORBA与RMI-IIOP的互操作 462
A.3 Java命名和目录接口 463
A.3.1 为什么要使用JNDI 464
A.3.2 命名和目录服务 464
A.3.3 命名和目录存在的问题 466
A.3.4 进入JNDI 466
A.3.5 JNDI的优势 466
A.3.6 JNDI架构 467
A.3.7 JNDI概念 468
A.3.8 JNDI编程 471
A.4 集成RMI-IIOP和JNDI 472
A.4.1 将RMI-IIOP服务器绑定到JNDI 473
A.4.2 借助于JNDI查找RMI-IIOP服务器 474
A.5 小结 475
附录B 注释 477
B.1 Annotation介绍 477
B.1.1 用于EJB的注释 479
B.1.2 背景 480
B.2 EJB注释参考 482
B.2.1 用于EJB组件类型的注释 482
B.2.2 用于会话Bean和消息驱动Bean的公共注释 484
B.2.3 用于实体的注释 487
B.3 小结 500