前言

前言

“计算机科学领域只有两大难题:缓存失效和命名。”

——菲尔·卡尔顿

写一本关于缓存失效的书并不是难事,难的是如何给书取个合适的名字。本书的书名代表的是Web开发方方面面的变化,这些变化促成了一种新的Web应用设计方法的诞生。

诚然,Web开发的许多方面都可以称为“新”的。不断升级的桌面浏览器、层出不穷的移动终端、一直在演变的编程语言、更快的处理器,还有越来越挑剔的用户以及他们不断增长的、对易用性和交互性的期望,都让开发者枕戈待旦。这些改变使开发者在为项目提供解决方案时必须持续创新。而其中的许多解决方案并不是孤立的,它们有更为深远的含义。

因此,为了响应这些创新,我选择了“客户端-服务器端”这一术语,它在许多方面都反映了Web开发中所发生的变化。时下流行的其他一些对现代化开发实践的描述不适用于我们的研究领域。这里所讲的Web应用开发是有关桌面浏览器的,另一个日渐相关的领域——移动应用开发,则并不包括在内。

人们使用术语单页面应用单页面界面,来区分现代Web应用和早期的静态网页。这些术语准确地抓住了现代Web应用的特征,和早期应用相比,它们更动态,交互性更强。

当然,很多现代的动态网站并不是单页面应用,它们可能由多个页面组成。这些术语强调的是页面——一个应用的客户端。对于服务器端的开发,它们未作任何特别声明。还有与高度动态化的页面相关的各种JavaScript框架(Angular、Ember和Backbone等),但是这些仍然是客户端的事。我希望本书包含的内容更广,不局限于前端的创新,还应涵盖服务器端的相关设计和Web服务信息传递。

