JSF是未来Java Web开发的标准框架, 得到业界大公司的鼎力支持。从Java EE 5开始, JSF已经上升为Java官方规范的强制部分。JSF极大地简化了Java Web的开发,充分体现出Sun“简化Java开发”的宗旨。
本书从实用的角度介绍JSF Web开发技术,具有以下特色:
●立足于JSF技术在实际编程中的运用,包含50多个范例, 帮助读者通过实践掌握JSF的精髓。
●通过一个完整的论坛系统的实例文档和代码,带领读者体验JSF应用开发的全过程。
●结合最流行的NetBeans 6开发工具讲解。
●从组件模型到请求处理生命周期,囊括JSF的全部技术要点。
●循序渐进,由浅入深,大大降低学习难度。
●读者可从华章公司网站(www.hzbook.com)下载与本书配套的源程序。
●作者为本书设立专门的技术支持网站(www.madihe.com),读者可访问网站参与论坛讨论和答疑。
作者简介
李文兵中国最早一代PC程序员,从事软件开发超过20年,见证了中国软件行业发展的全部历程,熟悉多种编程语言。他曾就职于若干软件企业,担任程序员、高级程序员、系统分析员、项目经理、测试部主管、开发部经理及技术总监等职,参与过多个软件项目的开发,涉及通信、外贸、制造、金融、移动通信和电信等诸多应用领域。在从程序编码、系统设计、需求分析到软件测试的各个软件工程环节上,均具有扎实的理论基础和丰富的实践经验。李文兵从2006年开始尝试IT写作,并以“麻地河”为笔名在IT168上发表过多篇技术和评论文章,以阅历丰富、观点独到、文笔流畅见长,善于用朴素的语言解释深奥的技术,深受读者喜爱。欢迎读者访问本书配套网站www.madihe.com共同探讨JSF技术
封面图
目录
- 序言
- 前言
- 第1章 JSF简介1
- 1.1 JSF概述1
- 1.1.1 JSF的定义1
- 1.1.2 JSF与MVC设计模式2
- 1.1.3 JSF设计目标3
- 1.2 JSF的优势4
- 1.2.1 可视化开发5
- 1.2.2 可重用UI组件7
- 1.2.3 集中式页面导航8
- 1.2.4 事件驱动8
- 1.2.5 表示层和业务层的分离9
- 1.2.6 用户界面到业务逻辑的直接映射9
- 1.2.7 清晰的角色分工10
- 1.2.8 Web开发的官方标准之一11
- 1.3 JSF的开发工具NetBeans11
- 1.3.1 NetBeans简介12
- 1.3.2 NetBeans版本13
- 1.3.3 安装NetBeans14
- 1.3.4 熟悉NetBeans的界面14
- 1.3.5 配置应用服务器15
- 1.3.6 配置数据库服务器16
- 1.3.7 JSF,就是这么简单17
- 第2章 快速入门18
- 2.1 一个简单的JSF例子:WebLogin程序18
- 2.2 WebLogin的概要设计19
- 2.2.1 业务功能设计19
- 2.2.2 网页设计19
- 2.2.3 导航设计21
- 2.2.4 应用集成设计22
- 2.3 WebLogin的详细设计22
- 2.3.1 创建JSF项目22
- 2.3.2 编写用户身份验证的业务逻辑24
- 2.3.3 编写网页25
- 2.3.4 配置页面导航32
- 2.3.5 应用集成34
- 2.4 运行WebLogin42
- 第3章 UI组件43
- 3.1 UI组件概述43
- 3.1.1 组件的功能43
- 3.1.2 组件和组件类44
- 3.1.3 组件和页面Bean的关系45
- 3.1.4 组件的事件及其响应46
- 3.1.5 组件外观和CSS47
- 3.2 组件的一般属性49
- 3.2.1 id属性49
- 3.2.2 style属性49
- 3.2.3 styleClass属性50
- 3.2.4 required属性51
- 3.2.5 toolTip属性52
- 3.2.6 disabled属性53
- 3.2.7 visible属性55
- 3.2.8 rendered属性57
- 3.2.9 tabIndex属性58
- 3.3 基本组件59
- 3.3.1 标签组件59
- 3.3.2 静态文本组件62
- 3.3.3 文本字段组件64
- 3.3.4 文本区域组件68
- 3.3.5 按钮组件71
- 3.3.6 超级链接组件76
- 3.3.7 图像超级链接组件79
- 3.3.8 下拉列表组件79
- 3.3.9 列表框组件85
- 3.3.10 复选框组件88
- 3.3.11 复选框组组件90
- 3.3.12 单选按钮组件93
- 3.3.13 单选按钮组组件94
- 3.3.14 图像组件94
- 3.3.15 表组件95
- 3.3.16 表行组组件100
- 3.3.17 表列组件101
- 3.3.18 口令字段组件104
- 3.3.19 隐藏字段组件105
- 3.3.20 日历组件108
- 3.3.21 文件上传组件109
- 3.3.22 树组件112
- 3.3.23 树节点组件113
- 3.3.24 锚点组件117
- 3.3.25 消息组件118
- 3.3.26 消息组组件119
- 3.4 虚拟表单120
- 3.4.1 虚拟表单的定义121
- 3.4.2 虚拟表单的用途122
- 第4章 页面导航127
- 4.1 页面导航概述127
- 4.1.1 Web应用的页面与导航127
- 4.1.2 集中式的JSF页面导航128
- 4.1.3 页面导航的可视化设计130
- 4.1.4 导航规则131
- 4.2 在JSF页面中导航132
- 4.2.1 导航的触发132
- 4.2.2 触发导航的组件类型133
- 4.2.3 静态导航和动态导航134
- 4.2.4 用动作类组件实现静态导航134
- 4.2.5 在动作类组件的静态导航中加入业务逻辑136
- 4.2.6 用输入类组件实现静态导航136
- 4.2.7 用动作类组件实现动态导航137
- 4.2.8 用导航实现页面刷新重载138
- 4.3 高级导航应用141
- 4.3.1 从任意页面导航到指定页面142
- 4.3.2 在导航页面之间传递参数144
- 第5章 托管Bean和统一表达式语言EL150
- 5.1 托管Bean和EL概述150
- 5.1.1 托管的含义150
- 5.1.2 用EL访问托管Bean152
- 5.1.3 托管Bean和EL的用途153
- 5.2 托管Bean的范围154
- 5.2.1 请求范围157
- 5.2.2 会话范围158
- 5.2.3 应用范围159
- 5.2.4 使用正确的范围160
- 5.3 绑定161
- 5.3.1 值绑定162
- 5.3.2 动作类组件的方法绑定164
- 5.3.3 输入类组件的方法绑定166
- 5.3.4 实例绑定169
- 5.4 使用页面Bean171
- 5.4.1 页面和页面Bean171
- 5.4.2 页面Bean的生命周期方法172
- 5.4.3 响应动作事件174
- 5.4.4 响应值改变事件175
- 5.4.5 动态生成UI组件176
- 5.5 使用请求Bean178
- 5.5.1 默认的和自定义的请求Bean178
- 5.5.2 请求Bean的生命周期方法179
- 5.5.3 在相邻页面之间传递参数180
- 5.6 使用会话Bean184
- 5.6.1 会话和会话Bean184
- 5.6.2 默认的和自定义的会话Bean186
- 5.6.3 会话Bean的生命周期方法187
- 5.6.4 管理会话189
- 5.6.5 跨页面共享信息194
- 5.7 使用应用Bean196
- 5.7.1 Web应用和应用Bean196
- 5.7.2 默认的和自定义的应用Bean197
- 5.7.3 应用Bean的生命周期方法198
- 5.7.4 跨会话共享信息199
- 第6章 事件驱动202
- 6.1 Java事件驱动概述202
- 6.1.1 事件驱动模式概述202
- 6.1.2 事件类203
- 6.1.3 监听器接口204
- 6.1.4 监听器205
- 6.1.5 事件源205
- 6.1.6 事件驱动的实例211
- 6.2 JSF的事件驱动模式212
- 6.2.1 JSF事件类213
- 6.2.2 JSF监听器接口214
- 6.2.3 JSF监听器214
- 6.2.4 JSF监听器的注册215
- 6.2.5 JSF的回调方法216
- 6.2.6 JSF的事件队列218
- 6.3 动作事件220
- 6.3.1 动作事件类221
- 6.3.2 动作监听器接口221
- 6.3.3 响应动作事件222
- 6.3.4 动作事件源223
- 6.3.5 动作事件示例224
- 6.4 值改变事件228
- 6.4.1 值改变事件类229
- 6.4.2 值改变监听器接口230
- 6.4.3 响应值改变事件230
- 6.4.4 值改变事件源232
- 6.4.5 值改变事件示例233
- 6.5 阶段事件234
- 6.5.1 阶段事件类235
- 6.5.2 阶段监听器接口236
- 6.5.3 响应阶段事件236
- 6.5.4 阶段事件源237
- 6.5.5 阶段事件示例238
- 第7章 转换器242
- 7.1 转换器概述242
- 7.1.1 问题的提出242
- 7.1.2 转换器的用途243
- 7.1.3 转换器的原理245
- 7.2 编写转换器247
- 7.2.1 转换器接口247
- 7.2.2 标准转换器249
- 7.2.3 自定义转换器252
- 7.3 注册转换器253
- 7.3.1 类型注册254
- 7.3.2 名称注册255
- 7.3.3 默认注册256
- 7.4 托管转换器257
- 7.5 引用转换器258
- 7.5.1 自动引用258
- 7.5.2 通过converter属性引用259
- 7.5.3 通过f:converter标签引用261
- 7.5.4 通过专用标签引用262
- 7.5.5 不引用转换器263
- 7.6 转换器示例263
- 7.6.1 使用标准转换器263
- 7.6.2 DateTime标准转换器264
- 7.6.3 Number标准转换器269
- 7.6.4 替换标准转换器274
- 7.6.5 自定义类型的转换278
- 第8章 验证器284
- 8.1 验证器概述284
- 8.1.1 验证器的用途284
- 8.1.2 验证器的原理285
- 8.2 编写验证器和验证方法286
- 8.2.1 验证器接口287
- 8.2.2 标准验证器287
- 8.2.3 自定义验证器289
- 8.2.4 验证方法290
- 8.3 注册验证器291
- 8.3.1 名称注册291
- 8.3.2 默认注册292
- 8.4 托管验证器292
- 8.5 引用验证器293
- 8.5.1 通过validatorExpression属性引用294
- 8.5.2 通过f:validator标签引用296
- 8.5.3 通过专用标签引用297
- 8.6 验证器示例298
- 8.6.1 使用标准验证器298
- 8.6.2 用代码控制验证器299
- 8.6.3 使用自定义验证器302
- 第9章 消息305
- 9.1 JSF的消息机制305
- 9.2 消息类306
- 9.2.1 消息类及其属性和方法307
- 9.2.2 消息类的实例化307
- 9.3 消息包308
- 9.3.1 Java类形式的消息包308
- 9.3.2 属性文件形式的消息包310
- 9.4 消息的产生311
- 9.4.1 注册消息包311
- 9.4.2 引用消息312
- 9.5 消息的排队312
- 9.5.1 将消息加入队列313
- 9.5.2 指定关联UI组件313
- 9.5.3 页面Bean的消息实用方法315
- 9.6 消息的显示315
- 9.7 带参数消息316
- 9.8 标准消息及其替换316
- 9.8.1 标准消息316
- 9.8.2 替换标准消息318
- 第10章 数据库访问及持久化321
- 10.1 数据库访问模型321
- 10.2 缓存行集325
- 10.2.1 实例化325
- 10.2.2 初始化326
- 10.2.3 数据读取326
- 10.2.4 光标操作327
- 10.2.5 增删改328
- 10.2.6 保存329
- 10.2.7 带参数的缓存行集330
- 10.3 缓存行集数据提供器331
- 10.3.1 实例化331
- 10.3.2 配置332
- 10.3.3 数据读取334
- 10.3.4 用EL表达式访问缓存行集数据
- 提供器334
- 10.4 数据库访问实例338
- 10.4.1 MySQL的下载、安装和配置338
- 10.4.2 建表340
- 10.4.3 建立外键关系342
- 10.4.4 添加模拟数据343
- 10.4.5 用列表框组件显示表字段344
- 10.4.6 用表组件操作表数据347
- 10.4.7 主从式数据访问352
- 10.5 持久化356
- 10.5.1 持久化技术概述356
- 10.5.2 持久化单元357
- 10.5.3 持久化标注358
- 10.5.4 实体管理359
- 10.5.5 事务管理360
- 10.5.6 主键生成策略361
- 10.5.7 查询362
- 10.5.8 带参数查询363
- 10.5.9 命名查询364
- 10.5.10 JSF与持久化365
- 10.5.11 NetBeans中的持久化365
- 10.5.12 持久化示例366
- 第11章 JSF实例:论坛376
- 11.1 需求分析376
- 11.1.1 术语解释376
- 11.1.2 用户管理380
- 11.1.3 帖子管理381
- 11.2 数据库设计382
- 11.2.1 注册用户表383
- 11.2.2 帖子表383
- 11.2.3 主题表383
- 11.2.4 回帖表383
- 11.2.5 置顶表384
- 11.2.6 表间关系384
- 11.3 功能设计384
- 11.3.1 用户注册384
- 11.3.2 用户封闭385
- 11.3.3 用户解封385
- 11.3.4 用户登录385
- 11.3.5 修改密码386
- 11.3.6 用户退出386
- 11.3.7 强制下线386
- 11.3.8 密码重设386
- 11.3.9 设管387
- 11.3.10 撤管387
- 11.3.11 用户删除387
- 11.3.12 查询用户列表388
- 11.3.13 发新帖388
- 11.3.14 回复388
- 11.3.15 修改帖子388
- 11.3.16 删除帖子389
- 11.3.17 主题置顶389
- 11.3.18 撤销置顶389
- 11.3.19 主题列表389
- 11.3.20 阅读主题390
- 11.3.21 搜索帖子390
- 11.3.22 在线用户数统计390
- 11.3.23 帖子数统计390
- 11.3.24 今日新帖数统计390
- 11.4 页面设计391
- 11.4.1 首页391
- 11.4.2 用户管理页面391
- 11.4.3 用户删除确认页面391
- 11.4.4 密码重设页面391
- 11.4.5 帖子删除确认页面391
- 11.4.6 我的论坛页面391
- 11.4.7 登录页面391
- 11.4.8 登录成功页面391
- 11.4.9 注册页面392
- 11.4.10 注册成功页面392
- 11.4.11 修改密码页面392
- 11.4.12 修改密码成功页面392
- 11.4.13 用户退出成功页面392
- 11.4.14 发新帖页面392
- 11.4.15 发新帖成功页面392
- 11.4.16 回复页面392
- 11.4.17 回复成功页面392
- 11.4.18 阅读主题页面392
- 11.4.19 帖子修改页面393
- 11.5 导航设计393
- 11.5.1 页面导航表393
- 11.5.2 页面导航配置文件393
- 11.5.3 异常处理395
- 11.5.4 业务集成396
- 11.6 详细设计397
- 11.6.1 数据库表397
- 11.6.2 业务逻辑Bean400
- 11.6.3 持久化404
- 11.6.4 会话管理408
- 11.6.5 页面编码411
- 11.6.6 表和数据提供器457
- 11.6.7 异常处理465
- 11.6.8 主题表排序467
- 11.6.9 参数传递468
- 第12章 源代码的下载和使用470
- 12.1 下载方式470
- 12.2 源代码压缩文件包内容470
- 12.2.1 源程序目录470
- 12.2.2 SQL文件472
- 12.3 准备开发环境473
- 12.3.1 JDK473
- 12.3.2 NetBeans473
- 12.3.3 GlashFish473
- 12.4 安装和配置MySQL数据库474
- 12.4.1 下载和安装474
- 12.4.2 创建数据库、表格、视图并添加
- 数据474
- 12.4.3 在NetBeans中建立数据库连接475
- 12.5 打开并运行范例程序476
- 12.6 常见问题477