第一部分 了解Seam 2
第1章 Seam使Java EE一体化 2
1.1 我该选用哪种框架 3
1.2 选择Seam 3
1.2.1 完整的应用程序栈 4
1.2.2 开发Seam的原因 4
1.2.3 “厂商垄断”传闻真相 5
1.2.4 Seam用例 6
1.3 Seam的统一方法 7
1.3.1 Seam整合了JSF、JPA和POJO组件 7
1.3.2 上下文组件模型 9
1.4 牛刀小试 12
1.4.1 充当Backing Bean的实体类 12
1.4.2 全能的组件 13
1.4.3 将组件绑定到视图上 14
1.4.4 按需获取数据 16
1.4.5 可点击列表 16
1.4.6 为JSF设计的集成测试 17
1.5 Seam的核心竞争力 18
1.5.1 让JSF变成能手 19
1.5.2 让你快速构建“富”应用 21
1.5.3 构建敏捷的开发环境 22
1.6 小结 23
第2章 seam-gen实践 25
2.1 Open 18原型 25
2.1.1 整装待发 26
2.1.2 将实体映射到数据库Schema 27
2.2 让seam-gen完成初始工作 30
2.2.1 seam-gen的特点 30
2.2.2 seam-gen提供的特性 31
2.3 用seam-gen启动项目 32
2.3.1 seam-gen命令一览 32
2.3.2 与seam-gen的针锋对话 34
2.3.3 创建基础项目结构 37
2.3.4 生成CRUD 38
2.4 将项目部署到JBoss应用服务器 40
2.4.1 部署 40
2.4.2 展开 41
2.4.3 切换环境 42
2.4.4 启动JBoss应用服务器 43
2.5 展示与讲述、改变和重复 45
2.5.1 球场漫步 45
2.5.2 反向工程的过程 50
2.5.3 探讨生成项目的结构 53
2.6 快速开发seam-gen项目 56
2.6.1 增量热部署 57
2.6.2 用IDE加速开发 60
2.7 小结 69
第二部分 Seam基础知识 72
第3章 Seam的生命周期 72
3.1 Seam如何参与请求 73
3.1.1 Seam的开关 73
3.1.2 JSF Servlet:Seam的动力 74
3.1.3 通过Seam的资源Servlet访问资源 79
3.1.4 Seam的Servlet过滤器链 80
3.1.5 Seam的阶段监听器 82
3.2 没有Seam的JSF生命周期 83
3.2.1 JSF生命周期阶段 84
3.2.2 初始请求 85
3.2.3 回传 87
3.2.4 JSF生命周期的缺点 88
3.3 Seam面向页面生命周期的附加功能 90
3.3.1 pages.xml的高级编排 90
3.3.2 智能导航 92
3.3.3 Seam UI命令组件 95
3.3.4 页面参数 96
3.3.5 页面动作:先执行我 100
3.4 页面动作与导航的结合 101
3.4.1 对请求进行完整性检查 102
3.4.2 内建的页面视图 103
3.4.3 对搜索引擎友好的URL 104
3.5 Seam的JSF生命周期 106
3.5.1 阶段监听器和Servlet过滤器 106
3.5.2 概览增强的生命周期 106
3.6 用try-catch块包围生命周期 109
3.6.1 以优雅的方式处理失败 109
3.6.2 注册异常处理器 109
3.6.3 将异常扼杀在萌芽中 110
3.7 小结 111
第4章 组件及其上下文 113
4.1 Seam的上下文命名容器 113
4.1.1 Seam的上下文模型 114
4.1.2 统一了Java的Servlet上下文 114
4.1.3 Seam中新的有状态上下文 115
4.1.4 Seam中增强的Servlet上下文 116
4.2 组件的分类 117
4.2.1 组件与组件实例 117
4.2.2 Seam管理组件 118
4.3 用注解定义组件 119
4.3.1 给组件取个名称 120
4.3.2 给组件一个作用域 121
4.4 完整的组件范例 122
4.4.1 创建实体组件 122
4.4.2 准备动作Bean组件 126
4.4.3 集成测试组件 127
4.4.4 让组件“钩进”JSF 128
4.5 组件的一生 131
4.5.1 加载组件定义 131
4.5.2 何时安装组件 132
4.5.3 给一个组件多个角色 134
4.5.4 在启动时实例化组件 135
4.5.5 组件生命周期回调 136
4.5.6 将组件组装起来 138
4.5.7 所有组件在哪里结束生命周期 139
4.6 在Seam中使用EJB 3会话Bean 139
4.6.1 到底是谁的组件 140
4.6.2 Seam会话Bean组件的生成 141
4.6.3 整合机制 142
4.7 访问组件 146
4.7.1 访问模式 146
4.7.2 访问策略 147
4.8 小结 153
第5章 Seam组件描述符 155
5.1 利用XML定义组件 156
5.1.1 描述符的选择策略 156
5.1.2 组件描述符的结构 157
5.1.3 细粒度组件描述符 159
5.2 组件描述符中的XML命名空间 160
5.2.1 XML命名空间声明的作用 160
5.2.2 为包中的组件定义XML命名空间 163
5.2.3 如何转译XML命名空间 164
5.2.4 引入上下文变量前缀 167
5.3 配置组件属性 168
5.3.1 将组件定义成对象原型 168
5.3.2 在何处定义组件属性 169
5.3.3 属性值类型 175
5.3.4 组装组件 180
5.4 组件定义和组件配置 182
5.4.1 避免与现有定义相冲突 183
5.4.2 混和使用注解和XML 184
5.5 配置和启用内建组件 184
5.5.1 用组件描述符控制Seam 184
5.5.2 配置Seam的国际化支持 185
5.6 小结 187
第6章 IoC 189
6.1 bijection:依赖注入的演变 190
6.1.1 引入bijection 190
6.1.2 高尔夫球场上的bijection 191
6.1.3 激活bijection 191
6.2 动态的依赖注入 193
6.2.1 声明注入点 193
6.2.2 注入流程 195
6.2.3 混合作用域和可序列化的能力 197
6.2.4 注入变体 198
6.3 注出上下文变量 200
6.3.1 注出流程 200
6.3.2 注出用例 202
6.3.3 内建的数据模型支持 204
6.4 避开bijection 211
6.4.1 内部方法调用 211
6.4.2 方法上下文探秘 213
6.4.3 重入(Reentrant)方法调用 213
6.4.4 通过关闭拦截器来关闭bijection 215
6.5 组件事件 216
6.5.1 通过组件触发事件 216
6.5.2 定义事件观察者 218
6.5.3 在页面转换中触发事件 219
6.5.4 内建事件 220
6.6 自定义的方法拦截器 221
6.6.1 拦截器的利与弊 221
6.6.2 定义Seam拦截器 223
6.7 工厂和管理器组件 224
6.7.1 上下文变量@Factory 224
6.7.2 @Unwrap组件 230
6.8 小结 233
第三部分 Seam的状态管理第7章 Seam的工作单元:对话 236
7.1 学会辨别对话的状态 236
7.1.1 重新定义工作单元 237
7.1.2 管理状态的压力 238
7.2 对话上下文 240
7.2.1 从HTTP会话中划出工作空间 240
7.2.2 可以在对话中保存什么数据 242
7.3 建立对话范围 243
7.3.1 对话的状态 243
7.3.2 启动长期对话 246
7.3.3 让对话继续 252
7.3.4 将对象收集到对话中 253
7.3.5 终止长期对话 256
7.4 将对话搁置 258
7.4.1 放弃对话 258
7.4.2 创建嵌套对话 259
7.5 对话转换 262
7.5.1 用对话作为工作空间 262
7.5.2 给对话一个说明 264
7.5.3 利用内建的对话转换器 265
7.6 用页面流驱动对话 270
7.6.1 构建页面流 270
7.6.2 了解页面流 271
7.6.3 推进页面流 273
7.6.4 处理返回按钮 275
7.7 特定的对话 276
7.7.1 生意开张 276
7.7.2 展示结果 277
7.8 小结 278
第8章 了解Java持久化 279
8.1 Java持久化原理 280
8.1.1 建立期望值 280
8.1.2 Java持久化的四大要素 280
8.2 实体和关系 281
8.2.1 映射元数据 282
8.2.2 传递性持久化 282
8.2.3 在持久层中引入注解 283
8.3 持久化单元 284
8.3.1 定义JCA数据源 284
8.3.2 持久化单元描述符 285
8.3.3 持久化管理器工厂 287
8.4 持久化管理器 287
8.4.1 获得持久化管理器 287
8.4.2 持久化管理器的管理功能 288
8.4.3 设置持久化上下文的作用域 289
8.5 事务 289
8.5.1 事务API的分类 289
8.5.2 原子工作单元 290
8.5.3 ACID缩写 291
8.6 管理企业中的持久化 292
8.6.1 扩展持久化上下文简介 292
8.6.2 扩展持久化上下文的好处 293
8.7 在JPA或Hibernate中做出选择 298
8.7.1 Hibernate和JPA之间的关系 298
8.7.2 Hibernate和JPA之间的区别 299
8.7.3 Seam的合成方法 299
8.8 小结 300
第9章 受Seam管理的持久化和事务 301
9.1 正确管理持久化上下文 301
9.1.1 尊重持久化管理器 302
9.1.2 管理扩展的持久化上下文 303
9.2 强化持久化管理器的能力 304
9.2.1 Seam的标准强化功能 304
9.2.2 让Hibernate充分发挥 307
9.3 在Seam中构建持久化单元 309
9.3.1 Seam的持久化管理器工厂 309
9.3.2 受Seam管理的持久化上下文 311
9.3.3 通过JNDI共用持久化管理器工厂 313
9.3.4 在启动时验证持久化上下文 315
9.4 Seam的事务支持 316
9.4.1 全局事务 316
9.4.2 Seam的事务抽象层 317
9.4.3 控制受Seam管理的事务 319
9.4.4 应用程序事务 321
9.5 小结 324
第10章 快速开发Seam应用程序 325
10.1 框架中的框架 325
10.1.1 持久化API的包装 326
10.1.2 持久化控制器 327
10.1.3 两种用途 329
10.2 采用Home组件的有状态CRUD 330
10.2.1 弥补Anemic Domain Model的不足 330
10.2.2 领域对象中引入Home 330
10.2.3 Home的应用 334
10.2.4 离开Home的风险 344
10.2.5 CRUD XML 349
10.3 提供反馈 351
10.3.1 自定义状态消息 351
10.3.2 创建与i18n兼容的消息 352
10.3.3 事务成功事件 353
10.4 用Query组件进行更智能的查询 354
10.4.1 创建结果集列表 355
10.4.2 对结果集分页 357
10.4.3 同时删除多个记录 359
10.4.4 对结果集排序 360
10.4.5 对结果集添加限制 362
10.5 小结 367
第四部分 深入业务需求 370
第11章 保护Seam应用程序安全 370
11.1 启动验证 371
11.1.1 给用户一个id 371
11.1.2 用3个步骤实现验证 372
11.1.3 概览Seam的id管理 378
11.1.4 更“基础的”验证 379
11.2 保护页面安全 381
11.2.1 JSF安全的挑战 381
11.2.2 请求验证 383
11.2.3 安全地服务页面 387
11.3 基于角色的授权 388
11.3.1 表达限制 389
11.3.2 声明基于角色的限制 391
11.4 利用Drools进行基于规则的授权 394
11.4.1 规则与角色 394
11.4.2 配置Drools 394
11.4.3 用Drools创建规则 396
11.4.4 自动侦测上下文 401
11.5 人机分离 403
11.5.1 CAPTCHA概览 403
11.5.2 在表单中添加一个CAPTCHA问讯 403
11.6 小结 404
第12章 Ajax和JavaScript远程处理 405
12.1 结合JSF使用Ajax 406
12.1.1 采用server-centric应用程序模型 406
12.1.2 Ajax4jsf和ICEfaces向JSF开启了通信渠道 406
12.1.3 Seam在基于Ajax的JSF请求中的作用 410
12.2 部分提交表单 412
12.2.1 即时校验 412
12.2.2 精通业务的校验 414
12.2.3 协助用户填写表单 415
12.3 ICEfaces的Ajax Push 416
12.4 JavaScript与Seam的远程处理 418
12.4.1 透明的Ajax 418
12.4.2 让浏览器访问Seam组件 420
12.4.3 调用服务器端组件 423
12.4.4 本地存根 426
12.5 对话的远程处理调用 429
12.5.1 加入正在进行的对话 429
12.5.2 启动对话 430
12.5.3 成批发送请求 431
12.6 响应GWT远程调用 432
12.6.1 GWT整合简介 432
12.6.2 准备远程处理服务 432
12.6.3 通过Seam远程处理GWT服务调用 433
12.7 小结 434
第13章 文件、丰富渲染和电子邮件支持 436
13.1 加载文件并渲染动态图像 436
13.1.1 接受文件加载 437
13.1.2 从原始数据渲染图像 439
13.2 用iText生成PDF 441
13.2.1 用UI组件对PDF进行排版 441
13.2.2 处理表格和单元格 445
13.2.3 添加颜色 448
13.2.4 优雅的失败和友好的文件扩展名 448
13.2.5 提供动态文件 449
13.3 用JFreeChart轻松绘制图表 451
13.3.1 图表基础知识 451
13.3.2 柱状图 452
13.3.3 线图 453
13.3.4 饼状图 454
13.4 用Seam的方式构建电子邮件 455
13.4.1 发出第一条消息 455
13.4.2 在消息中附加其他因素 458
13.4.3 在Seam中构建JavaMail 461
13.4.4 发布动态消息 464
13.5 用resource bundle定制UI 465
13.5.1 让Seam使用正确的语言 465
13.5.2 主题 468
13.6 小结 470
附录A Seam的准备工作 471
A.1 准备工作 471
A.1.1 与Java 5的兼容性 472
A.1.2 JavaEE 5应用服务器 472
A.1.3 没有(JavaServer)Faces 474
A.2 下载Seam发行包 475
A.2.1 Seam的模块 475
A.2.2 诸多文件和范例 476
A.2.3 在杂乱中寻找seam-gen 476
A.3 seam-gen和Open 18范例应用程序 476
A.3.1 源代码 476
A.3.2 H2数据库 477
A.3.3 Apache Ant带动了seam-gen 477
A.3.4 随意选用RichFaces或ICEfaces 477
A.4 管理seam-gen工程中的类库 478
A.5 添加Seam作为Maven 2依赖 478
参考文献 480