内容简介
现在,Web同样能给用户提供与桌面应用程序等价的丰富体验与功能。书中介绍了如何结合几种前沿技术来开发成熟的Web应用程序,从而将对AJAX和Ruby on Rails的应用提升到一个新台阶。本书不仅为您的实现提供代码,还分析了若干架构和浏览器内的API。学习本书后,您将能够全面深入地了解专业RIA开发背后的基本设计原则以及多种可用的工具,能够将一个应用程序分为客户端和服务器端技术来实现。此外,您还能充分掌握一些重要概念,如mashups、自动补全功能和社会站点标记等。本书主要内容◆ 如何用Java、Ruby和Python开发RIA◆ 提高生产率和调试应用程序的有用提示◆ 解决构建RIA时遇到的有关Web应用程序的常见问题◆ 基于RIA技术顶层的高级主题和开发数据包◆ 如何开发、部署和控制对RIA的第三方访问
前言简要介绍本书的主题——RIA(Rich Internet Application)体系结构及其演变。为了更好地服务读者,我们尽量混合3种元素来实现以下目标。 ● 理解RIA与前一代Web应用程序之间的不同,以及这种不同的重要性,无论您是集体开发人员还是个人软件开发人员。 ● 提供重要的支持代码示例,这些示例完整而又重要,但非常简单,用一到两页代码就可以表示。 ● 描述并展示重要架构和API。 0.1 本书读者对象 本书面向对现实问题的实际解决方案感兴趣的软件开发人员。本书阐述了使用激活技术来创建具有与桌面系统匹配特性的分布式系统的方法。不管您是擅长Web开发、服务器体系结构还是敏捷语言,都会发现本书的价值。 因为示例是用Python、Java和Ruby on Rails写的,如果您熟悉其中的某种语言那就最好。我们假设您有开发和部署Web应用程序的经验,能够阅读基本的UML图表。最后,您应该熟悉基本的数据库管理操作,虽然各章都清楚地概述了必要的数据库管理步骤。 0.2 本书的重点 本书的作者都是专业的公共软件开发人员,而一般的理解代码和API的最快速的方法是阅读实际代码示例,但这会导致一连串说教式的示例。虽然这种方法可以说明主题的重点,但最终却无法实现,因为这些简单示例不能构建任何脱离于所述上下文环境的实例。因此,本书重点介绍一个有趣而且功能完整的应用程序,将它作为贯穿本书的主题。该应用程序还有助于进一步掌握RIA设计、架构和实现方式。 同时,还可以构建顶点应用程序,我们称之为ideaStax。ideaStax是一种想法捕获工具,它让用户——不管是个人用户还是公共用户——能够记录、标记、搜索、组织和提出想法。想法是ideaCards不可分割的单元,ideaCards是ideaStax的构建代码块。ideaStax还有其他用途。首先,如果从头开始构建应用程序来反映RIA的概念和性能,它可以说明这些应用程序在性能和特征方面的变化。在某种程度上,可以将ideaStax作为桌面应用程序(例如,Microsoft的PowerPoint)的重新预想。 除了从Wrox出版商站点()获得ideaStax的代码之外,作者还开发了一个站点,您可以在那里提出想法和代码,展示方法,以开源软件的最佳惯例参与改进应用程序及其性能。如果您提出的想法有价值,就会成为该项目的提交者。 0.3 本书的目标 从几十年前开始,开发人员就相信有些东西客观上是正确的,甚至不容置疑。我们将自己当成特定开发和部署“部落”的成员。不只是将自己当成开发人员,还要将自己当成“Java开发人员”或“Microsoft .NET开发人员”,并接受部落成员暗示的限制和技术约定。在Java中,这意味着“一种语言,多个平台”,而在Microsoft Windows 32 API中,则是“多种语言,一个平台”。无论如何,从传统来看,写富客户平台就意味着要求开发人员做出让步,并让终端用户管理安装和更新,公司IT部门也要参与进来。 作为软件开发人员,不可能没有使用过富客户API为Windows、MAC OS/X或Linux编写代码。因此我们都很熟悉富客户平台(RCP)模型。在过去30年中,我们在计算机上编写、使用、管理或部署的几乎每个应用程序都符合RCP的性能和限制。如果像RCP开发人员那样思考,就会认为操作系统、数据访问和存储、应用程序的用户体验紧密相连是理所当然,这可以说明某种应用程序(例如,字处理器)的响应度。 现在这种情况正在改变,而且在迅速改变。到了2005年末,AJAX(Asynchronous JavaScript and XML,异步JavaScript和XML)中出现了一种“逼近”思想。AJAX是使用一些常用成熟技术组合应用程序的概括性术语,但似乎不仅仅是其组成部分的总和。现在人们逐渐认识到,构造转变肯定会改变我们开发和部署应用程序方法的所有基础。Web正在经历从新条款集合、静态表格和公告牌到自身位置不可知的计算平台的深刻变革。 同时,我们将探究基于浏览器的应用程序中的这些变更元素——从更大推动力和响应度到更短开发周期再到对社会网络更加依赖。短语“在平台层次以上编程”已经与RIA紧密相关。我们不会创造习语,但我们用多种语言写的多个工作示例说明这个概念对于Web 2.0应用程序(甚至更高版本应用程序)的重要性。 我们的目标是为集体和个人开发人员利用这种新兴方法做好准备。随着客户端软件的衰落,RIA这个新事物逐步出现,这让开发人员和终端用户都能利用今天这个互连的环境。利用这种新方法的开发人员会成功,并且会处于其专业领域的前沿。 学习本书中的这些技术方法,理解RIA如何不同以及为何不同,这会让您从完全不同的视角观察这个世界。首先可以发现,应用程序的大多数“动作”实际上没有在用户的桌面上发生,而是在某个位置的服务器上发生;用户通过其浏览器看到的和体验到的东西都非常单纯——由浏览器的约束协调解决。 RCP应用程序非常丰富、灵敏,在Web上通常不可能有这种响应度。一般来说,易于部署到Web,这种简单性在您能够提供的体验与用户可以从桌面应用程序中获得的体验之间存在差异。现在,从Web开始,这种差异正在逐渐消失。新一代应用程序正在出现,其中富客户和RIA之间的界线已经很模糊,也许不久的将来会完全消失。 以Google Suggest为例,输入时可注意该提示术语更新的方法,这几乎是即时的。现在查看Google Maps,放大,用光标抓住地图,稍微滚动一下。不等重载页面,所有事情几乎立即发生。Google Suggest和Google Maps是有效使用AJAX的Web应用程序新方法的两个示例,分别表示Web上可能的基本转换。 考察下列模型,它们用来创建新的应用程序或重新设计现有应用程序。 ● 桌面模型——在这种模型中,富客户平台(RCP)工具仍然“拥有”操作数据库模型(例如,Word文档、Excel表格等)的能力。桌面范例通过结合操作系统、数据格式、文件系统组织方法来创建“有墙壁的花园”,它会约束用户。 ● Web 1.0或“守旧派”Web应用程序——在这种模型中,用户填写表格,单击“提交”按钮,然后紧张地等待响应,希望没有破坏应用程序的完整性。多年以来开发人员使用各种即兴方法来处理这种层次的Internet应用程序中断,包括会话健壮和隐藏字段的cookies,它们用表格形式的应用程序来协调多步骤面向事务的应用程序。 ● RIA模型——在这种新模型中,用户拿起手头上的设备,启动浏览器,访问其资源和应用程序。使用哪种类型的机器以及使用哪种浏览器并不重要——任何现代浏览器都可以。在RIA模型中,用户不需要为了尽责或高效而将东西从家里带到办公室再带回家里。通常以产业标准格式(HTML、XML)存储用户创建的数据资源。用户可以将它们保留在网络上的服务器中,或进行本地复制(例如,复制到主机硬盘或闪存)。 新一代RIA的关键是,在维护应用程序状态和健壮性的过程方面,部分页面替换(partial page replacement)要使用应用程序服务器端的频繁程度。RIA灵活性的关键是部分页面替换的思想,我们会反复强调这一点。在每个用户交互之后,用户不必等待服务器打开整个页面,基于浏览器的应用程序几乎不可能有助于提供更好的用户体验。开发人员体验变得更好而且包含的特别码更少,这并不是巧合。 因此,为了开发人员本身,为了用户,为了利用改革的潜在可能,要考虑使用RIA创建新应用程序的直接结果。RIA模型直接并且立即威胁到像Microsoft这种主流用户的地位。目前,谁拥有OS和RCP工具,谁就控制着用户。接受指定平台和工具集(例如,MS Windows 和MS Office)的用户越多,控制用户的层次就越高。有一种所谓的网络效果,它为潜在客户(依赖已经拥有该工具的客户数)创建一个值。RIA模型也会产生网络效果,因此受到病毒的威胁,同时为开发人员创造了新的机会——为自己或为企业写代码。 0.4 架构和JavaScript库 过去几年出现了一些令人难以置信的架构和JavaScript,这里讨论其中的一些。当前架构的一般观点认为,由服务器给定当前连接速度、页面组成和部分页面替换已经普遍。宽带的大幅度提升(在美国,就有7000多万宽带连接的计算机)使服务器交互达到了前所未有的高度。 因此,即使XmlHttpRequest和响应(关于这一点还将详细介绍)几年前在现代浏览器中就有了,但直到最近才看到像Google Map这样的应用程序,使部分页面替换成为规则而不是异常。后来,在简单的Java、Python和Ruby服务器中这种应用程序大量出现,在复杂、格式化的多层方案中则逐渐减少。本书讨论了一些服务器架构,包括Google Widget Toolkit (Java)、TurboGears (Python)和Ruby on Rails (Ruby)。 在客户方面也发生了极大的变化。JavaScript对开发人员而言意味着痛苦的经历。怪诞的语言决不是开发人员所喜欢的,它原来缺少强大的统一开源库层。现在已有许多库,包括MochiKit(其口号是“让JavaScript更少”)、Prototype(基于众多Rails应用程序选择的库)等。以后会讨论这两个库。 0.5 混合与外来 除了严格基于浏览器的RIA之外,我们还介绍了另外两个具体形式的以网络为中心的应用程序,这在Mac OS/X上的DashboardWidgets和Windows上的Google Desktop Widgets被首次举例说明,而Yahoo Widgets在这两个平台上都进行了举例说明。构件就像应用程序,每个都驻留在它自己的微浏览器环境中。而这样的应用程序通常与本地桌面应用程序有相同的特征,它们使设计、构造和建立HTML、样式表和JavaScript(Web开发人员熟悉的元素)变得更加容易。本书选择讨论Yahoo Widgets,因为它在多种操作系统上存在。 其次,更具有开创性的以网络为中心的应用程序范例是沉浸式3D环境(immersive 3D environment),像Second Life这样的应用程序对此进行了例证。过去为了创建沉浸式环境进行了大量尝试。但这些尝试因为各种原因——网络、带宽问题或糟糕的用户体验——全部以失败告终。但现在,也许是第一次,沉浸式环境不但变得可能,而且还充满活力。Second Life给开发人员提供了简单而又完整的脚本语言和对象构建环境。我们将讨论这种新兴现象,并提供“实际存在的”和连接到网络的对象的可用代码。 0.6 本书主要内容 本书探讨了许多架构、浏览器内置API和服务器代码示例。它也提供了各种实现方式语言,并用代码例证了这些实现方式。为了达到最好效果,必须选择是从不同架构和语言组成它,还是单个实现方式架构和(扩展)单一语言,并设计应用程序。经过多次试验和讨论之后,我们决定在特定架构(Ruby on Rails)中实现ideaStax,使用Ruby on Rails(通常简称为Rails),主要是因为其代码简洁,其综合性能以及产生有用和易于理解代码的能力强,即使开发者没有Rails(甚至是Ruby)经验。 这不是说,本书强调的其他实现方式架构(例如,TurboGears或Google Widget Toolkit (GWT))在某种程度上次于Rails,实际上,如果您喜欢使用另一种语言(TurboGears的Python,或GWT的Java),那么这些都是较好的选项。我们必须做出选择,考虑到Rails团队的发展速度,这是合理选择,但决不是唯一选择。 虽然选择用Rails运行顶点应用程序,但我们不想偏好某种语言或架构——毕竟,本书讨论的是RIA,而不是Rails。我们决定采取折衷的方法,希望您能够喜欢:我们使用其他语言来证明关键概念的代码,例如,聚合(mashup)、客户端验证和自动完成;社会站点概念,例如标记。不管您的语言偏好是什么,都应该保持对它的兴趣。 许多针对开发人员的书籍必须在更大的覆盖宽度和更大的深度之间做出决定。由于工具和库的爆炸性增长,我们选择宽度。因此,我们给出了大量的RIA和Web 2.0观点,但没有详细讨论任何一种特定架构。然而我们从每种架构中提取了一些重要概念。因为这些架构的细节有联机文档(虽然联机文档的性质有不同变化),所以本书尽量从开发人员视角讲解每种架构或给出一些“内幕”。 0.6.1 第I部分:RIA简介 这一部分提供了开发RIA所需的背景。您会了解到RIA的特征及其运行方式,进一步理解Web应用程序的概念,并通过实现简单的Hello World示例RIA来体验它们。最后,介绍了一些通过探讨某些常见JavaScript调试方法和工具来提高生产率的技巧。 ● 第1章探讨了RIA的一些特性,阐述了真正的RIA不同于传统Web应用程序的原因。探讨了在开发传统应用程序与RIA时,开发过程、行销和运用的基本思想上存在的不同。 ● 第2章介绍了RIA的基础知识,本书的余下部分需要这些基础知识。进一步讨论了可扩展的标记语言(XML)和文件对象模型(DOM)。接着回顾了可扩展的超文本标记语言(XHTML)、层叠样式表(CSS)和JavaScript。最后,用一个简单示例把所有复习的内容串连起来。 ● 第3章详细讨论了RIA中常见的聚合现象。这一章介绍了聚合的定义,介绍了编写自己的聚合所需的步骤。还详细介绍了XMLHttpObject和JavaScript Object Notation (JSON)。 ● 第4章通过Hello World示例详细介绍了RIA开发方法。本章首次详细讨论了AJAX应用程序与传统Web应用程序之间的不同。然后简要列出了写简单的Hello World Web应用程序所需的步骤。同时还介绍了Java和PHP中实现和响应异步调用所需的步骤。最后用简单示例说明Java和PHP中实现和响应异步请求的方法。 ● 第5章讨论了与调试Web应用程序相关的问题。这一章详细介绍了独立于语言的调试工具,以及RIA开发人员可用的方法。它将Firefox作为主要测试浏览器,描述了该工具可用的一些常见调试插件。还介绍了不同调试工具的用法,包括Venkman和FireBug。最后,讨论了日志实用程序,简要概述了开发简单JavaScript日志工具所需的步骤。 0.6.2 第II部分:RIA开发入门 第II部分扩充了第I部分介绍的方法,阐述了一些更高层次的主题和建立在它们之上的开发程序包。 ● 第6章讨论了设计的模型-视图-控制器(MVC)范例,对于平台开发人员而言,这可能是需要知道的最重要的概念。MVC模式表示一种设计和组织代码模块的方法,以便在域信息和业务逻辑(模型)、用户输出可视化(视图)和用户输入管理(控制器)之间分离关注点。这种类型的体系结构对于RIA开发人员而言特别重要,因为Web基于的主要客户机/服务器体系结构让RIA成为MVC设计近乎完美的媒介。第6章介绍了本书强调的3种服务器端开发程序包:Java、Ruby on Rails和TurboGears,并用MVC的常见术语解释了这些架构。 ● 第7章对各种JavaScript架构进行了比较,因此您可以大致了解哪种工具适用于哪种任务。在传统Web开发中,大多数编程工具在服务器上完成,客户端的任务主要是面向设计的。RIA编程要求和服务器端一样注重客户端逻辑,因此选择正确的JavaScript库是一项重要任务。这种比较有助于理解每种架构的优点及不足。 ● 第8章进入了“编译到JavaScript架构”的新时代,并概述了Google和Ruby on Rails小组使用的两种不同方法。这些解决方案用更易于编码、维护和调试的更高级的语言取代了JavaScript编程。在RIA页面被发送给客户之前的某一点,更高级的代码由机器翻译为JavaScript。 ● 第9章介绍了本书的顶点应用程序ideaStax。ideaStax是简单的Web应用程序,它让用户能够创建和维护包含丰富文本和图像的便签的堆栈。由于第III部分中各章阐述了各种RIA接口技术,因此使用ideaStax在简单和一致的上下文中设计示例。第9章概述了ideaStax概念的目标和性能,其中许多会在第III部分实现。 学完这部分之后,应该能够全面理解专业RIA开发的基本设计原则,牢固掌握各种工具和架构,以便实现您的设计目标。 0.6.3 第III部分:RIA开发进级 这一部分介绍了现实中开发RIA所需的工具。同时介绍了Web应用程序中的常见问题,以及在开发RIA时如何解决或最小化这些问题的方法。这一部分还介绍了新的性能,例如拖放、用服务器数据(在现实RIA中不断使用这些数据)自动完成表单字段。整个部分着重介绍了几种强大的JavaScript库,例如Dojo、Script.aculo.us和MochiKit。 这些章节包含各种示例,用来说明使用3种不同语言——Java、Ruby和Python——开发RIA的方法。不管您喜欢哪种语言,通过观察是对象还是函数出现在模型、视图或控制器中,都可以帮助您理解示例的意图。即使非常熟悉示例语言,也可以探讨其他备选语言的性能。如果知道模型、视图或控制器有哪些对象,将示例移植到其他语言就可以完成这项任务。完成之后,可登录本书的Web站点,里面包含用3种参考语言实现的示例。再回头查看第6章的3种备选实现方式及它们合并MVC的方法。 所有章节都定义了合并到顶点Stax应用程序的性能。在本书的Web站点上可以查看顶点的完整代码和工作版本。同时可参考第9章了解应用程序。 ● 第10章探讨了与Web应用程序中表单字段确认相关的问题。探讨了表格输入数据问题以及用来验证数据的常见方法,包括使用Dojo JavaScript库的客户端确认,Java中的服务器端确认和使用AJAX对Java中单个字段的服务器端确认。 ● 第11章建立在前一章的基础之上,讨论了表格可用性方面的其他问题。探讨了基于AJAX的、用来加强用户表格交互的方法。它建立在第10章示例的基础之上,并合并了一些基于AJAX的改进。 ● 第12章介绍了通过添加拖放性能来增强RIA互动性的方法。这一章定义了拖放的概念,使用Script.aculo.us库简要探讨了其运行原理,并运用Script.aculo.us和Ruby on Rails来说明如何开发具有拖放性能的RIA的方法。 ● 第13章介绍了一些方法,在这些方法中微妙的JavaScript效果就可以提高RIA的可用性。介绍了Script.aculo.us Effects库,并展示了将这些效果绑定到RIAPage事件和动作上的几种方法,同时还提供了几种场景(在这些场景中,特定效果非常有用)中的代码示例,包括动态用户通知和全屏预览。 ● 第14章详细探讨了标记和分级的概念。介绍了标记和分级的定义,说明了将这些性能合并到新RIA和其他Web应用程序的理由,以及它们越来越流行的原因。本章还包含用Python编写的示例。 ● 第15章建立在第14章介绍的示例的基础上,探讨了作为较大RIA一个方面实现的标记和搜索。通过将性能添加到顶点应用程序Stax,来说明将标记和搜索添加到更复杂的应用程序中的方法。使用Ruby on Rails编写的实现方式取代了第14章使用Python编写的实现方式。 0.6.4 第IV部分:高级主题 第IV部分介绍了RIA超出传统Web浏览器的扩展范围。由于RIA开发变成了一个越来越专业和需要能力的过程,因此对它们的研究慢慢扩展到计算的所有领域,从操作系统到应用程序再到游戏。通过使用API,现在许多RIA已经配合桌面应用程序,因此用户会两边受益。将联机应用程序——例如Yahoo的Flickr——无缝集成到Apple的iPhoto,让用户能够在本地管理自己的相册,同时又能与全世界共享他们最喜欢的相册。这一部分讨论了这些结合的可能性,同时列举了说明如何使用它们的示例。 ● 第16章简要介绍了应用程序编程接口(API)的重要性。成功的RIA不仅仅为用户提供完美的Web接口,还会为开发人员提供高效的编程接口。对API的访问是聚合(mashup)和桌面RIA得到扩展的可能的原因。这一章介绍了开发、部署和控制第三方访问到RIA的方法。 ● 第17章介绍了桌面构造的概念。构件是小的应用程序,放置在用户的桌面上,但能够访问特定信息或功能。本章说明了如何使用Yahoo! Widgets来快速访问通过API提供的常用RIA功能。这种构件的可用性考虑到了与用户桌面的对应,这样完成简单任务时用户就不需要打开Web浏览器并登录。 ● 第18章探讨了移出浏览器界线、移入沉浸式虚拟世界的早期阶段(在Neal Stephenson的小说Snow Crash的启发下)。沉浸式应用程序是全球终端用户填充和创建的丰富环境。第18章将您带入称为Second Life的世界,详细介绍如何允许该世界与Web交互的技术方法和示例。Second Life给用户(“居民”)提供了成熟的编程语言来操纵他们周围的世界,它支持访问外部业务和在3D沉浸式环境中显示Web文档。实体经济在这种虚拟空间发展壮大,传统公司已经开始注意到了这一点。将RIA连接到虚拟世界(例如,Second Life),会使产品处于尖端环境下,而这种环境在某一天会变得非常平常。 0.6.5 第V部分:附录 附录扩充了第10章的讨论,继续讨论Dojo确认功能和标记。 0.7 运行示例的条件 许多书专注于一种方法或一种语言,因而预先定义所需的运行软件或环境很容易。本书包含广泛的浏览器端JavaScript库、多个动态页面生成架构、多种服务器端实现语言。每一章都概述了特定支持和环境要求,可以查找标题“开始”,这样就会枚举特定章节的支持元素。作者的站点RIABook.也有到最新版本支持软件的链接,并提供作者和其他读者对支持代码的其他注释。当然Wrox站点()和RIABook.ideastax. com站点也会维护这些代码。 0.8 源代码 在完成本书的示例时,可以选择手动输入代码或者使用本书附带的源代码文件。本书用到的所有源代码可以从www.tupwk.com.cn/downpage下载,也可以从下载。进入该站点后,只需找到本书的名称(使用Search框或者书名列表),单击本书的详细页面上的Download Code链接,就可以得到本书所有的源代码。 注意: 由于很多书有相似的名称,所以用ISBN搜索更为容易。本书的ISBN是978-0-470-08280-5。 下载了代码后,用您喜欢的压缩工具把它解压缩。此外也可以去Wrox的主下载页面/dynamic/books/download.aspx 找到本书或其他Wrox出版的书的代码。 0.9 勘误表 尽管我们竭尽所能来确保在正文和代码中没有错误,但人无完人,错误难免会发生。如果您在Wrox出版的书中发现了错误(比如拼写错误或者代码错误),我们将非常感谢您的反馈。发送勘误表将节省其他读者的时间,同时也会帮助我们提供更高质量的信息。 到站点上,用Search框或者标题列表找到本书的名称,在详细页面上点击Book Errata链接就能找到本书的勘误表。在这个页面中可以看到所有被提交的本书的勘误表,它们是由Wrox的编辑发布的。在/misc-pages/booklist.shtml 中有完整的书的列表,其中包括每本书的勘误表。 如果您在书的勘误表页面上没有看到您发现的错误,可以到/contact/ techsupport.shtml 上填写勘误表或者将错误发送至wkservice@vip.163.com。我们会检查这些信息,如果属实就把它添加到本书的勘误表页面上,并在本书随后的版本中更正错误。 0.10 如果想和作者或者其他人讨论,请加入在 的P2P论坛。该论坛是基于Web的系统,您可以发布关于Wrox出版的书和相关技术的消息,与其他读者或技术人员交流。该论坛有预定功能,在您选择的感兴趣的主题有新帖子时,会邮件通知。Wrox的作者、编辑、其他业界专家和像您一样的读者都会出现在这些论坛中。 在,您会找到很多不同的论坛,它们不但有助于您阅读本书,还有助于您开发自己的应用程序,加入论坛的步骤为: (1) 到 上单击Register链接。 (2) 阅读使用说明,单击Agree按钮。 (3) 填写加入必需的信息和其他您愿意提供的信息,单击Submit按钮。 (4) 您将收到一封email,描述如何验证您的账户和完成加入过程。 注意: 不加入P2P也可以阅读论坛里的消息。但是如果要发布自己的消息,就必须加入。 加入之后,就可以发布新的消息和回复其他用户发布的消息。可以随时在Web上阅读论坛里的消息。如果想让某个论坛的新消息以E-mail的方式发给您,可以单击论坛列表里论坛名字旁边的Subscribe to this Forum图标。 要了解如何使用Wrox P2P的更多信息,请阅读P2P FAQs,其中回答了论坛软件如何使用的问题,以及许多与P2P和Wrox出版的书相关的问题。要阅读FAQs,单击任何P2P页面里的FAQ链接即可。