标题：疯狂Ajax讲义——Prototype/jQuery+DWR+Spring+Hibernate整合开发
内 容 简 介
本书是《基于J2EE的Ajax宝典》的第二版。《基于J2EE的Ajax宝典》面市近2年，作为Ajax领域最全面、实用的图书，一直深受读者的好评。
全书主要分为三个部分。第一部分介绍了XHTML、CSS、JavaScript和DOM编程等内容。第二部分详细介绍了Prototype、jQuery、DWR、AjaxTags等四个最常用的Ajax框架的用法，并针对每个框架提供了一个实用案例。这两个部分是笔者在“疯狂Java实训营”的培训讲义，是本书的重点部分。第三部分则提供了2个综合性案例：Blog系统和电子拍卖系统，让读者将前面所学真正应用到实际项目中。
本书绝大部分章节后都提供了相应的编程习题，供开发者巩固所学，将理论融入实际开发之用。关于这些编程习题的解题思路和参考答案可登录网站[1]获取。
本书是疯狂Java体系丛书之一，前8章基本以XHTML、JavaScript和DOM编程为主，无须任何基础即可阅读；第9章以后的内容则需要掌握Spring、Hibernate等Java EE知识，建议先认真阅读疯狂Java体系的《轻量级Java EE企业应用实战》一书。
编辑推荐
疯狂源自梦想，技术成就辉煌。
看得懂　学得会　做得出
不知道是否有人仔细研究过笔者写的书，书中的长句是很少的——因为很多语句自己都会反复地调整，有兴趣的读者可以仔细体会一下这个特点。此外，本书还有如下特点：
1.通俗易懂，适合自学该书第一版作为培训教材近2年了．在吸收大量学习者的学习体会和心得的基础上，本书重点讲解了学习过程中难以理解和掌握的知识点，降低了学习者的学习难度。
2.知识丰富，内容全面正如该书的第一版，书中知识非常全面：XHTML、CSS、JavaScript、DOM、Event机制XMLHttpRequest、Prototype库、jQuery、DWR、AjaxTags等Ajax知识的相关内容．都可在本书中找到详细的讲解。
3.深入实用，实践性强本书并不是一本Ajax的入门图书，本书将Ajax技术融入轻量级Java EE开发，深入介绍了Ajax+Java EE整合开发的方法和步骤，对实际企业开发具有极好的指导意义。
前 言
Ajax技术已经不再是新技术，它已经成为企业开发中应用最广泛的技术之一，不管采用什么样的开发平台：Java EE也好，.NET也好，PHP也好，Ruby on Rails也好，只要开发B/S架构的应用，那么表现层就一定会使用Ajax技术。
Ajax技术采用异步方式发送请求，避免了每个请求对应一个页面的模式，允许在一个页面发送多个请求，从而可以更大程度地利用已下载的页面，服务器每次响应生成的只是必需的数据，无须响应生成整个页面。对用户而言，发送异步请求不会阻塞当前的浏览器线程，浏览器可以继续下一步操作：比如继续浏览或再次发送异步请求。因此用户将不会处于等待状态，而是感觉自己一直与应用处于交互状态，从而带给了用户连续的体验。
Ajax技术是Web 2.0的重要技术之一，互连网上各种Blog系统、RSS，以及Wiki系统和SNS交友网络等，都大量使用了Ajax技术。
Ajax技术还催生了大量的网页游戏。国内的很多游戏运营商纷纷推出了自己的网页游戏。网页游戏具有无须下载、安装，即开即玩、简单便捷的特征，尤其对办公室上班族具有较大的吸引力，因此也具有很好的市场前景。在这种网页游戏中，每个网页上都包含了大量制作精美的图片，当游戏玩家单击、双击这些图片时，系统将采用Ajax技术与远程服务器通信，这是绝大部分网页游戏的底层运行机制。
2007年出版的《基于J2EE的Ajax宝典》具有全面、专业的特征，书中不仅深入介绍了Ajax编程的底层原理和技术，还全面介绍了Prototype、Dojo、DWR、JSON-RPC-Java和AjaxTags等5个Ajax框架。不过，Dojo版本更新太快，这一点限制了它在实际企业开发中的应用。本书作为《基于J2EE的Ajax宝典》的第二版，详细介绍了XHTML、CSS、JavaScript、DOM和JavaScript事件机制等基础知识，重点分析了XMLHttpRequest对象的运行机制和运行原理。Ajax框架的介绍部分，Prototype、DWR、AjaxTags等框架升级到了最新版本，另外新增介绍了jQuery框架。
本书的创作感言写一本书真的很累！每次一本书写到最后几章时，都会有一种近似虚脱的感觉。此外，如果还遭遇一些来自外界的困扰，就让人更加难以静下来做事。不过，笔者现在的主要职业是培训，需要不断地面对新的学生，有责任引导他们进入软件开发行业，这大概是支持自己继续写下去的一个动力吧。
最初，笔者写书仅仅是为了作为笔者的培训教材，帮助自己的学生能更好地理解自己所讲授的内容，所以总是尽量使用清晰条理的方式来组织内容，用实用、易操作的实例来演示开发，用通俗易懂的语言进行表达。希望把实际企业开发中解决问题的方法，用通俗、简单的语言告诉学生。
在本书创作过程中，笔者一度感到非常困惑：其实笔者这些书的学术价值真的很少，因为基本上没有什么创新，绝大部分都是前人的智慧。充其量，笔者只是进行了再归纳、总结，于是难免感到意兴阑珊。
无聊中和一位美籍华人（一位资深CTO）在Skype上聊天，他告诉笔者：印度的程序员数量大概是中国程序员的100倍，因为印度有大量的程序员基数，所以就孕育出了大量优秀的程序员。中国人，虽然是世界上非常聪明的种族之一，但中国程序员太少了，所以中国产生的优秀程序员也很少。你写的书虽然没有什么创新，但只要能把实际软件开发的方法和经验传播开来，让更多的年轻人走进软件开发行业，你就为中国的软件开发业做出了贡献。如果有一天中国拥有1亿以上的软件开发工程师，那中国软件行业就真正发展起来了。
那天之后，萧索的心情开始慢慢好转，毕竟自己还在做一件“切实爱国”的事情。笔者心想：爱国，不是光喊口号的事情，而是需要埋头做事的。
本书有什么特点不知道是否有人仔细研究过笔者写的书，书中的长句是很少的——因为很多语句自己都会反复地调整，有兴趣的读者可以仔细体会一下这个特点。
《基于J2EE的Ajax宝典》上市一年半了，其间收到不少读者来信，对书中内容也提了一些自己的见解。此外，该书也一直作为“疯狂Java实训营”的讲义，这些对本书的升级起到了很大的帮助。
此外，本书还有如下特点：
1．通俗易懂，适合自学
该书第一版作为培训教材近2年了，在吸收大量学习者的学习体会和心得的基础上，本书重点讲解了学习过程中难以理解和掌握的知识点，降低了学习者的学习难度。
2．知识丰富，内容全面
正如该书的第一版，书中知识非常全面：XHTML、CSS、JavaScript、DOM、Event机制、XMLHttpRequest、Prototype库、jQuery、DWR、AjaxTags等Ajax知识的相关内容，都可在本书中找到详细的讲解。
3．深入实用，实践性强
本书并不是一本Ajax的入门图书，本书将Ajax技术融入轻量级Java EE开发，深入介绍了Ajax+Java EE整合开发的方法和步骤，对实际企业开发具有极好的指导意义。
衷心感谢本书创作过程中有一些小事情一度影响了笔者的心情，让笔者产生过心灰意懒、意兴阑珊的感觉，使得写作也一度中断。在此，要衷心感谢电子工业出版社的朋友，以及疯狂Java联盟的杨恩雄、heyitang、petrelsky5等广大网友和所有给我鼓励的朋友，是你们的支持让我再度燃起创作热情。
本书写给谁看本书是疯狂Java体系丛书之一，前半部分（前8章）没有基础即可阅读，后半部分则需要一定的Spring、Hibernate等Java EE基础。如果读者只希望掌握JavaScript编程、DHTML和Ajax基础，则无须任何基础；如果读者希望将Ajax融入实际的Java EE开发，则建议先阅读《轻量级Java EE企业应用实战》一书。
李 刚
2008年3月17日
目 录
第1章 Ajax概述1.1 重新思考Web应用 2
1.1.1 应用系统的发展史 2
1.1.2 传统Web应用的优势和缺点 4
1.2 重新设计Web应用 5
1.2.1 富Internet应用 5
1.2.2 异步发送请求，避免等待 7
1.2.3 使用Ajax 7
1.3 Ajax介绍 7
1.3.1 Ajax的工作方式 8
1.3.2 Ajax的核心：XMLHttpRequest 8
1.3.3 Ajax的编程脚本：JavaScript语言 9
1.3.4 HTML页面的DOM模型 9
1.3.5 数据交换和显示 10
1.4 Ajax的基本特征 10
1.4.1 异步发送请求 10
1.4.2 服务器响应是数据，而不是页面
内容 11
1.4.3 浏览器中的是应用，不是简单视图 11
1.5 Ajax的替代技术 11
1.5.1 Sun的Java Web Start技术 11
1.5.2 Microsoft的ClickOnce技术 12
1.5.3 基于Flash的Flex 12
1.6 搭建Ajax开发环境 13
1.6.1 本书的Ajax开发环境 13
1.6.2 安装Tomcat服务器 13
1.6.3 配置Tomcat的服务端口 15
1.6.4 进入Tomcat控制台 15
1.6.5 部署Web应用 17
1.6.6 配置Tomcat的数据源 18
1.6.7 安装Ant 19
1.6.8 Eclipse的下载和安装 21
1.6.9 在线安装Eclipse插件 21
1.6.10 手动安装Eclipse插件 22
1.7 调试JavaScript脚本 23
1.8 本章小结 24
第2章 Ajax初体验2.1 Ajax带来的优势 26
即使使用Ajax技术，客户端和服务
器一样有网络通信延迟，尤其是当网
络状况不好时，通信延迟将更严重，
用户一样感受不到更新延迟吗？ 27
2.2 开始传统的JSP聊天室 28
2.2.1 实现业务逻辑组件 28
2.2.2 实现控制器 31
2.2.3 实现视图 33
2.2.4 JSP聊天室的问题 34
2.3 Ajax聊天室 34
2.3.1 异步发送请求 35
使用Ajax技术是不是会带来更大
的工作量？ 37
2.3.2 解决多余刷新的问题 37
2.3.3 解析服务器响应 39
2.3.4 何时发送请求 40
客户端频繁发送请求，难道不会加
重服务器负担？ 41
2.3.5 Ajax聊天室的特点 44
2.4 Ajax编程的技术难点 44
2.5 传统Web应用与Ajax应用的对比 45
2.6 本章小结 46
第3章 XHTML语言详解3.1 XHTML简介 48
3.1.1 HTML的作用和历史 48
在保存HTML 文件时，到底采用
.htm扩展名还是采用.html扩展名呢？
48
我应该使用FrontPage学习HTML文
档呢？还是使用Dreamweaver好？ 49
3.1.2 HTML 4.01和XHTML 49
如果我使用XHTML编写互联网
页，会不会有浏览器不支持？ 50
3.2 XHTML的基本语法 50
3.2.1 XHTML的基本结构和规则 50
3.2.2 XHTML和DTD 52
3.3 XHTML的常用标签 54
3.3.1 基本标签 54
3.3.2 文本格式化标签 55
如果我希望HTML页面内的文本更
美观，例如改变它们的颜色、背景
等，那该用什么标签呢？ 57
3.3.3 超级链接和锚点 57
3.3.4 列表相关标签 58
3.3.5 图像相关标签 59
3.3.6 表格相关标签 61
3.3.7 框架相关标签 64
3.4 XHTML的表单标签 65
3.4.1 表单标签 66
3.4.2 使用input元素 67
前面的页面中包含5个单选框，为
何前面3个只能选中一个，后面2
个只能选中一个，但一共可以选择
2个呢？ 69
3.4.3 使用label定义标签 69
在表单里直接定义普通文本不可以
作为标签吗？专门使用<label.../>元
素定义标签有什么作用？ 69
3.4.4 使用button定义按钮 70
3.4.5 列表框和下拉菜单 71
3.4.6 使用textarea定义文本域 72
3.5 XHTML头部和元信息 73
3.6 本章小结 74
本章练习 74
第4章 JavaScript语法详解4.1 JavaScript简介 76
4.1.1 运行JavaScript 77
4.1.2 导入JavaScript文件 77
4.2 数据类型和变量 77
4.2.1 定义变量的方式 78
4.2.2 类型转换 78
4.2.3 变量 80
4.3 基本数据类型 82
4.3.1 数值类型 82
4.3.2 字符串类型 86
4.3.3 布尔类型 89
4.3.4 undefined和null 90
4.3.5 正则表达式 91
4.4 复合类型 93
4.4.1 对象 93
4.4.2 数组 93
4.4.3 函数 94
4.5 运算符 96
4.5.1 赋值运算符 96
4.5.2 算术运算符 97
4.5.3 位运算符 98
4.5.4 加强的赋值运算符 99
4.5.5 比较运算符 100
4.5.6 逻辑运算符 101
4.5.7 三目运算符 102
4.5.8 逗号运算符 103
4.5.9 void运算符 103
4.5.10 typeof和instanceof运算符 104
4.6 语句 104
4.6.1 语句块 105
4.6.2 空语句 105
4.6.3 异常抛出语句 105
4.6.4 异常捕捉语句 106
4.6.5 with语句 107
4.7 流程控制 108
4.7.1 分支 108
4.7.2 while循环 110
4.7.3 do while循环 111
4.7.4 for循环 111
4.7.5 for in循环 112
4.7.6 break和continue 113
4.8 函数 116
4.8.1 函数定义 116
4.8.2 局部变量和局部函数 117
4.8.3 匿名函数 118
4.8.4 函数和类 120
4.8.5 函数的实例属性和静态属性 121
4.8.6 递归函数 123
4.9 函数的参数处理 124
4.9.1 基本类型和复合类型的参数传递 125
4.9.2 空参数 126
4.9.3 参数类型 127
4.10 对象 128
4.10.1 面向对象的概念 129
4.10.2 对象和关联数组 129
4.10.3 继承和prototype 130
4.11 建对象 135
4.11.1 使用关键字new创建对象 135
4.11.2 使用Object直接创建对象 135
4.11.3 使用JSON语法创建对象 137
4.12 本章小结 140
本章练习 140
第5章 级联样式单详解5.1 样式单概述 142
5.2 CSS的基本使用 143
5.2.1 引入外部样式文件 143
5.2.2 使用内部CSS样式 144
5.2.3 使用内联样式 146
5.3 使用CSS属性 147
5.3.1 文字相关属性 148
5.3.2 整体段落相关属性 150
5.3.3 背景相关属性 151
5.3.4 表格相关属性 152
5.3.5 大小相关属性 155
5.3.6 位置相关属性 155
5.3.7 边框相关属性 157
5.3.8 轮廓相关属性 159
5.3.9 三个常用属性 160
5.4 选择器定义 161
5.4.1 属性选择器 162
5.4.2 ID选择器 163
5.4.3 class选择器 164
5.4.4 包含选择器和子元素选择器 165
5.4.5 超级链接相关选择器 166
5.5 在脚本中修改显示样式 166
5.5.1 随机改变页面的背景色 167
5.5.2 卷帘效果 167
5.5.3 动态增加立体效果 169
5.6 本章小结 170
第6章 DOM模型详解6.1 DOM模型概述 172
6.2 DOM模型和XHTML文档 173
6.2.1 XHTML元素之间的继承图 173
6.2.2 XHTML元素之间常见的包含
关系 174
6.3 访问XHTML元素 175
6.3.1 根据ID访问XHTML元素 175
如何让每个XHTML元素都有唯
一的id属性呢？以前我见到很多
XHTML页面元素并没有id属
性啊。 175
程序中为了访问<div.../>元素和
<textarea.../>元素的“内容”，为
何一个用innerHTML属性，另一
个用value属性？ 176
6.3.2 利用节点关系访问XHTML元素 176
6.3.3 访问表单域控件 178
6.3.4 访问列表框、下拉菜单的选项 179
6.3.5 访问表格子元素 180
6.4 修改XHTML元素 182
6.5 新增XHTML元素 183
6.5.1 创建或复制节点 183
6.5.2 添加节点 185
6.5.3 为列表框、下拉菜单增加选项 185
6.5.4 动态添加表格内容 187
6.6 删除XHTML元素 188
6.6.1 删除节点 188
6.6.2 删除列表框、下拉菜单的选项 189
6.6.3 删除表格的行或单元格 191
6.7 传统DHTML模型 192
6.8 使用window对象 194
6.8.1 访问历史 196
6.8.2 浏览器对象 197
6.8.3 访问页面URL 197
6.8.4 客户机屏幕信息 198
6.8.5 弹出新窗口 199
6.8.6 确认对话框和输入对话框 199
6.8.7 使用定时器 200
6.9 使用document对象 201
6.9.1 动态页面 202
6.9.2 读写Cookie 203
6.10 两个常用范例 204
6.10.1 可编辑表格 204
6.10.2 导航菜单 206
6.11 DOM模型和XML文档 210
6.11.1 使用DOM解析XML文档 210
6.11.2 使用DOM解析器创建XML 212
6.12 本章小结 214
本章练习 214
第7章 事件处理机制7.1 基本事件模型 216
7.1.1 绑定XHTML元素属性 216
7.1.2 绑定DOM对象的属性 218
7.1.3 事件处理函数和关键字this 219
7.1.4 使用返回值改变默认行为 221
7.1.5 在代码中触发事件 222
为什么在<form.../>元素中<input.../>元
素的id属性值不能是submit呢？ 223
7.2 Ajax应用的MVC 224
7.3 Internet Explorer的事件模型 226
7.3.1 使用script for绑定 227
7.3.2 使用attachEvent方法执行绑定 227
7.3.3 访问事件对象 229
此处介绍的是Internet Explorer中访问事件的方式，那么其他浏览器呢？ 232
7.3.4 事件冒泡 232
7.3.5 重定向事件 234
7.3.6 取消事件默认行为 236
7.3.7 捕获鼠标事件 237
7.4 DOM 2的事件模型 239
7.4.1 绑定事件处理器 239
7.4.2 访问事件对象 241
DOM 2事件模型和Internet Explorer事件模型里访问事件对象的方式完全不同，如果我们需要写一个跨浏览器的程序，是不是只能将事件处理函数绑定到XHTML元素，并将event显式作为参数传入事件处理函数？ 241
7.4.3 事件传播 243
7.4.4 转发事件 247
7.4.5 取消事件的默认行为 249
7.5 本章小结 250
本章练习 250
第8章 XMLHttpRequest对象详解8.1 XMLHttpRequest对象概述 252
8.2 XMLHttpRequest的方法和属性 252
8.2.1 XMLHttpRequest的方法 252
8.2.2 XMLHttpRequest的属性 256
8.3 发送请求 258
8.3.1 发送简单请求 259
8.3.2 发送GET请求 261
8.3.3 发送POST请求 263
8.3.4 发送请求时的编码问题 264
8.3.5 发送XML请求 268
8.4 处理服务器响应 270
8.4.1 处理的时机 270
8.4.2 使用文本响应 271
8.4.3 使用XML响应 271
8.4.4 使用DOM模型生成页面 273
8.5 XMLHttpRequest对象的运行周期 273
8.6 Ajax必须解决的问题 274
8.6.1 跨浏览器问题 274
8.6.2 安全性问题 275
8.6.3 性能问题 277
8.7 本章小结 280
第9章 Prototype库详解9.1 Prototype的下载和安装 282
9.1.1 什么是Prototype库 282
9.1.2 下载Prototype库 282
9.1.3 安装Prototype库 283
9.1.4 使用Prototype对象 283
9.2 Prototype的工具函数 284
9.2.1 使用$()函数 284
9.2.2 使用$$()函数 286
9.2.3 使用$A()函数 288
9.2.4 使用$F()函数 289
9.2.5 使用$H()函数 290
9.2.6 使用$R()函数 291
9.2.7 使用Try.these()函数 291
9.3 Prototype的JSON支持 293
9.4 Prototype的自定义对象和类 294
9.4.1 使用Element对象 294
9.4.2 使用Element.Methods 298
9.4.3 使用Enumerable 298
9.4.4 使用ObjectRange 302
9.4.5 使用Form.Element操作表单控件 302
9.4.6 使用Form操作表单 304
9.4.7 使用Hash对象 305
9.4.8 使用Event 307
element()和findElement()的关系到底是怎么回事呢？ 307
9.4.9 使用Template 308
9.4.10 使用Class 309
9.4.11 两个常用的监听器 310
9.5 Prototype常用的扩展 312
9.5.1 扩展Array 312
9.5.2 扩展document 313
9.5.3 扩展String 314
9.5.4 扩展Function 316
9.5.5 扩展Number 318
9.6 Prototype的Ajax支持 319
9.6.1 使用Ajax.Request类 319
9.6.2 使用Form.request方法 322
9.6.3 使用Ajax.Responders对象 324
9.6.4 使用Ajax对象 325
9.6.5 使用Ajax.Updater类 325
9.6.6 使用Ajax.PeriodicalUpdater类 328
9.7 本章小结 329
第10章 基于Prototype库的应用：自动完成10.1 应用的基本分析和设计 331
10.1.1 数据要求 331
10.1.2 数据表结构 331
10.2 Domain Object和持久层 331
10.2.1 Domain Object 332
10.2.2 实现DAO组件 333
10.3 实现Service组件 337
10.4 使用Servlet提供服务器响应 341
10.4.1 根据前缀查询品牌 341
10.4.2 根据品牌查询型号 342
10.4.3 根据型号查询详细信息 343
10.5 客户端HTML页面实现 344
10.6 增加HTML页面的事件响应能力 346
10.6.1 实现品牌输入框的事件处理器 346
10.6.2 实现键盘事件的处理器 347
10.6.3 根据品牌提示型号 350
10.6.4 根据型号显示描述 351
10.6.5 注册Ajax事件监听器 352
10.7 本章小结 352
第11章 jQuery库详解11.1 jQuery入门 354
11.1.1 理解jQuery的设计 354
上面的程序中target对象到底是什么？它怎么会拥有height、width、css这些方法？ 355
11.1.2 下载和安装jQuery 355
11.1.3 让jQuery与其他JavaScript库
共存 356
11.2 获取jQuery对象 356
11.2.1 jQuery核心函数 356
11.2.2 以CSS选择器访问DOM元素 357
11.2.3 选择器的附加限定词 359
11.2.4 表单相关的选择器 362
11.3 jQuery操作类数组的工具方法 363
11.3.1 过滤相关方法 364
11.3.2 仿DOM导航的相关方法 365
11.3.3 链接方法 367
11.4 jQuery支持的方法 368
11.4.1 jQuery命名空间的方法 368
11.4.2 数据存储的相关方法 370
11.4.3 操作属性的相关方法 370
11.4.4 操作CSS属性的相关方法 371
11.4.5 操作元素内容的相关方法 373
11.4.6 操作DOM节点的相关方法 374
11.5 jQuery事件相关方法 378
11.6 动画效果相关的方法 380
11.7 Ajax相关方法 383
11.7.1 两个工具方法 383
11.7.2 使用load方法 384
11.7.3 使用jQuery.ajax(options)方法 385
11.7.4 使用get/post方法 387
11.8 扩展jQuery和jQuery插件 389
11.9 本章小结 390
第12章 基于jQuery的应用：电子相册系统12.1 实现持久层 392
12.1.1 实现持久化类 392
12.1.2 配置SessionFactory 394
12.2 实现DAO组件 395
12.2.1 DAO接口定义 395
12.2.2 完成DAO组件的实现类 397
12.3 实现业务逻辑层 402
12.3.1 实现业务逻辑组件 402
12.3.2 配置业务逻辑组件 405
12.4 实现客户端调用 405
12.4.1 访问业务逻辑组件 406
12.4.2 处理用户登录 406
12.4.3 获得用户相片列表 408
12.4.4 处理翻页 409
12.4.5 处理文件上传 411
当Servlet重定向到album.html
页面后，如何弹出如图12.5所示
对话框？ 413
12.4.6 页面加载时的处理 413
HttpSession里的curImg属性是从哪里来的呢？ 415
12.5 本章小结 415
本章练习 415
第13章 DWR框架详解13.1 DWR的下载和安装 417
13.1.1 什么是DWR 417
13.1.2 下载和安装DWR 418
13.2 使用DWR 422
13.2.1 编写处理类 422
13.2.2 配置DWR 424
13.3 使用DWR的转换器 425
13.3.1 基本转换器 425
13.3.2 对象转换器 426
13.3.3 数组转换器 428
13.3.4 集合类型转换器 428
13.4 方法声明定义 429
13.5 使用DWR的创建器 430
13.5.1 创建器的配置 430
13.5.2 使用new创建器 432
13.5.3 使用none创建器 433
既然none创建器不创建任何对象，哪有对象暴露给JavaScript代码”？ 433
13.5.4 使用script创建器 433
13.6 调用服务器端的方法 434
13.6.1 调用服务器端方法的通用配置 434
13.6.2 使用简单回调 435
13.6.3 使用JSON格式的回调 440
13.6.4 将客户端参数传递到回调函数 442
13.7 使用engine.js 443
13.7.1 设置调用顺序 443
13.7.2 设置全局超时时长 443
13.7.3 设置全局Hook函数 444
13.7.4 设置全局处理函数 444
13.7.5 设置常用的全局选项 444
13.7.6 批处理 445
13.8 使用util.js 445
13.8.1 使用$() 446
13.8.2 处理列表 446
13.8.3 处理表格 450
13.8.4 访问HTML元素值 454
getValues()可以一次获取多个HTML元素的值，那返回的值如何保存呢？ 455
13.8.5 几个工具函数 456
13.9 整合第三方Java EE框架 458
13.9.1 访问Servlet API 458
老师你以前教我们：谁调用方法，谁负责为形参赋值。现在我们调用addSession()方法时没有为第二个参数赋值，那第二个参数从哪里获得参数值呢？ 460
13.9.2 整合Spring 461
13.10 使用DWR注释 463
13.10.1 初始配置 464
如果我有很多类需要列出，那岂不是很臃肿，classes属性值是否支持通配符？如果想列出内部类应该怎么写？ 464
13.10.2 标注创建器和转换器 464
13.11 异常处理 465
13.12 反向Ajax 467
13.12.1 配置使用反向Ajax 468
反向Ajax技术不是依赖HTTP协议的吗？它怎么可以违反请求-响应架构的规律呢？ 468
13.12.2 在Java方法中操作Web页 469
13.12.3 在客户端调用反向Ajax方法 471
13.13 本章小结 472
第14章 基于DWR的应用：即时消息系统14.1 实现Hibernate持久层 474
14.1.1 Hibernate持久层的POJO 474
14.1.2 将POJO映射成持久化对象 476
14.2 实现DAO组件 477
14.2.1 扩展HibernateDaoSupport来实现分页 478
为什么不扩展Hibernate Template类来实现分页？扩展HibernateDaoSup-port是不是会引起一些混乱？ 478
14.2.2 实现DAO组件 480
14.3 实现业务逻辑组件 482
14.3.1 业务逻辑组件的接口 483
14.3.2 业务逻辑组件的实现类 484
14.3.3 部署业务逻辑组件 487
14.3.4 基于AOP的权限控制 488
14.4 调用业务逻辑组件 490
14.4.1 将Spring容器中的Bean创建成JavaScript对象 490
14.4.2 处理用户登录 491
既然已经在JavaScript代码里进行了权限控制，为何还要在业务逻辑层控制呢？ 492
14.4.3 处理用户注册 493
14.4.4 处理消息发布 494
14.4.5 获取消息列表 495
14.4.6 处理分页 496
14.4.7 查看消息内容 497
14.4.8 页面加载函数 498
14.5 本章小结 498
本章练习 498
第15章 AjaxTags框架详解15.1 AjaxTags的下载和安装 500
15.1.1 什么是AjaxTags 500
15.1.2 下载和安装AjaxTags 500
15.2 AjaxTags入门 501
15.2.1 编写处理类 502
15.2.2 使用标签 503
15.3 处理类的几种形式 505
15.3.1 使用普通Servlet生成响应 505
15.3.2 使用AjaxXmlBuilder辅助类 507
15.3.3 使用BaseAjaxServlet生成响应 509
15.3.4 使用非Java响应 510
15.4 使用AjaxTags标签 511
15.4.1 使用自动完成标签 511
15.4.2 使用area标签 515
15.4.3 使用anchors标签 516
15.4.4 使用callout标签 517
15.4.5 使用htmlContent标签 518
15.4.6 使用portlet标签 520
15.4.7 使用select标签 522
15.4.8 创建Tab页 523
15.4.9 使用displayTag标签 524
15.4.10 使用tree标签创建树 526
15.4.11 使用updateField标签 528
15.5 关于AjaxTags的选择 530
15.5.1 AjaxTags的优势和使用场景 530
15.5.2 AjaxTags的缺点 531
15.6 本章小结 531
第16章 Ajax实例：简易Blog系统16.1 实现Hibernate持久层 533
16.1.1 设计Hibernate的持久化类 533
16.1.2 完成映射文件 535
16.1.3 数据表的结构 537
16.2 实现DAO组件 538
16.2.1 DAO接口定义 538
16.2.2 实现DAO组件 539
16.2.3 配置DAO组件 542
16.3 实现业务逻辑组件 543
16.3.1 业务逻辑组件的接口 543
16.3.2 业务逻辑组件的实现类 544
16.3.3 配置业务逻辑组件 547
16.4 整合DWR框架 548
16.4.1 配置web.xml文件 548
16.4.2 将Spring容器中的Bean转化成JavaScript对象 549
16.5 在客户端调用JavaScript对象 550
16.5.1 获取Blog文章列表 550
16.5.2 控制Blog文章列表的翻页 551
16.5.3 页面加载时的动作 551
16.5.4 查看评论 552
16.5.5 控制回复的翻页 554
16.5.6 添加回复 554
16.5.7 查看Blog文章内容 556
16.5.8 添加新的Blog文章 556
16.6 本章小结 558
本章练习 558
第17章 电子拍卖系统17.1 总体说明和概要设计 560
17.1.1 系统的总体架构设计 560
17.1.2 数据库设计 561
17.2 实现Hibernate持久化类 562
17.2.1 设计Domain Object 562
17.2.2 实现Domain Object 563
17.3 DAO层实现 568
17.3.1 DAO的基础配置 568
17.3.2 实现DAO组件 569
17.3.3 部署DAO组件 574
17.4 业务逻辑层实现 575
17.4.1 设计业务逻辑组件 575
17.4.2 业务逻辑组件的异常处理 576
17.4.3 发送竞价通知邮件 578
17.4.4 实现业务逻辑层组件 578
17.4.5 业务层的权限控制 587
17.4.6 业务层的任务调度 588
17.4.7 事务管理 589
17.5 暴露业务逻辑方法 590
17.5.1 初始化Spring容器 590
17.5.2 配置DWR的核心Servlet 590
17.5.3 暴露业务逻辑方法 591
17.6 调用业务逻辑方法响应用户请求 592
17.6.1 页面加载时的函数 592
17.6.2 处理返回首页的请求 593
17.6.3 浏览所有流拍物品 593
17.6.4 处理用户登录 596
17.6.5 管理物品 600
17.6.6 管理物品种类 603
17.6.7 查看竞得物品 606
17.6.8 查看自己的竞价记录 608
17.6.9 浏览拍卖物品 609
17.6.10 参与竞价 611
17.7 本章小结 614
本章练习 614