计算机科学领域有两大难题:缓存失效和命名。
—Phil Karlton

写一本关于缓存失效的书并不是难事,难的是如何给书取个好名字。诚如书名所示,本书探讨了Web开发方方面面的变化,这些变化促成了一种新的设计Web应用方式的诞生。

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

因此,我选择了"客户端-服务器端"这一术语,来概括Web开发在这一创新过程中所发生的变化。时下流行的其他一些对现代化开发实践的描述不适合我们的研究领域,因此在这里不予讨论。这里所讲的Web应用开发是和桌面浏览器相关的,另一个日渐相关的话题:移动引用开发,并不在我们的讨论范围内。

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

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

这就是流行的REST(Representational State Transfer)技术,它建议了一种网络服务消息传递的风格。但是REST的作者Roy Fielding只给出了有限的定义,在个人博客中,他列出了自诩为"RESTful APIs",却常常违反REST风格的几个错误。还有人在StackOverflow上发帖提问“JSON API can be truly RESTful”,因为JSON并不完全满足REST结构风格的约束。对于REST服务,有一种渐进式的描述,只有当API满足相应程度上的约束时,才可称之为RESTful的。REST将客户端-服务器端架构作为其约束之一,动词的使用和URL的命名规范也是。

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

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

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

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

目标读者

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

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

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

组织结构

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

第二章介绍了JavaScript语言,和使用JavaScript开发时用到的工具。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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