第—部分 引言 2
第1章 概述 2
1.1 Java EE 7平台新增特性 3
1.2 Java EE应用模型 3
1.3 分布式多层应用 4
1.3.1 安全 4
1.3.2 Java EE组件 5
1.3.3 Java EE客户端 6
1.3.4 Web组件 7
1.3.5 业务组件 8
1.3.6 企业信息系统层 8
1.4 Java EE容器 9
1.4.1 容器服务 9
1.4.2 容器类型 10
1.5 Web服务支持 11
1.5.1 XML 11
1.5.2 SOAP传输协议 12
1.5.3 WSDL标准格式 12
1.6 Java EE应用装配与部署 12
1.7 开发角色 13
1.7.1 Java EE产品提供商 13
1.7.2 工具提供商 13
1.7.3 应用组件提供商 13
1.7.4 应用装配人员 14
1.7.5 应用部署人员和管理员 14
1.8 Java EE 7 API 14
1.8.1 EJB技术 16
1.8.2 Java servlet技术 17
1.8.3 JSF技术 18
1.8.4 JSP技术 18
1.8.5 JSP标准标记库 19
1.8.6 Java持久化API 19
1.8.7 Java事务API 19
1.8.8 RESTful Web服务JavaAPI 19
1.8.9 托管bean 20
1.8.10 JavaEE的上下文和依赖注入 20
1.8.11 Java的依赖注入 20
1.8.12 bean验证 20
1.8.13 Java消息服务API 20
1.8.14 Java EE连接器架构 21
1.8.15 JavaMail API 21
1.8.16 Java容器授权契约 21
1.8.17 Java容器认证服务提供者接口 21
1.8.18 WebSocket Java API 22
1.8.19 JSON处理Java API 22
1.8.20 Java EE的并发工具 22
1.8.21 Java平台的批处理应用 22
1.9 Java平台标准版7的Java EE 7 API 23
1.9.1 Java数据库互连API 23
1.9.2 Java命名和目录接口API 23
1.9.3 JavaBeans激活框架 24
1.9.4 XML处理Java API 24
1.9.5 Java XML绑定架构 24
1.9.6 XML Web服务Java-API 24
1.9.7 带附件SOAP Java API 25
1.9.8 Java认证和授权服务 25
1.9.9 Java平台的公共注解 25
1.10 GlassFish服务器工具 25
第2章 使用教程示例 27
2.1 必要软件 27
2.1.1 Java EE 7软件开发包 28
2.1.2 Java平台标准版 28
2.1.3 Java EE 7教程组件 28
2.1.4 NetBeans IDE 29
2.1.5 Apache Maven 30
2.2 启动和停止GlassFish服务器 30
2.2.1 使用NetBeans IDE启动GlassFish服务器 30
2.2.2 使用NetBeans IDE停止GlassFish服务器 30
2.2.3 使用命令行启动GlassFish服务器 30
2.2.4 使用命令行停止GlassFish服务器 31
2.3 启动管理控制台 31
2.3.1 使用NetBeans IDE启动管理控制台 31
2.4 启动和停止Java DB服务器 32
2.4.1 使用NetBeans IDE启动数据库服务器 32
2.5 构建示例 32
2.6 教程示例目录结构 32
2.7 教程中的Java EE 7 Maven原型 33
2.7.1 安装教程Maven原型 33
2.8 获取教程最新更新 34
2.8.1 使用NetBeans IDE更新教程 34
2.8.2 使用命令行更新教程 34
2.9 调试Java EE应用 34
2.9.1 使用服务器日志 34
2.9.2 使用调试器 35
第二部分 企业bean 38
第3章 企业bean 38
3.1 什么是企业bean 38
3.1.1 企业bean的好处 39
3.1.2 何时使用企业bean 39
3.1.3 企业bean类型 39
3.2 什么是会话bean 39
3.2.1 会话bean类型 40
3.2.2 何时使用会话bean 41
3.3 什么是消息驱动bean 41
3.3.1 消息驱动bean与会话bean的区别 41
3.3.2 何时使用消息驱动bean 42
3.4 访问企业bean 42
3.4.1 在客户端使用企业bean 43
3.4.2 确定远程或本地访问 44
3.4.3 本地客户端 45
3.4.4 远程客户端 46
3.4.5 Web服务客户端 47
3.4.6 方法参数和访问 47
3.5 企业bean的内容 48
3.6 企业bean的命名约定 48
3.7 企业bean的生命周期 48
3.7.1 有状态会话bean的生命周期 48
3.7.2 无状态会话bean的生命周期 49
3.7.3 单例会话bean的生命周期 50
3.7.4 消息驱动bean的生命周期 50
3.8 有关企业bean的更多信息 51
第4章 企业bean入门 52
4.1 创建企业bean 52
4.1.1 编写企业bean类 53
4.1.2 创建converter Web客户端 53
4.1.3 运行converter示例 54
4.2 修改Java EE应用 55
4.2.1 修改类文件 55
第5章 运行企业bean示例 56
5.1 cart示例 56
5.1.1 业务接口 57
5.1.2 会话bean类 57
5.1.3 @Remove方法 61
5.1.4 辅助类 61
5.1.5 运行cart示例 61
5.2 一个单例会话bean示例:counter 62
5.2.1 创建一个单例会话bean 63
5.2.2 countei示例的架构 67
5.2.3 运行counter示例 69
5.3 一个Web服务示例:helloservice 69
5.3.1 Web服务端点实现类 69
5.3.2 无状态会话bean实现类 70
5.3.3 运行helloservice示例 71
5.4 使用定时器服务 72
5.4.1 创建基于日历的定时器表达式 72
5.4.2 编程定时器 74
5.4.3 自动定时器 76
5.4.4 取消和保存定时器 76
5.4.5 获得定时器信息 77
5.4.6 事务和定时器 77
5.4.7 timersession示例 77
5.4.8 运行timersession示例 80
5.5 处理异常 81
第6章 使用嵌入式企业bean容器 82
6.1 嵌入式企业bean容器概述 82
6.2 开发嵌入式企业bean应用 82
6.2.1 运行嵌入式应用 83
6.2.2 创建企业bean容器 83
6.2.3 查找会话bean引用 84
6.2.4 关闭企业bean容器 85
6.3 standalone示例应用 85
6.3.1 使用NetBeans IDE运行standalone示例应用 86
6.3.2 使用Maven运行standalone示例应用 87
第7章 在会话bean中使用异步方法调用 88
7.1 异步方法调用 88
7.1.1 创建异步业务方法 88
7.1.2 从企业bean客户端调用异步方法 89
7.2 async示例应用 90
7.2.1 async-war模块的架构 91
7.2.2 运行async示例 92
第三部分 持久化 96
第8章 Java持久化API介绍 96
8.1 实体 96
8.1.1 实体类的需求 97
8.1.2 实体类中的持久化字段和属性 97
8.1.3 实体的主键 101
8.1.4 实体关系中的多重性 103
8.1.5 实体关系中的方向 103
8.1.6 实体中的可嵌入类 105
8.2 实体继承 106
8.2.1 抽象实体 106
8.2.2 映射超类 106
8.2.3 非实体超类 107
8.2.4 实体继承映射策略 107
8.3 管理实体 109
8.3.1 EntityManager接口 109
8.3.2 持久化单元 113
8.4 查询实体 114
8.5 数据库模式创建 114
8.5.1 配置应用以创建或删除数据库表 115
8.5.2 使用SQL脚本加载数据 116
8.6 有关持久化的更多信息 116
第9章 运行持久化示例 118
9.1 order应用 118
9.1.1 order应用中的实体关系 119
9.1.2 order应用中的主键 121
9.1.3 实体映射到多个数据库表 125
9.1.4 order应用中的层叠操作 125
9.1.5 order应用中的BLOB和CLOB数据库类型 126
9.1.6 order应用中的时态类型 126
9.1.7 管理order应用的实体 127
9.1.8 运行order示例 129
9.2 roster应用 129
9.2.1 roster应用中的关系 130
9.2.2 roster应用中的实体继承 131
9.2.3 roster应用中的Criteria查询 132
9.2.4 roster应用中的自动表生成 134
9.2.5 运行roster示例 135
9.3 address-book应用 136
9.3.1 address-book中的bean验证约束 136
9.3.2 在address-book中为约束指定错误消息 137
9.3.3 验证JSF应用的联系信息输入 138
9.3.4 运行address-book示例 139
第10章 Java持久化查询语言 140
10.1 查询语言术语 140
10.2 使用Java持久化查询语言创建查询 141
10.2.1 查询中的命名参数 142
10.2.2 查询中的位置参数 142
10.3 简化的查询语言语法 142
10.3.1 选择语句 142
10.3.2 更新和删除语句 143
10.4 示例查询 143
10.4.1 简单查询 143
10.4.2 导航到相关实体的查询 144
10.4.3 包含其他条件表达式的查询 146
10.4.4 批处理更新和删除 147
10.5 完整的查询语言语法 148
10.5.1 BNF符号 148
10.5.2 Java持久化查询语言的BNF文法 148
10.5.3 FROM子句 152
10.5.4 路径表达式 157
10.5.5 WHERE子句 158
10.5.6 SELECT子句 165
10.5.7 ORDERBY子句 167
10.5.8 GROUP BY和HAVING子句 167
第11章 使用Criteria API创建查询 168
11.1 Criteria和Metamodel API概述 168
11.2 使用Metamodel API为实体类建模 170
11.2.1 使用元模型类 170
11.3 使用Criteria API和Metamodel API创建基本的类型安全查询 171
11.3.1 创建Criteria查询 171
11.3.2 查询根 172
11.3.3 使用联接查询关系 172
11.3.4 Criteria查询中的路径导航 173
11.3.5 限制Criteria查询结果 173
11.3.6 管理Criteria查询结果 175
11.3.7 执行查询 176
第12章 创建和使用基于字符串的Criteria查询 178
12.1 基于字符串的Criteria API查询概述 178
12.2 创建基于字符串的查询 178
12.3 执行基于字符串的查询 179
第13章 使用锁定控制对实体数据的并发访问 180
13.1 实体锁定和并发概述 180
13.1.1 使用乐观锁定 181
13.2 锁模式 181
13.2.1 设置锁模式 182
13.2.2 使用悲观锁定 183
第14章 用实体图创建获取计划 185
14.1 实体图基础 185
14.1.1 默认实体图 186
14.1.2 在持久化操作中使用实体图 186
14.2 使用命名实体图 187
14.2.1 对实体类应用命名实体图注解 187
14.2.2 从命名实体图获得EntityGraph实例 188
14.3 在查询操作中使用实体图 189
第15章 对Java持久化API应用使用二级缓存 190
15.1 二级缓存概述 190
15.1.1 控制实体是否可以缓存 191
15.2 指定缓存模式设置来提高性能 192
15.2.1 设置缓存获取和存储模式 192
15.2.2 通过编程方式控制二级缓存 194
第四部分 消息传送 198
第16章 Java消息服务概念 198
16.1 JMS API概述 198
16.1.1 什么是消息传送 198
16.1.2 什么是JMS API 199
16.1.3 何时使用JMS API 199
16.1.4 Java EE平台如何使用JMS API 200
16.2 基本JMS API概念 201
16.2.1 JMS API架构 201
16.2.2 消息传送方式 201
16.2.3 消息使用 203
16.3 JMS API编程模型 204
16.3.1 JMS受管理对象 205
16.3.2 连接 206
16.3.3 会话 206
16.3.4 JMSContext对象 207
16.3.5 JMS消息生产者 208
16.3.6 JMS消息消费者 208
16.3.7 JMS消息 213
16.3.8 JMS队列浏览器 215
16.3.9 JMS异常处理 216
16.4 使用高级JMS特性 216
16.4.1 控制消息确认 217
16.4.2 为发送消息指定选项 218
16.4.3 创建临时目的地 220
16.4.4 使用JMS本地事务 221
16.4.5 异步发送消息 223
16.5 在Java EE应用中使用JMS API 223
16.5.1 为Java EE应用创建资源 223
16.5.2 在企业bean或Web组件中使用资源注入 225
16.5.3 使用Java EE组件生成和同步接收消息 226
16.5.4 使用消息驱动bean异步接收消息 227
16.5.5 管理JTA事务 229
16.6 关于JMS的更多信息 231
第17章 Java消息服务示例 232
17.1 JMS示例概述 233
17.2 编写简单的JMS应用 233
17.2.1 启动JMS提供者 234
17.2.2 创建JMS受管理对象 234
17.2.3 构建所有简单示例 235
17.2.4 发送消息 235
17.2.5 同步接收消息 238
17.2.6 使用消息监听器完成异步消息传送 240
17.2.7 浏览队列中的消息 242
17.2.8 在同一个目的地运行多个消费者 245
17.2.9 确认消息 245
17.3 编写更高级的JMS应用 247
17.3.1 使用持久订阅 247
17.3.2 使用本地事务 249
17.4 编写高性能和可扩展的JMS应用 254
17.4.1 使用共享非持久订阅 254
17.4.2 使用共享持久订阅 256
17.5 使用一个简单Web应用发送和接收消息 257
17.5 1 websimplemessage Facelets页面 257
17.5.2 websimplemessage托管bean 258
17.5.3 运行websimplemessage示例 259
17.6 使用消息驱动bean异步接收消息 261
17.6.1 simplemessage示例概述 261
17.6.2 simplemessage应用客户端 261
17.6.3 simplemessage消息驱动bean类 262
17.6.4 运行simplemessage示例 263
17.7 从会话bean向MDB发送消息 264
17.7.1 为clientsessionmdb示例编写应用组件 265
17.7.2 运行clientsessionmdb示例 267
17.8 使用实体联接两个MDB的消息 268
17.8.1 clientmdbentity示例应用概述 269
17.8.2 为clientmdbentity示例编写应用组件 270
17.8.3 运行clientmdbentity示例 272
17.9 使用NetBeansIDE创建JMS资源 274
17.9.1 使用NetBeans IDE创建JMS资源 274
17.9.2 使用NetBeans IDE删除JMS资源 275
第五部分 安全 278
第18章 Java EE平台安全介绍 278
18.1 Java EE安全概述 278
18.1.1 简单的应用安全演示 279
18.1.2 安全机制特性 281
18.1.3 应用安全特点 281
18.2 安全机制 282
18.2.1 Java SE安全机制 282
18.2.2 Java EE安全机制 283
18.3 保护容器安全 285
18.3.1 使用注解指定安全信息 285
18.3.2 使用部署描述文件提供声明式安全 285
18.3.3 使用编程式安全 286
18.4 保护GlassFish服务器安全 286
18.5 使用安全域、用户、组和角色 286
18.5.1 什么是安全域、用户、组和角色 287
18.5.2 在GlassFish服务器中管理用户和组 289
18.5.3 建立安全角色 290
18.5.4 角色映射到用户和组 291
18.6 使用SSL建立安全连接 292
18.6.1 验证和配置SSL支持 293
18.7 有关安全的更多信息 293
第19章 Web应用安全入门 295
19.1 Web应用安全概述 295
19.2 保护Web应用安全 296
19.2.1 指定安全约束 297
19.2.2 指定认证机制 300
19.2.3 在部署描述文件中指定认证机制 302
19.2.4 声明安全角色 303
19.3 Web应用使用编程式安全 304
19.3.1 通过编程方式认证用户 304
19.3.2 通过编程方式检查调用者身份 306
19.3.3 编程式安全的示例代码 306
19.3.4 声明和链接角色引用 308
19.4 示例:保护Web应用安全 309
19.4.1 设置系统来运行安全示例 309
19.4.2 hello2-basicauth示例:对servlet使用基本认证 310
19.4.3 hellol-formauth示例:对JSF应用使用基于表单的认证 312
第20章 企业应用安全入门 316
20.1 企业应用的基本安全任务 316
20.2 保护企业bean安全 316
20.2.1 使用声明式安全保护企业bean安全 318
20.2.2 通过编程方式保护企业bean安全 321
20.2.3 传播安全身份(Run-As) 323
20.2.4 部署安全企业bean 324
20.3 示例:保护企业bear安全 324
20.3.1 cart-secure示例:使用声明式安全保护企业bean安全 324
20.3.2 converter-secure示例:使用编程式安全保护企业bean安全 328
第21章 JavaEE安全:高级主题 331
21.1 使用数字证书 331
21.1.1 创建服务器证书 332
21.1.2 向证书安全域增加用户 334
21.1.3 为GlassFish服务器使用一个不同的服务器证书 334
21.2 认证机制 335
21.2.1 客户端认证 335
21.2.2 相互认证 335
21.3 使用JDBC安全域完成用户认证 338
21.3.1 配置JDBC认证安全域 339
21.4 保护HTTP资源安全 340
21.5 保护应用客户端安全 343
21.5.1 使用登录模块 343
21.5.2 使用编程式登录 344
21.6 保护企业信息系统应用安全 344
21.6.1 容器托管登录 344
21.6.2 组件托管登录 345
21.6.3 配置资源适配器安全 345
21.6.4 将应用主体映射到EIS主体 346
21.7 使用部署描述文件配置安全 347
21.7.1 在部署描述文件中指定基本认证安全 347
21.7.2 在部署描述文件中指定非默认主体-角色映射 348
21.8 关于高级安全主题的更多信息 348
第六部分 Java EE支持技术 352
第22章 事务 352
22.1 Java EE应用中的事务 352
22.2 什么是事务 353
22.3 容器托管事务 353
22.3.1 事务属性 354
22.3.2 回滚容器托管事务 357
22.3.3 同步会话bean的实例变量 357
22.3.4 容器托管事务中不允许的方法 358
22.4 bean托管事务 358
22.4.1 JTA事务 358
22.4.2 不提交返回 359
22.4.3 bean托管事务中不允许的方法 359
22.5 事务超时 359
22.5.1 设置事务超时 359
22.6 更新多个数据库 360
22.7 Web组件中的事务 361
22.8 关于事务的更多信息 361
第23章 资源适配器和契约 362
23.1 什么是资源适配器 362
23.1.1 管理契约 363
23.1.2 通用工作上下文契约 364
23.1.3 出站和入站契约 364
23.2 元数据注解 365
23.3 公共客户端接口 366
23.4 对Java EE上下文和依赖注入(CDI)使用资源适配器 367
23.5 关于资源适配器的更多信息 368
第24章 资源适配器示例 369
24.1 trading示例 369
24.1.1 使用出站资源适配器 370
24.1.2 实现出站资源适配器 372
24.1.3 运行trading示例 373
24.2 traffic示例 374
24.2.1 使用入站资源适配器 375
24.2.2 实现入站资源适配器 376
24.2.3 运行traffic示例 378
第25章 使用Java EE拦截器 380
25.1 拦截器概述 380
25.1.1 拦截器类 381
25.1.2 拦截器生命周期 381
25.1.3 拦截器和CDI 381
25.2 使用拦截器 381
25.2.1 拦截方法调用 382
25.2.2 拦截生命周期回调事件 384
25.2.3 拦截超时事件 385
25.2.4 为组件绑定拦截器 386
25.2.5 拦截器排序 387
25.3 interceptor示例应用 388
25.3.1 运行interceptor示例 389
第26章 批处理 390
26.1 批处理介绍 391
26.1.1 批处理作业中的步骤 391
26.1.2 并行处理 392
26.1.3 状态和判定元素 392
26.1.4 批处理框架功能 393
26.2 Java EE中的批处理 394
26.2.1 批处理框架 394
26.2.2 创建批处理应用 394
26.2.3 批处理作业的元素 395
26.2.4 属性和参数 395
26.2.5 作业实例和作业执行 395
26.2.6 批处理和退出状态 395
26.3 简单用例 396
26.3.1 块步骤 397
26.3.2 任务步骤 399
26.4 使用作业规范语言 399
26.4.1 job元素 400
26.4.2 step元素 401
26.4.3 flow元素 406
26.4.4 split元素 406
26.4.5 decision元素 406
26.5 创建批处理工件 407
26.5.1 批处理工件接口 407
26.5.2 批处理工件中的依赖注入 409
26.5.3 从批处理运行时环境使用上下文对象 410
26.6 向批处理运行时环境提交作业 411
26.6.1 开始作业 411
26.6.2 检查作业的状态 411
26.6.3 在应用中调用批处理运行时环境 412
26.7 打包批处理应用 412
26.8 webserverlog示例应用 412
26.8.1 webserverlog示例应用架构 412
26.8.2 运行webserverlog示例应用 418
26.9 phonebilling示例应用 419
26.9.1 phonebilling示例应用架构 419
26.9.2 运行phonebilling示例应用 425
26.10 关于批处理的更多信息 426
第27章 Java EE的并发工具 427
27.1 并发基础 427
27.1.1 线程和进程 428
27.2 并发工具的主要组件 428
27.3 并发和事务 429
27.4 并发和安全 430
27.5 jobs并发示例 430
27.5.1 运行jobs示例 430
27.6 taskcreator并发示例 433
27.6.1 运行taskcreator示例 435
27.7 关于并发工具的更多信息 436
第七部分 案例研究 438
第28章 Duke书店案例研究示例 438
28.1 Duke书店的设计和架构 438
28.2 Duke书店接口 439
28.2.1 BookJava持久化API实体 439
28.2.2 Duke书店中使用的企业bean 440
28.2.3 Duke书店中使用的Facelets页面和托管bean 440
28.2.4 Duke书店中使用的定制组件和其他定制对象 441
28.2.5 Duke书店中使用的属性文件 442
28.2.6 Duke书店中使用的部署描述文件 443
28.3 运行Duke书店案例研究应用 443
28.3.1 使用NetBeans IDE构建和部署Duke书店 443
28.3.2 使用Maven构建和部署Duke书店 443
28.3.3 运行Duke书店应用 444
第29章 Duke辅导案例研究示例 445
29.1 Duke辅导应用的设计和架构 445
29.2 主界面 447
29.2.1 主界面中使用的Java持久化API实体 447
29.2.2 主界面中使用的企业bean 448
29.2.3 主界面中使用的WebSocket端点 448
29.2.4 主界面中使用的Facelets文件 448
29.2.5 主界面中使用的辅助类 449
29.2.6 属性文件 449
29.2.7 Duke辅导应用中使用的部署描述文件 450
29.3 管理界面 450
29.3.1 管理界面中使用的企业bean 450
29.3.2 管理界面中使用的Facelets文件 451
29.3.3 管理界面中使用的CDI托管bean 451
29.3.4 管理界面中使用的辅助类 451
29.4 运行Duke辅导案例研究应用 452
29.4.1 运行Duke辅导应用 452
第30章 Duke综合案例研究示例 455
30.1 Duke综合应用的设计和架构 456
30.1.1 events工程 458
30.1.2 entities工程 459
30.1.3 dukes-payment工程 461
30.1.4 dukes-resources工程 461
30.1.5 Duke商店工程 461
30.1.6 Duke货运工程 465
30.2 构建和部署Duke综合案例研究应用 467
30.2.1 使用NetBeans IDE构建和部署Duke综合应用 467
30.2.2 使用Maven构建和部署Duke综合应用 467
30.3 运行Duke综合应用 467
30.3.1 注册为Duke商店顾客 468
30.3.2 购买产品 468
30.3.3 批准产品发货 468
30.3.4 创建新产品 469