这就是流行的REST(Representational State Transfer)技术,它建议了一种Web服务消息传递的风格。但是REST的作者罗伊·T. 菲尔丁(Roy Fielding)只给出了有限的定义,在个人博客中,他列出了自称为“RESTful APIs”、却常常违反REST风格的几个错误(http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven)。还有人在StackOverflow上发帖提问JSON API是否是真正的REST式(http://stackoverflow.com/questions/9055197/splitting-hairs-with-rest-does-a-standard-json-rest-api-violate-hateoas),因为JSON并不完全满足REST结构风格的约束。对于REST服务,有一种渐进式描述(http://martinfowler.com/articles/richardsonMaturityModel.html),即只有当API满足相应程度的约束时才可称为REST式。REST将客户端-服务器端架构、动词的使用和URL的命名规范也作为其约束。

使用JavaScript客户端处理实用的“REST式”API产生的消息是开发方法中重要的一环,那么服务器端的情况是怎么样的?

Java企业版(JEE)包含了JAX-RS API(http://docs.oracle.com/javaee/6/tutorial/doc/giepu.html),它是一种Java风格的REST(但没有严格遵循REST规范),并使用了Jersey作为一种参考实现予以展示。如果仅限于使用JAX-RS开发Web应用,则会忽略一些现有的框架和其他一些基于JVM的编程语言所提供的解决方案(尤其擅长快速搭建原型)。

为一本书起一个简单明了、引人入胜的书名并不容易,多亏了James Ward(www.jamesward.com),他在2012年的OSCON大会上发表了一篇题为“Client-Server Web Applications with HTML5 and Java”的演讲。在这篇演讲中,他列举了一种正在变得流行的Web应用开发方法的优点,在近些年的一些项目中,我也使用了这种方法开发Web应用。其中,术语“客户端-服务器端”是理解这种开发方法的关键,它概括了软件架构的根本性改变,对客户端和服务器端做出了明确区分,并将两者放在了同样重要的位置上。

Web应用的这种客户端-服务器端架构带来了程序员工作方式的转变(有时候,甚至是天翻地覆的变化)。本书就是为了帮助开发者适应这种革命而写的,特别是对于如何构建现代Web应用的最新方法方面,也做出了恰当的评价。

目标读者

本书的目标读者是那些熟悉Java、HTML、JavaScript和CSS的Web应用开发者。它是为那些喜欢在实践中学习,喜欢将新技术集成进标准工具中构建示例应用的读者而量身定制的。如果你想了解JavaScript的最新发展,以及和使用Java在开发流程上的异同,那么请阅读本书。

阅读本书,你需要在两方面之间做平衡。一方面,读者从本书中能得到的最大收获是从宏观上掌握技术转变的影响和趋势;另一方面,理解技术的最好途径往往是具体的例子。如果你的兴趣在于从宏观上掌握各种技术之间是如何融合在一起,那么定能从本书中受益。

我写作此书的目的,就是帮助读者做出明智的决定。好的决定可以帮助你在新项目中采用正确的技术,避免因采用不相容的技术造成的陷阱,或者对给出的决定形成错误的预期。它还能帮助你在正开发的项目里快速上手,更好地支持已有代码。简言之,明智的决定可以让程序员的工作效率更高,它能让你在当前,或者是未来工作中研究感兴趣的领域时高效地利用时间。

本书内容

第1章概览了客户端-服务器端的Web应用架构,介绍了Web应用开发的历史,并为Web开发范式的迁移提供了充足的证据。由此引出了接下来的三章内容,分别描述了开发过程中各种工具的使用。

第2章介绍了JavaScript语言,以及使用JavaScript进行开发时用到的工具。

第3章介绍了如何设计Web API、REST,以及开发基于HTTP的REST式应用时用到的工具。

第4章介绍了Java,以及本书剩余章节内容需要用到的软件。

本书的第二部分探讨了更高级的结构(比如客户端类库和应用服务器),以及它们如何做到良好的分离,从而方便快速开发。

第5章介绍了主流的客户端JavaScript框架。

第6章介绍了Java API服务器和服务。

第7章介绍了快速开发实践。

第8章深入讨论了API设计。

对这些类库和快速开发原型的流程有所了解之后,在接下来的几章中,我们将这些知识应用于具体的项目,使用各种基于JVM的语言和框架。在接下来的两章中,我们使用了轻量级的Web服务器和微框架,而没有采用传统的Java Web应用所需的打包方式和服务器。

第9章介绍了一个使用jQuery和Jython的项目。

第10章介绍了一个使用JRuby和Angular开发的项目。

本书的最后几章详细介绍了几个使用传统的Java Web应用服务器和类库的项目。

第11章介绍了Java生态系统中现有的Web应用打包方式和部署选项。

第12章介绍了虚拟化和在管理大规模服务器环境中涌现出的新技术。

第13章将焦点放在了测试和文档化上。

第14章对全书做总结,并对互联网相关技术和软件开发中各种纷繁的变化给出了看法。

附录A介绍了如何方便地与Java类交互。

排版约定

本书使用的排版约定如下所示。

  • 楷体
    表示新的术语。

  • 等宽字体(Constant width
    表示程序片段,也用于在正文中表示程序中使用的变量、方法名、命令行代码等元素。

  • 等宽粗体(Constant width bold
    表示示例中的新代码。

  • 等宽斜体(Constant width italic
    表示应该由用户输入的值或根据上下文确定的值替换的文本。

图像说明文字这个图标表示提示、建议或重要说明。

图像说明文字这个图标表示警告或提醒。

使用代码示例

你可以在这里下载本书随附的资料(项目、代码示例等):https://github.com/javajavascript/client-server-web-apps。你可以在线查看,或者下载其压缩文件以在本地使用。其中资源是按章划分的。

本书示例代码仅作展示特定功能之用,不求全面展示一个功能完整的应用,具体区别如下。

  • 产品级的系统要对数据类型、验证规则、异常处理例程和日志做很大的改进。

  • 大多数产品级系统都会在后台包含若干个数据存储。为了限制讨论范围,大多数示例都未牵扯数据库。

  • 现代Web应用有很大一部分面向移动设备,而且要考虑浏览器兼容性。除非讨论到这些主题,否则我们会避免响应式设计(http://en.wikipedia.org/wiki/Responsive_web_design),而只提供一个最简化的设计。

  • 不可见JavaScript(unobtrusive JavaScript,参见http://en.wikipedia.org/wiki/Unobtrusive_JavaScript)将CSS、JavaScript和HTML分开,是一种被广泛接受的最佳实践。然而在本书的示例代码中,它们常常被混在一起,这是因为对一个应用来说,仅从一个文件就可窥视其奥秘。

  • 单元测试和测试代码示例只在和所讨论主题直接相关时才被包括进来。产品级的系统往往包含大量的测试。

让本书助你一臂之力。也许你需要在自己的程序或文档中用到本书中的代码,但除非大篇幅地使用,否则不必与我们联系取得授权。例如,用本书中的几段代码编写程序无需请求许可,但是销售或者发布O'Reilly图书中代码的光盘则必须事先获得授权;引用书中内容或代码来回答问题也无需获得授权,但将大量示例代码整合到你自己的产品文档中则必须经过许可。

使用我们的代码时,希望你能标明它的出处,但我们并不强求。出处信息一般包括书名、作者、出版商和书号,例如:Client-Server Web Apps with JavaScript and Java , Casimir Saternos (O'Reilly). Copyright 2014 EzGraphs, LLC., 978-1-449-36933-0。

如果还有关于使用代码的未尽事宜,请随时与我们联系:permissions@oreilly.com。

对长命令的格式化

对于长命令,我们要做适当的调整以方便大家阅读。在操作系统里有一个约定俗成的规则,即使用反斜杠插入新行。比如,下面的两个命令是等价的,在bash中执行结果是一样的。(bash是一种标准的操作系统shell,当你使用命令行访问Linux服务器或Mac OS X系统时就会用到。)

ls -l *someVeryLongName*
...
ls -l \
*someVeryLongName*

这种规则在其他用到操作系统命令的环境下也适用,比如Dockerfiles。

同样,合法的JSON字符串也可以分成多行:

o={"name": "really long string here and includes many words"}

// 如大家期望的那样,下面的语句结果为真
JSON.stringify(o)=='{"name":"really long string here and includes many words"}'

// 同样的字符串,分成多行的结果是一样的, 因此下面的结果也为真
JSON.stringify(o)=='{"name":' +
                   '"some really long ' +
                   'JSON string is here' +
                   ' and includes many, many words"}'

Safari® Books Online

Safari Books Online(http://www.safaribooksonline.com)是应需而变的数字图书馆。它同时以图书和视频的形式出版世界顶级技术和商务作家的专业作品。

Safari Books Online是技术专家、软件开发人员、Web设计师、商务人士和创意人士开展调研、解决问题、学习和认证培训的第一手资料。

对于组织团体、政府机构和个人,Safari Books Online提供各种产品组合和灵活的定价策略。用户可通过一个功能完备的数据库检索系统访问O'Reilly Media、Prentice Hall Professional、Addison-Wesley Professional、Microsoft Press、Sams、Que、Peachpit Press、Focal Press、Cisco Press、John Wiley & Sons、Syngress、Morgan Kaufmann、IBM Redbooks、Packt、Adobe Press、FT Press、Apress、Manning、New Riders、McGraw-Hill、Jones & Bartlett、Course Technology以及其他几十家出版社的上千种图书、培训视频和正式出版之前的书稿。要了解Safari Books Online的更多信息,我们网上见。

联系我们

请把对本书的评价和问题发给出版社。

美国:
O'Reilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472

中国:
北京市西城区西直门南大街2号成铭大厦C座807室(100035)
奥莱利技术咨询(北京)有限公司

O'Reilly的每一本书都有专属网页,你可以在那儿找到本书的相关信息,包括勘误表、示例代码以及其他信息。本书的网站地址是:
http://oreil.ly/client-server-web-apps-js

关于本书的评论和技术性问题,请发送电子邮件到:
bookquestions@oreilly.com。

要了解更多O'Reilly图书、培训课程、会议和新闻的信息,请访问以下网站:
http://www.oreilly.com

我们在Facebook的地址如下: http://facebook.com/oreilly

请关注我们的Twitter动态: http://twitter.com/oreillymedia

我们的YouTube视频地址如下: http://www.youtube.com/oreillymedia

致谢

感谢人员名单如下:

  • Meg、Ally、Simon和O'Reilly公司的朋友们,感谢你们让我有幸写作此书。
  • 感谢我的兄弟Neal Saternos和James Femister博士,他们在我学习编程早期给我很多中肯的建议。
  • 感谢Michael Bellomo、Don Deasey和Scott Miller花费了宝贵的时间审阅本书。
  • 感谢Charles Leo Saternos从使用Lua开发游戏中抽身出来,帮我绘制了一些图形并完成了设计工作。
  • 感谢Caleb Lewis Saternos,从他身上我学到了什么是坚持(有人坚持晨跑吗?),他完成了本书的编辑工作。
  • 感谢David Amidon给了我从事软件开发的机会,感谢Doug Pelletier让我第一次开发了一个基于Java的Web应用。
  • 感谢那些在项目中并肩作战的兄弟们,他们是经理Wayne Hefner、Tony Powell、Dave Berry、Jay Colson和Pat Doran,当然还有首席软件架构师Eric Fedok 和Michael Bellomo。
  • 感谢PluralSight(http://pluralsight.com/training)的Geoffrey Grosenbach、Webucator(http://www.webucator.com/)的Nat Dunn,还有Caroline Kvitka(和来自Oracle和Java Magazine的朋友),感谢他们在过去几年中给了我技术写作的机会,正是因此我才得以在今天写出本书。
  • 感谢我的父母Leo和Clara Saternos在温馨的环境中将我抚养成人,感谢他们在家用PC还很罕见时为我购置了一台Radio Shack Color Computer。还要感谢我的妹妹Lori,她时刻提醒我生活中还有很多重要的事是和计算机编程无关的。

将我诚挚的爱和谢意献给我最棒的妻子Christina和孩子们:Clara Jean、Charles Leo、Caleb Lewis和Charlotte Olivia。在本书写作过程中,他们给予了我无尽的爱与支持,他们总是很有耐心,不断给我鼓励。

最后,巴赫在各个层面上都给予了我灵感。特别是他在开始工作时的专注,我愿和他一同呐喊:荣耀归于上帝(http://en.wikipedia.org/wiki/Soli_Deo_gloria)!

目录