第Ⅰ部分 Seam入门 3
第1章 Seam的定义 3
1.1 集成和增强Java EE框架 4
1.2 能够理解ORM的Web框架 5
1.3 支持有状态的Web应用程序 5
1.4 为Web 2.0做好准备 6
1.5 通过双向依赖注入实现POJO服务 7
1.6 惯例优先原则 7
1.7 避免滥用XML 7
1.8 为方便测试而设计 8
1.9 优秀的工具支持 8
1.10 开始编写代码 9
第2章 Seam Hello World 10
2.1 创建数据模型 11
2.2 将数据模型映射到Web表单 12
2.3 处理Web事件 12
2.4 导航到下一个页面 13
2.5 EJB3 bean接口和强制性方法 14
2.6 有关Seam编程模型的更多知识 15
2.6.1 Seam内置组件 15
2.6.2 测试的简便性 16
2.6.3 基于getter/setter方法的双向注入 16
2.6.4 避免过多的双向注入 16
2.6.5 通过EntityManager访问数据库 17
2.7 配置和打包 18
2.7.1 WAR文件 20
2.7.2 Seam组件JAR包 21
2.8 Seam应用程序的简易性 23
第3章 推荐使用的JSF增强功能 24
3.1 Facelets简介 25
3.1.1 使用Facelets的原因 25
3.1.2 使用Facelets的Hello World示例 26
3.1.3 使用Facelets作为模板引擎 27
3.1.4 数据列表组件 30
3.2 Seam对JSF的增强 30
3.2.1 Seam UI标记 31
3.2.2 Seam的JSF表达式语言增强 32
3.2.3 表达式语言的使用范围 33
3.2.4 Seam过滤器 33
3.2.5 有状态的JSF 33
3.3 添加对Facelets和Seam UI的支持 34
3.4 对PDF文档、电子邮件和富文本的支持 35
3.4.1 生成PDF报表 36
3.4.2 基于模板的电子邮件 38
3.4.3 富文本的显示 40
3.5 国际化 41
第4章 无需EJB3的Seam 43
4.1 仅使用POJO的Seam应用程序示例 43
4.2 配置 44
4.3 打包 46
4.4 使用POJO的折中 48
第5章 快速应用程序开发工具 49
5.1 先决条件 49
5.2 快速教程 50
5.2.1 设置seam-gen 50
5.2.2 生成骨架应用程序 53
5.2.3 理解配置文件 54
5.2.4 开发应用程序 56
5.2.5 构建和部署 56
5.2.6 运行测试用例 58
5.3 使用IDE 58
5.3.1 NetBeans 58
5.3.2 Eclipse 61
5.3.3 JBoss Tools与JBoss Developer Studio 62
5.4 从数据库生成CRUD应用程序 64
5.5 seam-gen命令参考 65
第Ⅱ部分 简化有状态应用程序开发第6章 Seam有状态框架简介 69
6.1 ORM的正确用法 69
6.2 更好的性能 71
6.3 更好的浏览器导航支持 72
6.4 更少的内存泄漏 73
6.5 高粒度组件生命周期 73
6.6 减少样板代码 74
第7章 组件编程思想 76
7.1 有状态组件 77
7.1.1 有状态实体bean 78
7.1.2 有状态的会话bean 79
7.2 管理有状态组件 80
7.2.1 有状态组件的生命周期 80
7.2.2 工厂方法 82
7.2.3 管理器组件 84
7.3 通过XML配置组件 85
7.4 页面导航流 87
第8章 对话 88
8.1 对话的定义 88
8.1.1 默认对话作用域 89
8.1.2 显示JSF消息 90
8.2 长期运行对话 92
8.2.1 Hotel Booking示例简介 92
8.2.2 长期运行对话的生命周期 95
8.2.3 对话超时 96
8.3 管理长期运行对话 97
8.3.1 注解方法 97
8.3.2 导航方法 98
8.3.3 启动长期运行对话 99
8.3.4 对话内部 102
8.3.5 结束长期运行对话 104
8.3.6 链接和按钮 107
8.4 新领域 109
第9章 工作区和并发对话 110
9.1 工作区的定义 110
9.2 工作区管理 113
9.2.1 工作区切换器 113
9.2.2 跨工作区传递对话 115
9.2.3 管理对话ID 116
9.3 自然对话 117
9.3.1 通过链接启动自然对话 117
9.3.2 重定向到自然对话 119
9.3.3 恢复自然对话 121
9.3.4 重写到用户友好URL 122
9.4 工作区超时 122
9.5 无状态Web中的桌面特性 124
第10章 嵌套对话 125
10.1 需要嵌套对话的原因 125
10.2 延续对话 126
10.2.1 理解嵌套对话上下文 127
10.2.2 嵌套对话 128
10.3 对话栈 130
10.3.1 管理对话栈 131
10.3.2 显示面包屑路径 134
10.3.3 嵌套对话超时 134
10.4 细粒度状态管理 134
第11章 事务与持久化 135
11.1 Seam托管事务 136
11.1.1 事务属性 137
11.1.2 强制事务回滚 138
11.2 原子对话(Web事务) 139
11.2.1 管理持久化上下文 140
11.2.2 Seam托管持久化上下文 142
11.2.3 每个对话一个事务 146
第Ⅲ部分 整合Web与数据组件 151
第12章 验证输入数据 151
12.1 表单验证基础 151
12.2 用于实体bean的验证注解 153
12.3 触发验证操作 154
12.4 在Web表单上显示错误消息 156
12.5 使用自定义JSF验证器 158
第13章 可单击数据表 159
13.1 实现可单击数据表 160
13.1.1 显示数据表 160
13.1.2 将选中的对象注入到事件处理程序中 161
13.1.3 在数据表中使用扩展EL 162
13.2 Seam数据绑定框架 162
第14章 利用事件解耦组件 164
14.1 观察者模式 164
14.2 组件驱动的事件 166
14.2.1 声明式引发事件 167
14.2.2 观察事件 169
14.2.3 事件处理和Events API 170
第15章 可收藏网页 172
15.1 使用页面参数 173
15.2 以Java为中心的方法 176
15.2.1 从HTTP GET请求中获得查询参数 176
15.2.2 为页面加载数据 177
15.2.3 进一步处理已收藏页面 178
15.3 RESTful Web服务 179
第16章 Seam CRUD应用程序框架 181
16.1 DAO 181
16.2 Seam CRUD DAO是POJO 182
16.3 声明式Seam DAO组件 182
16.3.1 使用实体对象的简化名称 184
16.3.2 检索并显示实体对象 184
16.3.3 初始化新的实体实例 185
16.3.4 成功消息 185
16.4 查询 186
16.4.1 动态查询 187
16.4.2 显示多页查询结果 188
第17章 适当地处理错误 191
17.1 不采用标准servlet错误处理页面方法的原因 192
17.2 设置异常过滤器 192
17.3 异常注解 193
17.4 使用pages.xml来处理系统异常 194
17.5 调试信息页面 196
17.5.1 Facelets调试页面 196
17.5.2 Seam调试页面 197
第18章 Seam安全框架 199
18.1 验证与用户角色 200
18.2 声明式访问控制 203
18.2.1 页面访问控制 203
18.2.2 UI组件 204
18.2.3 组件访问控制 205
18.2.4 类型安全的角色注解 207
18.3 身份管理 208
18.3.1 使用JpaIdentityStore 208
18.3.2 使用LdapIdentityStore 214
18.4 其他安全功能 216
18.4.1 简化SSL 216
18.4.2 使用CAPCHA来区分人类和计算机 217
第Ⅳ部分 Seam对AJAX的支持 223
第19章 自定义AJAX UI组件 223
19.1 具有自动完成功能的文本输入示例 224
19.2 功能丰富的输入控件示例 227
19.3 可滚动数据表 227
19.4 在Seam中使用RichFaces 229
19.5 其他JSF组件库 229
第20章 让已有组件支持AJAX 231
20.1 AJAX验证器示例 231
20.2 编程式AJAX 233
20.3 AJAX按钮 236
20.4 AJAX容器 237
20.5 其他好用的工具 238
20.6 在Seam中使用Ajax4jsf组件库 238
20.7 Ajax4jsf组件库的优缺点 239
第21章 在Seam中直接集成JavaScript 240
21.1 AJAX验证器示例(重装上阵) 240
21.1.1 服务器端组件 241
21.1.2 在Web页面上触发JavaScript事件 242
21.1.3 执行AJAX调用 243
21.2 AJAX进度条 244
21.2.1 Seam组件 245
21.2.2 在JavaScript中访问Seam组件 246
21.3 在Seam应用程序中集成Dojo工具箱 248
21.3.1 视觉效果小部件 248
21.3.2 输入小部件 249
第Ⅴ部分 业务流程和规则 255
第22章 基于规则的安全框架 255
22.1 基于规则的访问控制 255
22.2 基于规则的权限配置 256
22.3 简单的访问规则 257
22.4 按实例配置访问规则 259
22.5 保护实体 261
第23章 在Web应用程序中集成业务规则 264
23.1 嵌入式规则 264
23.1.1 基于规则的行为 264
23.1.2 应用规则 266
23.2 通用规则 267
23.2.1 工作内存 267
23.2.2 使用工作内存 269
23.2.3 可动态更新的规则 269
23.3 构建和部署 270
23.4 结论 271
第24章 管理业务流程 272
24.1 jBPM的概念和术语 273
24.2 应用程序用户和jBPM角色 275
24.3 创建业务流程 277
24.3.1 定义流程 277
24.3.2 创建业务流程实例 279
24.3.3 将数据对象绑定在流程作用域中 280
24.4 任务管理 281
24.4.1 实现任务的业务逻辑 281
24.4.2 指定要处理的任务 283
24.4.3 在UI中选择任务 284
24.5 基于业务流程的页面导航流 286
24.6 jBPM库和配置 289
第25章 集成业务流程和规则 291
25.1 流程 291
25.2 规则 293
25.3 结论 294
第Ⅵ部分 Seam应用程序测试 297
第26章 单元测试 297
26.1 一个简单的TestNG测试用例 298
26.2 模拟双向依赖注入 300
26.3 模拟数据库和事务 301
26.4 加载测试基础结构 303
第27章 集成测试 306
27.1 模拟JSF交互 307
27.2 使用JSF EL表达式 308
27.3 事务型数据源 309
第Ⅶ部分 生产部署 313
第28章 使用生产数据库 313
28.1 安装和设置数据库 313
28.2 安装数据库驱动程序 315
28.3 定义数据源 315
28.4 配置持久化引擎 315
28.5 关于Tomcat 316
第29章 Java EE 5.0部署 318
29.1 JBoss应用服务器4.0.5版本 318
29.2 JBoss应用服务器4.2.x和5.x系列版本 318
29.3 GlassFish 319
第30章 性能调整和集群 323
30.1 单台服务器上的性能调整 323
30.1.1 避免按值调用 324
30.1.2 JVM选项 324
30.1.3 减少日志记录 325
30.1.4 对HTTP线程池进行性能调整 325
30.1.5 选择在客户端还是服务器端保存状态 327
30.1.6 使用生产数据源 327
30.1.7 使用二级数据库缓存 328
30.1.8 谨慎使用数据库事务 330
30.2 利用服务器集群实现可伸缩性和故障转移 330
30.2.1 粘性会话的负载平衡 331
30.2.2 状态复制 331
30.2.3 故障转移体系结构 332
第Ⅷ部分 新兴技术 335
第31章 Web应用程序中周期性作业的调度 335
31.1 简单的周期性事件 335
31.2 配置Quartz调度器服务 337
31.3 调度cron作业 339
31.4 在启动时进行作业调度 339
31.5 结论 341
第32章 利用多层缓存提高可伸缩性 342
32.1 多层缓存 343
32.2 通过Seam集成缓存提供程序 344
32.3 Seam中简化的缓存实现 347
第33章 Seam对Groovy的支持 350
33.1 Groovy实体 351
33.2 Groovy操作 353
33.3 与Groovy的集成 355
第34章 Web Beans简介 357
34.1 定义Web Beans组件 357
34.2 组件注入 359
34.3 生产者方法 361
34.4 上下文模型 363
34.5 组件原型 366
34.6 实现横切行为 368
34.7 总结 369
附录A 安装和部署JBoss应用服务器 371
附录B 将示例应用程序用作模板 373
附录C Maven的使用 387
附录D 直接访问Hibernate API 397