第1章 因变而变 1
1.1 Web用户 2
1.2 技术 2
1.3 软件开发 3
1.4 哪些没变 4
1.4.1 Web的本质 5
1.4.2 为什么说服务器驱动的Web开发有害 6
1.5 为什么需要客户端-服务器端的Web应用 7
1.5.1 代码组织结构/软件架构 7
1.5.2 “设计的灵活性”与“使用开源API” 7
1.5.3 原型 7
1.5.4 开发者的效率 8
1.5.5 应用性能 8
1.6 小结 9
第2章 JavaScript和JavaScript工具 11
2.1 学习JavaScript 12
2.2 JavaScript的历史 13
2.3 一门函数式语言 14
2.3.1 作用域 15
2.3.2 一级函数 16
2.3.3 函数声明和表达式 17
2.3.4 函数调用 19
2.3.5 函数参数 19
2.3.6 对象 20
2.4 面向Java开发者的JavaScript 20
2.4.1 HelloWord.java 20
2.4.2 带变量的Hello Word.java 23
2.5 最佳开发实践 25
2.5.1 编码规范和约定 25
2.5.2 浏览器 26
2.5.3 集成开发环境 26
2.5.4 单元测试 27
2.5.5 文档 27
2.6 项目 27
第3章 REST和JSON 33
3.1 什么是REST 34
3.1.1 资源 34
3.1.2 动词(HTTP请求) 34
3.1.3 统一资源标识符 35
3.2 REST约束 36
3.2.1 客户端-服务器端 36
3.2.2 无状态 36
3.2.3 可缓存 37
3.2.4 统一接口 37
3.2.5 分层 38
3.2.6 按需交付代码 38
3.3 HTTP响应代码 38
3.4 JSON 39
3.5 HATEOAS 40
3.6 API衡量和分类 43
3.7 函数式编程和REST 43
3.8 项目 44
3.9 其他Web API工具 48
3.10 约束回顾 48
第4章 Java工具 49
4.1 Java语言 49
4.2 Java虚拟机 50
4.3 Java工具 51
4.4 构建工具 52
4.4.1 Maven的优点 54
4.4.2 Maven的功能 54
4.4.3 版本控制 55
4.4.4 单元测试 56
4.5 处理JSON的Java类库 56
4.6 项目 57
4.6.1 用Java处理JSON 57
4.6.2 用JVM上的脚本语言处理JSON 59
4.7 小结 62
第5章 客户端框架 65
5.1 概述 65
5.2 起点一:响应式Web设计 67
5.2.1 HTML5 Boilerplate 68
5.2.2 Bootstrap 68
5.3 起点二:JavaScript库和框架 69
5.3.1 浏览器兼容性 69
5.3.2 框架 69
5.3.3 功能 70
5.3.4 流行程度 70
5.4 获取起始项目 71
5.4.1 直接从仓库下载 71
5.4.2 从入门网站下载 71
5.4.3 IDE生成的起始项目 72
5.5 前端工程师的崛起 72
5.5.1 客户端模板 72
5.5.2 资源管道 73
5.5.3 开发流程 74
5.6 项目 74
5.7 小结 76
第6章 Java Web API服务器 77
6.1 更简单的服务器端解决方案 77
6.2 基于Java的服务器 79
6.2.1 Java HTTP服务器 79
6.2.2 Jetty嵌入式服务器 81
6.2.3 Restlet 82
6.2.4 Roo 83
6.2.5 Netty嵌入式服务器 87
6.2.6 Play服务器 89
6.2.7 其他轻量级服务器 92
6.3 基于JVM的服务器 92
6.4 Web应用服务器 93
6.5 如何在开发中使用 94
6.6 小结 94
第7章 快速开发实践 95
7.1 开发者的生产率 95
7.2 优化开发者和团队的工作流程 98
7.2.1 例子:修复Web应用 99
7.2.2 例子:测试集成 100
7.2.3 例子:绿地开发 101
7.3 生产率和软件开发生命周期 101
7.3.1 管理方式和企业文化 102
7.3.2 技术架构 102
7.3.3 软件工具 103
7.3.4 性能 104
7.3.5 测试 104
7.3.6 底层平台 105
7.4 小结 106
第8章 API设计 107
8.1 设计的起点 108
8.2 实用的Web API与REST API 109
8.3 指引 110
8.3.1 名词即资源,动词即HTTP行为 110
8.3.2 请求参数作为修饰符 111
8.3.3 Web API版本 112
8.3.4 HTTP标头 113
8.3.5 链接 113
8.3.6 响应 113
8.3.7 文档 113
8.3.8 格式约定 114
8.3.9 安全性 114
8.4 项目 114
8.4.1 运行项目 114
8.4.2 服务端代码 115
8.4.3 Curl和jQuery 117
8.5 实践理论 118
第9章 jQuery和Jython 119
9.1 服务端:Jython 120
9.1.1 Python Web服务器 120
9.1.2 Jython Web服务器 120
9.1.3 MockAPI 121
9.2 客户端:jQuery 122
9.2.1 DOM遍历和操作 122
9.2.2 实用函数 123
9.2.3 效果 124
9.2.4 事件处理 124
9.2.5 Ajax 124
9.3 jQuery和更高级的抽象 125
9.4 项目 125
9.4.1 基础HTML 126
9.4.2 JavaScript和jQuery 126
9.5 小结 128
第10章 JRuby和Angular 129
10.1 服务器端:JRuby和Sinatra 130
10.1.1 工作流 130
10.1.2 交互式Ruby shell 131
10.1.3 Ruby版本管理器 131
10.1.4 包 132
10.1.5 Sinatra 133
10.1.6 JSON处理 134
10.2 客户端:AngularJS 135
10.2.1 模型 135
10.2.2 视图 135
10.2.3 控制器 136
10.2.4 服务 136
10.3 比较jQuery和Angular 136
10.3.1 DOM和模型操作 136
10.3.2 Angular的不可见性 137
10.4 项目 137
10.5 小结 143
第11章 打包和部署 145
11.1 打包Java和JEE应用 145
11.2 JEE应用的部署 147
11.2.1 图形界面管理 148
11.2.2 命令行管理 150
11.3 非JEE应用的部署 151
11.3.1 服务器在应用之外 152
11.3.2 服务器和应用并行 152
11.3.3 服务器在应用里面 154
11.4 不同部署方式带来的影响 154
11.4.1 负载均衡 155
11.4.2 自动化应用部署 156
11.5 项目 157
11.5.1 客户端 157
11.5.2 服务器端 158
11.6 小结 158
第12章 虚拟化 159
12.1 全虚拟化 159
12.2 虚拟机的实现 161
12.2.1 VMWare 161
12.2.2 VirtualBox 161
12.2.3 Amazon EC2 161
12.3 虚拟机的管理 162
12.3.1 Vagrant 162
12.3.2 Packer 162
12.3.3 DevOps配置管理 163
12.4 容器 163
12.4.1 LXC 164
12.4.2 Docker 164
12.5 项目 165
12.5.1 Docker帮助 166
12.5.2 镜像和容器的维护 166
12.5.3 在Docker里使用Java 167
12.5.4 Docker和Vagrant的网络设置 169
12.6 小结 170
第13章 测试和文档 171
13.1 测试的种类 172
13.1.1 “正式”与“非正式” 172
13.1.2 测试范围 172
13.1.3 谁来测?测什么?为谁测 173
13.2 测试反映了组织的成熟度 173
13.2.1 使用软件能力成熟度模型评价流程 173
13.2.2 使用Maven促进流程统一 174
13.2.3 使用行为驱动开发促进流程统一 176
13.3 测试框架 176
13.3.1 JUnit 177
13.3.2 Jasmine 177
13.3.3 Cucumber 178
13.4 项目 179
13.4.1 JUnit 180
13.4.2 Jasmine 180
13.4.3 Cucumber 181
13.4.4 Maven报告 181
13.5 小结 182
第14章 总结 183
14.1 社区 183
14.2 历史 184
14.3 尾声 184
附录A JRuby IRB及Java API 185
附录B REST式的Web API总结 191
附录C 参考文献 196
关于作者 197
关于封面图 197