第一部分 开发EJB 1
第1章 企业级应用程序导论 1
1.1 EJB体系结构 1
1.2 基于组件的分布式计算 3
1.2.1 软件组件的快速复习 3
1.2.2 将组件集合到体系结构中 4
1.3 N层体系结构 5
1.3.1 两层组件体系结构 5
1.3.2 N层组件体系结构 6
1.4 为什么使用EJB 6
1.4.1 “编写一次,多处运行”原则 7
1.4.2 规范与实现分隔 7
1.4.3 提供互用性 7
1.4.4 开发者可以专注于商业逻辑 8
1.4.5 与CORBA/IIOP协议兼容 8
第2章 一个拍卖网站的实例*9++2.1 拍卖实例概述 9
2.2 英式拍卖的概述 9
2.3 选择要实现的用例 11
2.3.1 创建拍卖 14
2.3.2 取消拍卖 14
2.3.3 指定买受人 14
2.3.4 结束拍卖 14
2.3.5 查看拍卖 14
2.3.6 查看应价历史 14
2.3.7 浏览拍卖 14
2.3.8 查看拍卖细节 15
2.3.9 应价拍卖 15
2.3.10 查看账簿历史 15
2.4 定义对象模型 15
2.4.1 标识商业对象 15
2.4.2 标识应用程序控制者 17
第3章 EJB概念 20
3.1 提早掌握概念 20
3.2 什么是Enterprise Bean 20
3.2.1 实体bean 21
3.2.2 会话bean 21
3.2.3 消息驱动bean 22
3.3 EJB角色及其责任 22
3.3.1 bean提供者 23
3.3.2 应用程序集中者 24
3.3.3 EJB部署者 25
3.3.4 EJB服务器提供者 25
3.3.5 EJB容器提供者 26
3.3.6 系统管理员 27
3.4 本地EJB客户机与远程EJB客户机的对比 27
3.4.1 本地EJB客户机 27
3.4.2 远程EJB客户机 27
3.5 使用RMI与EJB通信 28
3.5.1 什么是根和干 28
3.5.2 在IIOP上使用RMI 34
3.6 通过EJB的组件接口来访问EJB 36
3.7 使用Home接口定位企业bean 38
3.8 决定是否使用一个本地或远程客户机 40
3.8.1 本地模型通常可提供更好的性能 40
3.8.2 本地模型的访问粒度最细 41
3.8.3 远程模型提供更好的位置透明度 41
3.8.4 远程客户机必须处理远程异常 41
3.9 EJB的创建和删除 41
3.10 钝化和活化 42
3.11 对象池 44
3.12 句柄 45
3.13 EJB服务器和容器的实现 46
第4章 Java的命名和目录接口 48
4.1 为什么应用程序需要命名服务和目录服务 48
4.1.1 命名服务 48
4.1.2 目录服务 50
4.2 JNDI体系结构概述 50
4.3 选择和配置JNDI提供者 52
4.4 JNDI环境属性 53
4.4.1 java.naming.factory.initial 55
4.4.2 java.naming.provider.url 56
4.5 设置JNDI环境属性 56
4.5.1 用散列表设置环境属性 56
4.5.2 使用系统属性 56
4.5.3 使用资源文件 57
4.5.4 用于查找资源文件的搜索算法 59
4.6 Context和InitialContext对象 59
4.7 获得Context对象的环境 63
4.8 使用lookup方法定位JNDI资源 65
4.9 定位EJB对象 66
4.10 访问EJB的环境 67
4.11 通过InitialContext建立安全性 68
4.12 JNDI和群集 69
4.13 疑难解答 70
第5章 实体bean 71
5.1 什么是实体bean 71
5.1.1 商业逻辑 72
5.1.2 粗粒度对象 72
5.1.3 表达从属对象 73
5.1.4 标识拍卖实体对象 74
5.1.5 bean提供者责任 75
5.2 声明组件接口 76
5.2.1 实体bean的客户机视图 76
5.2.2 显露商业方法 77
5.2.3 命名约定 78
5.2.4 拍卖组件接口 79
5.3 定义主键类 91
5.3.1 使用单一字段键 91
5.3.2 使用多字段键 92
5.3.3 在部署时指定主键 93
5.4 声明Home接口 94
5.4.1 创建实体bean 94
5.4.2 查找实体bean 95
5.4.3 删除实体bean 96
5.4.4 声明Home接口商业方法 96
5.4.5 EnglishAuctionHome接口 96
5.5 实现实体bean 97
5.5.1 EntityBean接口 98
5.5.2 EntityContext接口 98
5.5.3 商业方法 99
5.5.4 Home方法 100
5.5.5 回调方法和实体bean的生命周期 100
5.5.6 访问环境 102
5.6 继承和实体bean 103
5.7 实体bean有用吗 105
第6章 bean管理的持久性 107
6.1 选择自己管理持久性 107
6.2 JDBC入门 108
6.2.1 Connection接口 108
6.2.2 PreparedStatement接口 109
6.2.3 ResultSet接口 110
6.2.4 SQLException类 110
6.3 配置数据源 110
6.3.1 定义连接池 111
6.3.2 定义资源管理者连接工厂的引用 112
6.3.3 从EJB内获得连接 113
6.3.4 拍卖模式 114
6.4 创建实体bean 116
6.5 载入和存储实体 121
6.5.1 实现ejbLoad 121
6.5.2 实现ejbStore 123
6.6 访问其他实体bean 128
6.7 实现Finder方法 130
6.8 删除实体 132
6.9 使用BMP部署实体bean 134
6.10 疑难解答 141
第7章 容器管理的持久性 143
7.1 构建可移植的实体bean 143
7.1.1 CMP和从属对象 143
7.1.2 将拍卖的实例转移到CMP 144
7.2 声明CMP实体bean 145
7.2.1 定义CMP字段 146
7.2.2 定义CMR字段 148
7.2.3 从属的值类 149
7.3 实现容器回调方法 150
7.3.1 指派EntityContext 150
7.3.2 创建和删除 151
7.3.3 主键的产生 152
7.3.4 载入和存储 152
7.3.5 钝化和活化 153
7.3.6 实现Home方法 153
7.3.7 声明Select方法 153
7.4 使用CMP部署实体bean 154
7.4.1 抽象持久性模式 154
7.4.2 实现Finder和Select方法 158
7.4.3 将抽象持久性模式映射到数据库 159
7.4.4 CMP bean的容器实现 163
7.4.5 测试拍卖实例 167
7.5 管理关系 167
7.6 使用EJB 1.1 CMP 168
7.7 疑难解答 169
第8章 EJB查询语言 171
8.1 什么是EJB查询语言 171
8.2 定义FROM从句 172
8.2.1 标识变量 172
8.2.2 路径表达式 174
8.3 定义WHERE从句 174
8.3.1 输入参数 175
8.3.2 表达式和运算符 175
8.4 定义SELECT从句 178
8.5 使用内建函数 179
8.5.1 字符串函数 179
8.5.2 运算函数 180
8.6 BNF记号法中的EJB QL语法 180
8.7 疑难解答 183
第9章 会话bean 184
9.1 什么是会话bean 184
9.2 无状态会话bean与状态会话bean之间的不同 185
9.2.1 标识拍卖的会话bean 186
9.2.2 bean提供者责任 187
9.3 声明组件接口 187
9.3.1 比较对象标识 188
9.3.2 拍卖组件接口 189
9.4 声明Home接口 194
9.4.1 创建会话bean 195
9.4.2 删除会话bean 195
9.4.3 AuctionCheckoutHome接口 196
9.5 实现会话bean 196
9.5.1 SessionBean接口 197
9.5.2 SessionContext接口 197
9.5.3 会话bean的生命周期 198
9.5.4 维持对话状态 201
9.5.5 访问环境 202
9.5.6 访问其他EJB 202
9.6 部署会话bean 204
9.7 重入问题 209
9.8 疑难解答 209
第10章 Java消息服务 211
10.1 消息传递简介 211
10.1.1 什么是面向消息的中间件 211
10.1.2 Java消息服务作为面向消息的中间件 212
10.1.3 各种JMS实现的不同 212
10.2 JMS体系结构的组件 213
10.2.1 消息生产者 213
10.2.2 消息使用者 214
10.2.3 JMS消息 214
10.2.4 被管理的JMS对象 214
10.2.5 命名服务 214
10.3 两个JMS消息的模型 214
10.3.1 点对点 214
10.3.2 发布/订阅 215
10.4 JMS的接口 215
10.4.1 ConnectionFactory 216
10.4.2 Connection 216
10.4.3 Session 216
10.4.4 Destination 217
10.4.5 MessageProducer和Message_Consumer 218
10.4.6 Message 218
10.5 JMS消息的详细描述 219
10.5.1 消息标题 219
10.5.2 消息属性 221
10.5.3 消息主体 221
10.6 消息的选择和过滤 222
10.6.1 设置标题和属性字段 222
10.6.2 指定消息选择器的查询字符串 222
10.7 使用JMS点对点模型 223
10.7.1 创建JMS管理对象 224
10.7.2 接收来自队列的消息 224
10.7.3 将消息发送到队列 235
10.7.4 运行队列的实例 240
10.8 使用JMS发布/订阅模型 240
10.8.1 创建JMS管理对象 241
10.8.2 将订阅者添加到主题 241
10.8.3 将消息发送到主题 248
10.8.4 运行主题的实例 252
10.8.5 耐久性订阅 253
10.9 同步传递消息与异步传递消息的对比 254
10.10 消息的持久性 255
10.11 随同JMS使用事务 255
10.12 随同EJB使用JMS 255
10.13 疑难解答 256
第11章 消息驱动bean 257
11.1 什么是消息驱动bean 257
11.1.1 消息驱动bean是匿名的 257
11.1.2 消息驱动bean是无状态的 258
11.2 消息驱动bean和容器 258
11.3 随同EJB使用消息驱动bean 258
11.4 随同消息驱动bean使用JMS队列或主题 259
11.5 创建消息驱动bean 259
11.5.1 MessageDrivenBean接口 259
11.5.2 JMS MessageListener接口 260
11.5.3 创建消息驱动bean类 261
11.6 部署消息驱动bean 265
11.7 将消息发送到消息驱动bean 267
11.8 确认来自消息驱动bean的消息 267
11.9 随同消息驱动bean使用事务 267
11.10 疑难解答 267
第12章 事务 269
12.1 理解事务 269
12.2 事务的特性 270
12.2.1 原子性 270
12.2.2 一致性 270
12.2.3 隔离性 271
12.2.4 耐久性 271
12.3 用Java事务API编程 272
12.3.1 对象事务服务 272
12.3.2 Java事务API 274
12.3.3 JTA和Java事务服务 278
12.4 使用容器管理的事务 278
12.4.1 指派事务属性 279
12.4.2 不要忘记阅读文档 284
12.4.3 事务同步 285
12.5 使用bean管理的事务 286
12.5.1 UserTransaction接口 287
12.5.2 管理事务 289
12.5.3 针对状态会话bean的bean管理的划分 289
12.6 使用客户机划分的事务 289
12.7 隔离对资源的访问 290
12.7.1 选择隔离级别 290
12.7.2 性能影响 291
12.7.3 程序化地改变隔离级别 291
12.8 疑难解答 292
第13章 异常处理 294
13.1 EJB异常处理 294
13.2 应用程序异常 294
13.2.1 标准的EJB应用程序异常 296
13.2.2 扩展应用程序异常 298
13.3 系统异常 300
13.3.1 标准的EJB系统异常 301
13.3.2 抛出系统异常 302
13.3.3 抛出来自消息驱动bean的异常 304
13.4 异常与事务 304
13.4.1 在事务期间抛出应用程序异常 304
13.4.2 在事务期间抛出系统异常 307
13.5 包装异常 309
13.6 疑难解答 309
第14章 安全性设计和管理 311
14.1 应用程序安全的重要性 311
14.2 理解应用程序的安全性要求 311
14.2.1 物理上的分隔层 312
14.2.2 基于用户名/密码的用户级访问 313
14.2.3 所使用的不同厂商产品 313
14.2.4 所使用的敏感和非敏感数据 313
14.3 安全性的基本概念 313
14.3.1 身份验证和授权 314
14.3.2 数据的完整性 314
14.3.3 机密性和数据保密 314
14.3.4 认可 315
14.3.5 主体和用户 315
14.3.6 主题 315
14.3.7 证书 315
14.3.8 组和角色 315
14.3.9 访问控制列表和权限 316
14.3.10 安全性区域 316
14.4 Java安全性基础 316
14.4.1 Java ClassLoader 318
14.4.2 权限类 318
14.4.3 Java SecurityManager 318
14.4.4 AccessController类 318
14.4.5 AccessControlContext类 319
14.4.6 特许代码 319
14.5 随同EJB和J2EE使用安全性 320
14.5.1 使用纲领安全性 321
14.5.2 使用说明安全性 323
14.5.3 在部署描述符中指定标识 326
14.5.4 将部署角色映射到物理环境 326
14.6 拟订拍卖安全性 327
14.6.1 创建拍卖安全性区域的模式 328
14.6.2 设计安全性区域的访问 330
14.6.3 在Web层中使用安全属性 331
14.6.4 传播主体 335
14.7 Java身份验证和授权服务 335
14.7.1 身份验证 335
14.7.2 授权 336
14.7.3 JAAS核心类 336
第15章 部署 340
15.1 部署描述符和EJB角色 340
15.2 bean提供者的责任 341
15.2.1 全体文件结构*341++++15.2.2 enterprise-beans元素 342
15.2.3 relationships元素 348
15.2.4 assembly-descriptor和ejb-client-jar元素 350
15.3 应用程序集中者的责任 350
15.3.1 assembly-descriptor元素 350
15.3.2 修改enterprise-beans条目 354
15.4 部署者的责任 355
15.5 包装EJB 356
15.6 疑难解答 356
第二部分 设计与性能 359
第16章 EJB设计的范式和策略 359
16.1 什么是范式 359
16.2 EJB策略 360
16.3 设计EJB类和接口 360
16.3.1 设计粗粒度企业bean 360
16.3.2 使用商业方法接口 361
16.3.3 使用回调方法的抽象超类 365
16.3.4 使用容器管理的事务 367
16.4 管理客户机访问 367
16.4.1 会话bean外观 367
16.4.2 将视图对象返回客户机 368
16.4.3 引用客户机中的Home和组件接口 370
16.5 在EJB中实现一个孤子 371
16.6 疑难解答 372
第17章 性能 373
17.1 性能在设计中的作用 373
17.2 最小化远程调用 374
17.3 优化实体bean的持久性 376
17.3.1 选择CMP实现 376
17.3.2 必要时仅执行ejbStore 377
17.3.3 为BMP从属对象使用Lazy Loading 378
17.3.4 使用只读实体bean 380
17.4 构建拾取列表 381
17.5 管理事务 383
17.5.1 事务划分 383
17.5.2 隔离级 384
17.6 疑难解答 384
第18章 应用程序的性能和负载测试 385
18.1 为什么进行应用程序的负载测试 385
18.2 bean的性能测试 386
18.3 bean的负载测试 388
18.4 使用ECperf 1.0 392
18.5 疑难解答 392
第三部分 构建Web层 395
第19章 为EJB构建表示层 395
19.1 表示层的不同类型 395
19.2 使用外观范式来隐藏EJB 396
19.3 随同EJB使用Servlet和JSP 401
19.4 使用JSP标记库 406
19.5 使用Strut开放源码Framework 406
19.6 在Web服务器或状态会话bean中高速缓存 406
第四部分 高级概念 409
第20章 分布性和EJB互用性 409
20.1 互用性概述 409
20.2 可移植性与互用性的对比 409
20.3 EJB 2.0互用性的目的 409
20.4 CORBA与EJB的关系 410
20.5 远程调用互用性 411
20.5.1 GIOP和IIOP协议 411
20.5.2 IIOP之上的RMI 411
20.5.3 使用双向GIOP 412
20.5.4 远程接口和CORBA IDL 412
20.5.5 根和客户机视图类 412
20.6 事务互用性 413
20.6.1 CORBA的对象事务服务 413
20.6.2 对于不支持事务互用性的容器的要求 413
20.7 命名互用性 413
20.8 安全互用性 414
20.8.1 容器之间的安全互用性 414
20.8.2 使用IIOP传播主体和授权数据 414
第21章 水平服务 415
21.1 什么是水平服务 415
21.2 由EJB提供的水平服务 418
21.3 传统购买与构建分析的对比 418
21.4 拍卖实例中的水平服务 419
21.4.1 拍卖的记录服务 419
21.4.2 拍卖的电子邮件支持服务 420
21.5 构建拍卖的记录服务 420
21.5.1 开发记录结构 421
21.5.2 创建记录API 422
21.5.3 创建记录SPI 428
21.5.4 构建两个记录服务实现 430
21.5.5 可用的商业记录服务 440
21.6 Java 1.4记录API 440
21.7 构建电子邮件水平服务 441
21.7.1 构建电子邮件水平服务 441
21.7.2 构建电子邮件API 442
21.7.3 构建电子邮件服务的消息驱动bean 447
21.7.4 配置电子邮件所需的属性 450
21.8 疑难解答 452
第22章 EJB群集概念 454
22.1 太多不一定是件好事 454
22.2 什么是群集 454
22.2.1 可伸缩性 455
22.2.2 高可用性 455
22.3 在Web层中群集 456
22.4 在EJB层中群集 457
22.4.1 群集命名服务 457
22.4.2 群集无状态会话bean 458
22.4.3 群集实体bean 458
22.4.4 群集状态会话bean 458
22.4.5 群集JMS 458
22.4.6 群集JDBC连接 459
22.5 单VM结构与多VM结构的对比 459
第23章 EJB 2.0编程限制 460
23.1 限制的目的 460
23.2 EJB 2.0的限制 460
23.2.1 不能使用读/写静态字段 460
23.2.2 使用线程和同步 461
23.2.3 java.io包的使用限制 462
23.2.4 套接字的使用限制 463
23.2.5 Reflection API的使用限制 463
23.2.6 类装载器和安全管理器的使用限制 463
23.2.7 AWT输入/输出的使用限制 463
23.2.8 本地库的使用限制 464
23.2.9 this引用的使用限制 464
23.3 小结 464
第五部分 附录 465
附录A EJB 2.0 API 465
附录B 自EJB 1.1的变化 480
附录C 光盘中的内容 483