深入分析Java Web技术内幕(修订版)


深入分析Java Web技术内幕(修订版)
 阿里巴巴集团技术丛书

深入分析Java Web技术内幕(修订版)(阿里巴巴集团技术丛书。技术大牛范禹、玉伯、毕玄联合力荐!大型互联网公司开发应用实践!

许令波 著  

ISBN 978-7-121-23293-0

20148月出版

定价:79.00

464

16

编辑推荐

让读者知其然,并知其所以然,是《深入分析Java Web技术内幕(修订版)》一书最大的特色。

作者来自淘宝技术一线,亲历了淘宝网PV1亿到10亿的发展历程,直接经历了在这个过程中技术的不断突破、飞跃等变迁,并积累了丰富实践经验。

《深入分析Java Web技术内幕(修订版)》正是分享了作者在面临种种技术问题、技术瓶颈时的思路、方法和技巧,具体的应用实践和直接的案例。

在这次的修订版中,作者补充了淘宝网近两年在无线端的最新的应用实践。在这个快速发展的移动互联的时代,这样直接的技术积累和分享尤其珍贵。

相信读者一定能从中获益匪浅。

阿里巴巴集团技术丛书是抱持着为工程师服务的理念诞生的。

阿里的快速发展,使我们有机会见证技术变革的强大力量。在这过程中,我们经历了技术的变迁、兴衰、成败,既有收获也有教训。如今,阿里已成为一家令人瞩目的互联网公司,站在这样的时点上,回顾过去,放眼四周,我们深刻地觉得有必要将沉淀下来的一线经验与智慧,结集出版,理由有三。

1.回报。我们获得的种种经验与教训,只有在阿里这样快速成长、体量巨大的公司中才有机会亲历。这样的技术环境并不是每个工程师都有机缘遇到的。这些经历帮助了我们个人能力的提升,也帮助阿里成为一家技术实力过硬的公司。我们愿意把这些内容分享出来,帮助即将或已经面临类似问题的朋友们,如果他们可以从阅读中获得一些启发而少走弯路的话,将是我们最大的欣慰。

2.交流。在这套丛书里,我们同样会抛出我们的困惑、问题,借助丛书的平台,扩大工程师沟通的圈子,以书会友,共同探索、学习、提高。

3.温故知新。以结集的形式,将以往的经验与知识固化下来,既可便于以后查阅,也可以帮助我们系统地梳理思路,更为全面地审视、洞察、并理解过去发生的种种,为未来的变化做好更充分、扎实的准备。

基于以上的考虑,阿里巴巴集团技术丛书将立足于实践,着眼于问题,从工程师的视角解读技术的内涵。

让思考成为我们生活的乐趣,让阅读成为我们进步的阶梯!

内容提要

《深入分析Java Web技术内幕(修订版)》新增了淘宝在无线端的应用实践,包括:CDN 动态加速、多终端化改造、多终端Session 统一,以及在大流量的情况下,如何跨越性能、网络和一个地区的电力瓶颈等内容,并提供了比较完整的解决方案。

《深入分析Java Web技术内幕(修订版)》主要围绕Java Web 相关技术从三方面全面、深入地进行了阐述。首先介绍前端知识,即在JavaWeb 开发中涉及的一些基本知识,包括Web 请求过程、HTTPDNS 技术和CDN 技术。其次深入介绍了Java 技术,包括I/O 技术、中文编码问题、Javac 编译原理、class 文件结构解析、ClassLoader 工作机制及JVM 的内存管理等。最后介绍了Java 服务端技术,主要包括ServletSession CookieTomcat Jetty服务器、Spring 容器、iBatis 框架和Velocity 框架等原理介绍,并介绍了服务端的一些优化技术。

《深入分析Java Web技术内幕(修订版)》不仅介绍这些技术和框架的工作原理,而且结合示例来讲解,通过通俗易懂的文字和丰富、生动的配图,让读者充分并深入理解它们的内部工作原理,同时还结合了设计模式来介绍这些技术背后的架构思维。

目录

1  深入Web请求过程         1

1.1  B/S网络架构概述2

1.2  如何发起一个请求        4

1.3  HTTP解析      6

1.3.1  查看HTTP信息的工具      8

1.3.2  浏览器缓存机制         9

1.4  DNS域名解析        12

1.4.1  DNS域名解析过程     12

1.4.2  跟踪域名解析过程    15

1.4.3  清除缓存的域名         18

1.4.4  几种域名解析方式    19

1.5  CDN工作机制        20

1.5.1  CDN架构    20

1.5.2  负载均衡    21

1.5.3  CDN动态加速    24

1.6  总结        25

2  深入分析Java I/O的工作机制      26

2.1  JavaI/O类库的基本架构         26

2.1.1  基于字节的I/O操作接口27

2.1.2  基于字符的I/O操作接口28

2.1.3  字节与字符的转化接口    29

2.2  磁盘I/O工作机制         30

2.2.1  几种访问文件的方式         30

2.2.2  Java访问磁盘文件    34

2.2.3  Java序列化技术         35

2.3  网络I/O工作机制         37

2.3.1  TCP状态转化     38

2.3.2  影响网络传输的因素         40

2.3.3  Java Socket的工作机制     40

2.3.4  建立通信链路    41

2.3.5  数据传输    42

2.4  NIO的工作方式    42

2.4.1  BIO带来的挑战42

2.4.2  NIO的工作机制43

2.4.3  Buffer的工作方式      46

2.4.4  NIO的数据访问方式48

2.5  I/O调优50

2.5.1  磁盘I/O优化      50

2.5.2  TCP网络参数调优     51

2.5.3  网络I/O优化      53

2.6  设计模式解析之适配器模式        57

2.6.1  适配器模式的结构    57

2.6.2  Java I/O中的适配器模式  58

2.7  设计模式解析之装饰器模式        58

2.7.1  装饰器模式的结构    59

2.7.2  Java I/O中的装饰器模式  59

2.8  适配器模式与装饰器模式的区别        60

2.9  总结        60

3  深入分析Java Web中的中文编码问题         61

3.1  几种常见的编码格式   61

3.1.1  为什么要编码    61

3.1.2  如何“翻译”    62

3.2  Java中需要编码的场景  64

3.2.1  I/O操作中存在的编码64

3.2.2  在内存操作中的编码         66

3.3  Java中如何编解码  67

3.3.1  按照ISO-8859-1编码          69

3.3.2  按照GB2312编码      70

3.3.3  按照GBK编码    71

3.3.4  按照UTF-16编码        71

3.3.5  按照UTF-8编码72

3.3.6  UTF-8编码代码片段  72

3.3.7  对几种编码格式的比较    74

3.4  Java Web中涉及的编解码       74

3.4.1  URL的编解码     76

3.4.2  HTTP Header的编解码      79

3.4.3  POST表单的编解码   79

3.4.4  HTTP BODY的编解码         80

3.5  JS中的编码问题       81

3.5.1  外部引入JS文件        81

3.5.2  JSURL编码    82

3.5.3  其他需要编码的地方         84

3.6  常见问题分析        84

3.6.1  中文变成了看不懂的字符         84

3.6.2  一个汉字变成一个问号    85

3.6.3  一个汉字变成两个问号    85

3.6.4  一种不正常的正确编码    86

3.7  一种繁简转换的实现方式   87

3.8  总结        88

4  Javac编译原理        89

4.1  Javac是什么90

4.2  Javac编译器的基本结构      90

4.3  Javac工作原理分析      92

4.3.1  词法分析器         93

4.3.2  语法分析器         100

4.3.3  语义分析器         105

4.3.4  代码生成器         115

4.4  设计模式解析之访问者模式        118

4.4.1  访问者模式的结构    119

4.4.2  Javac中访问者模式的实现       120

4.5  总结        121

5  深入class文件结构        122

5.1  JVM指令集简介   122

5.1.1  与类相关的指令         124

5.1.2  方法的定义         125

5.1.3  属性的定义         126

5.1.4  其他指令集         127

5.2  class文件头的表示形式       135

5.3  常量池   139

5.3.1  UTF8常量类型   142

5.3.2  FieldrefMethodref常量类型  143

5.3.3  Class常量类型   143

5.3.4  NameAndType常量类型    144

5.4  类信息   144

5.5  FieldsMethods定义145

5.6  类属性描述   149

5.7  Javap生成的class文件结构        150

5.7.1  LineNumberTable         152

5.7.2  LocalVariableTable       153

5.8  总结        155

6  深入分析ClassLoader工作机制   156

6.1  ClassLoader类结构分析       157

6.2  ClassLoader的等级加载机制       158

6.3  如何加载class文件      161

6.3.1  加载字节码到内存    161

6.3.2  验证与解析         163

6.3.3  初始化Class对象      163

6.4  常见加载类错误分析   163

6.4.1  ClassNotFoundException    163

6.4.2  NoClassDefFoundError        164

6.4.3  UnsatisfiedLinkError   165

6.4.4  ClassCastException     166

6.4.5  ExceptionInInitializerError  167

6.5  常用的ClassLoader分析      168

6.6  如何实现自己的ClassLoader       172

6.6.1  加载自定义路径下的class文件       172

6.6.2  加载自定义格式的class文件  174

6.7  实现类的热部署   176

6.8  Java应不应该动态加载类   178

6.9  总结        179

7  JVM体系结构与工作方式     180

7.1  JVM体系结构        180

7.1.1  何谓JVM    180

7.1.2  JVM体系结构详解    183

7.2  JVM工作机制        185

7.2.1  机器如何执行代码    185

7.2.2  JVM为何选择基于栈的架构    186

7.2.3  执行引擎的架构设计         187

7.2.4  执行引擎的执行过程         188

7.2.5  JVM方法调用栈         193

7.3  总结        197

8  JVM内存管理          198

8.1  物理内存与虚拟内存   199

8.2  内核空间与用户空间   200

8.3  Java中哪些组件需要使用内存       201

8.3.1  Java         201

8.3.2  线程    201

8.3.3  类和类加载器    202

8.3.4  NIO      202

8.3.5  JNI        203

8.4  JVM内存结构        203

8.4.1  PC寄存器   204

8.4.2  Java         204

8.4.3           205

8.4.4  方法区         205

8.4.5  运行时常量池    206

8.4.6  本地方法栈         206

8.5  JVM内存分配策略        206

8.5.1  通常的内存分配策略         207

8.5.2  Java中的内存分配详解    207

8.6  JVM内存回收策略        212

8.6.1  静态内存分配和回收         212

8.6.2  动态内存分配和回收         213

8.6.3  如何检测垃圾    213

8.6.4  基于分代的垃圾收集算法         215

8.7  内存问题分析        224

8.7.1  GC日志分析       224

8.7.2  堆快照文件分析         227

8.7.3  JVM Crash日志分析  227

8.8  实例1     233

8.9  实例2     235

8.10  实例3  237

8.11  总结      242

9  Servlet工作原理解析     243

9.1  Servlet容器说起       243

9.1.1  Servlet容器的启动过程    244

9.1.2  Web应用的初始化工作    247

9.2  创建Servlet实例  249

9.2.1  创建Servlet对象        250

9.2.2  初始化Servlet    250

9.3  Servlet体系结构   252

9.4  Servlet如何工作   255

9.5  Servlet中的Listener      257

9.6  Filter如何工作       259

9.7  Servlet中的url-pattern          261

9.8  总结        262

10  深入理解SessionCookie263

10.1  理解Cookie264

10.1.1  Cookie属性项  264

10.1.2  Cookie如何工作       265

10.1.3  使用Cookie的限制268

10.2  理解Session         269

10.2.1  SessionCookie      269

10.2.2  Session如何工作      270

10.3  Cookie安全问题273

10.4  分布式Session框架    274

10.4.1  存在哪些问题  274

10.4.2  可以解决哪些问题  275

10.4.3  总体实现思路  275

10.5  Cookie压缩280

10.6  表单重复提交问题      282

10.7  多终端Session统一    283

10.8  总结      285

11  Tomcat的系统架构与设计模式  286

11.1  Tomcat总体设计         286

11.1.1  Tomcat总体结构      287

11.1.2  Connector组件         293

11.1.3  Servlet容器Container      298

11.1.4  Tomcat中的其他组件      309

11.2  Tomcat中的设计模式         309

11.2.1  门面设计模式  309

11.2.2  观察者设计模式       311

11.2.3  命令设计模式  313

11.2.4  责任链设计模式       314

11.3  总结      316

12  Jetty的工作原理解析  317

12.1  Jetty的基本架构         317

12.1.1  Jetty基本架构简介317

12.1.2  Handler的体系结构         319

12.2  Jetty的启动过程         320

12.3  接受请求      321

12.3.1  基于HTTP工作         321

12.3.2  基于AJP工作   323

12.3.3  基于NIO方式工作  326

12.4  处理请求      327

12.5  JBoss集成       330

12.6  Tomcat的比较        331

12.6.1  架构比较  331

12.6.2  性能比较  332

12.6.3  特性比较  332

12.7  总结      333

13  Spring框架的设计理念与设计模式分析    334

13.1  Spring的骨骼架构       334

13.1.1  Spring的设计理念   335

13.1.2  核心组件如何协同工作  336

13.2  核心组件详解      337

13.2.1  Bean组件337

13.2.2  Context组件     339

13.2.3  Core组件340

13.2.4  Ioc容器如何工作     342

13.3  SpringAOP的特性详解  352

13.3.1  动态代理的实现原理       352

13.3.2  Spring AOP如何实现        355

13.4  设计模式解析之代理模式358

13.4.1  代理模式原理  358

13.4.2  Spring中代理模式的实现        358

13.5  设计模式解析之策略模式361

13.5.1  策略模式原理  361

13.5.2  Spring中策略模式的实现        362

13.6  总结      362

14  Spring MVC的工作机制与设计模式   364

14.1  Spring MVC的总体设计      364

14.2  Control设计         369

14.2.1  HandlerMapping初始化  370

14.2.2  HandlerAdapter初始化   372

14.2.3  Control的调用逻辑373

14.3  Model设计  374

14.4  View设计     375

14.5  框架设计的思考377

14.5.1  为什么需要框架       377

14.5.2  需要什么样的框架  377

14.5.3  框架设计原则  378

14.5.4 “指航灯”         378

14.5.5  最基本的原则  378

14.6  设计模式解析之模板模式379

14.6.1  模板模式的结构       379

14.6.2  Spring MVC中的模板模式示例       379

14.7  总结      380

15  深入分析iBatis框架之系统架构与映射原理    381

15.1  iBatis框架主要的类层次结构   381

15.2  iBatis框架的设计策略        382

15.3  iBatis框架的运行原理        384

15.4  示例      386

15.5  iBatisSQL语句的解析    388

15.6  数据库字段映射到Java对象     389

15.7  示例运行的结果391

15.8  设计模式解析之简单工厂模式391

15.8.1  简单工厂模式的实现原理       391

15.8.2  iBatis中的简单工厂模式示例         392

15.9  设计模式解析之工厂模式393

15.9.1  工厂模式的实现原理       393

15.9.2  iBatis中的工厂模式示例         394

15.10  总结   395

16  Velocity工作原理解析397

16.1  Velocity总体架构         398

16.2  JJTree渲染过程解析  401

16.2.1  #set语法  405

16.2.2  Velocity的方法调用          406

16.2.3  #if#elseif#else语法409

16.2.4  #foreach语法   410

16.2.5  #parse语法       412

16.3  事件处理机制      413

16.4  常用优化技巧      416

16.4.1  减少树的总节点数量       416

16.4.2  减少渲染耗时的节点数量       416

16.5  JSP比较  417

16.5.1  JSP渲染机制    417

16.5.2  VelocityJSP   423

16.6  设计模式解析之合成模式423

16.6.1  合成模式的结构       423

16.6.2  Velocity中合成模式的实现     424

16.7  设计模式解析之解释器模式      425

16.7.1  解释器模式的结构  425

16.7.2  Velocity中解释器模式的实现          426

16.8  总结      426

17  Velocity优化实践427

17.1  现实存在的问题427

17.2  优化的理论基础428

17.2.1  程序语言的三角形结构  428

17.2.2  数据结构减少抽象化       429

17.2.3  简单的程序复杂化  429

17.2.4  减少翻译的代价       430

17.2.5  变的转化为不变的  430

17.3  一个高效的模板引擎实现思路430

17.3.1  vm模板如何被编译         432

17.3.2  方法调用的无反射优化  439

17.3.3  将字符输出改成字节输出       442

17.4  优化的成果443

17.4.1  char转成byte      443

17.4.2  无反射执行       444

17.5  其他优化手段      445

17.6  总结      445

18  大浏览量系统的静态化架构设计       446

18.1  淘宝大浏览量商品详情系统简介      446

18.2  系统面临哪些挑战      447

18.3  淘宝前台系统的优化历程449

18.4  大浏览量系统的静态改造449

18.4.1  什么是静态化系统  449

18.4.2  为什么要进行静态化架构设计       450

18.4.3  如何改造动态系统  451

18.4.4  几种静态化方案的设计及选择       453

18.4.5  如何解决失效问题  458

18.4.6  服务端静态化方案的演进:CDN      459

18.5  总结      462

参考资料         463

媒体评论

《深入分析Java Web技术内幕(修订版)》的内容涉及从HTTPServlet、模板渲染、数据层、容器到JVM Java Web开发的各个方面,这些问题是许令波在日常工作中经常遇到的,我想也是所有Java Web开发人员都会遇到的。《深入分析Java Web技术内幕(修订版)》最大的特点就是让Java Web 开发人员对整个开发过程所涉及的技术能有一个完整的脉络图,从前端浏览器到Java 技术,再到Java 服务端技术,还介绍了实现这些技术用到的设计模式;不仅详细总结了这些技术的工作原理,而且也结合了很多实际案例来进行阐述,将复杂、难懂的技术原理通过时序图和架构图的方式展现出来,更加便于读者理解。可以说如果你掌握了本书的知识,那么你就可以成为一个合格的JavaWeb开发人员。

《深入分析Java Web技术内幕(修订版)》文笔流畅,图表清晰、易懂,值得推荐给Java Web 开发人员作为进阶学习的参考书。

——吴泽明(范禹),天猫产品技术部研究员

这是一本关于Java 的书,里面讲述的大量基础知识对前端开发工程师非常有帮助。比如中文编码章节,作者以一个实践者的身份详细阐述了编码问题的方方面面。总之,这是一本很用心的书,是实践者的思考和总结。目前在国内很少看到这类书籍,强烈推荐从事Web 开发工作的人员阅读并实践之。

——王保平(玉伯),开源前端类库KISSYSeaJS作者

作者在淘宝做了很多Java Web 方面的改造项目,在Java Web 的相关技术上有深入的掌握,并积累了丰富的经验。在这本书中作者不仅向读者展示了这类大改造项目所需的知识,还展示了Java Web 更为全景的技术知识体系。本书值得Java Web 开发人员阅读。

——林昊(毕玄),淘宝资深技术专家

从第1 次拜读相关内容开始,就可以感觉到作者并不是在简简单单地讲述一门技术或者一个概念,他的分析和讲解十分深入,并且可以很好地聚焦读者的思路,尤其是在Java Web Servlet 规范及字符串处理方面,都有很优秀的内容。在众多向developerWorks投稿的国内作者中,无论是从文章的质量看,还是从内容的选题方向看,作者的文章都可称为上乘之作。同时,他的多篇文章还得到了广大网站读者的好评,其访问量、评分及评论的数量均名列前茅。

——刘达,developerWorks中国Java 专区编辑、技术工程师

前言

1版序

我第1次接触计算机应该是在10年前,记得当时连怎么开计算机都不会,当时感觉计算机真是一个让人着迷的东西,但是那时别说拥有一台计算机,就算是能玩上计算机也是一件奢侈的事情了。人总是有好奇心的,而我也因为追随着这份好奇和计算机一起走过了将近10年的光阴,也是这份好奇让我接触了计算机,认识了计算机,到现在了解了计算机。但是到目前为止我仍然有很多好奇的东西,所以我将一直求解下去。

回想我开始学习编程的时候,那是在大学期间开始构建自己的第1个网页,然后是第1个网站之时,其中的复杂程度真是让人难以想象。要构建一个网页,需要学习当时的“网页三剑客”,页面布局需要学习Dreamweaver,图片处理需要学习Fireworks,动画制作需要学习Flash。有时候为了一个导航栏甚至通宵达旦。还有,要自己搭建一个本地服务器,要学习IISApache等。当时的我竟然能够一个人完成这一系列的事情,现在想想还真是有点儿佩服自己。

现在回想一下当时自己的学习过程,真是走了很多弯路,浪费了很多时间。当时的学习就像是在一个陌生的城市找路一样,不知道如何才能到达目的地,只能边走边问别人,这个人告诉你一点,那个人告诉你一点,一点一点往前走。但是虽然在往前走,走的路却并不是最近的,甚至有人指的方向是错的。当时缺少一个总揽全局的地图,所以不能画出一条最优的路。虽然走了很多弯路,但是这种不断自学的过程还是大大地提升了我的学习能力,这种好的自学能力也在我以后的学习工作中起到了关键作用。

IT行业的知识变化很快,需要不断地学习新东西,所以学习知识的能力比掌握知识本身更重要。这也是目前大公司招聘标准中很重要的一条。记得当时我的老大在招聘我进入淘宝时,面试时就问我如何学习一门新技术。你在学习的过程中会碰到很多难题,并会克服这些难题,很多这样的过程积累起来就是你无形的宝贵财富。因为你遇到的问题肯定也是其他人遇到的问题,从发现问题、分析问题再到解决问题的过程远比这个问题本身更有价值。

爱因斯坦说过:“发现问题比解决问题更重要。”对IT人员来说,发现Bug和重现Bug比解决这个Bug更有难度。这就好比一个外国人问周思来总理中国有多少厕所,总理回答说只有两个厕所:男厕所和女厕所。但是,什么人在什么时间、什么地点需要上厕所,考虑这样的情形恐怕需要多少厕所就很难计算了。同样,在计算机中也只有01两个选择,在计算机中的程序也同样如此,每写一行代码就能增加甚至一个数量级的出错概率。但是我们还是要学习如何避免出现Bug,这就要求我们能有总理看问题的思维,将复杂的问题简单化,发现问题背后的本质,找到解决问题的背后的一些通用逻辑,按照这种思路来解决问题可能会让你事半功倍。

如何让学习知识的过程事半功倍,尤其是我们程序员如何做到,从我这么多年的学习过程来说,有一些经验可以分享给大家,这也是我写这本书的初衷,我真正想分享的不是我掌握的知识,更多的是我学习这个知识的过程,以及我对这些知识的一些总结和提炼。

虽然要掌握在整个Web开发中涉及的所有知识是一件非常困难的事情,尤其是要掌握这些知识的实现原理,不仅知其然还要知其所以然。所以掌握学习它们的方法至关重要。如何快速、高效地阅读它们的源码,有很多同学看到我在developerWorks上发表的文章时来信问我如何阅读各种框架的源码,很多同学都说不知道从哪里入手。其实,当你掌握了一些技巧,加上你的一点耐心,这并不是很难的。

本书虽然介绍了很多开源框架,但是始终都在告诉你如何才能更深入和简单地掌握这个框架,告诉你学习的方法,而并不是告诉你这个框架有哪些类,以及怎么使用这些零碎的知识。打个比喻,本书并不是告诉你1+1=21+2=32+2=4这个结果,然后你可以根据这个方式得出1+1+2=4,你要计算其他数必须根据它给你的公式才能计算,而是告诉你加、减、乘、除的算法规则,然后你就可以根据这个规则自己做运算了。

另外本书为什么要选择介绍Web开发中这些技术的实现原理,因为只有你掌握它们的实现原理,才能够快速地解决一些意想不到的问题。例如,当你理解了 ClassLoader的工作机制后,遇到ClassNotFoundException时,你就能快速地判断,到底为什么会报这个错误,可能是哪个地方出错导致的。

另外还有一个很重要的原因是,如果你很想进入淘宝、腾讯、百度这样的大型互联网企业工作,不掌握本书讲到的这些技术的实现原理,是很难通过技术面试的。因为面试官不仅希望你会用这些技术,还要求你说出个所以然来,所以,掌握这些技术的实现原理可以为你的职业发展提供更好的机会。

本书的组织结构

本书从结构上主要分为3部分:第1部分为基础知识,主要介绍在Java Web开发中涉及的一些基本知识,例如一次HTTP请求是什么样的,HTTP本身是如何工作的;第2部分将深入介绍Java技术,帮助读者了解Java是如何工作的,在会用的基础上进一步理解Java;第3部分是Java服务端技术,主要介绍Web服务器的处理流程,包括Servlet容器的工作原理和Web框架是如何运转的,也就是从Web服务器接收到请求至返回请求的这个过程中涉及的知识,最后介绍了针对大流量情况下的系统的一些优化技巧和实践项目。

目标读者

如果你是一名刚毕业的学生或者刚刚准备学习Web开发并且不知道如何入手的人,那么这本书比较适合你;如果你已经工作12年,已经熟悉了Java Web开发的基本流程并且想进一步提升自己,那么这本书更适合你。

如果你已经知道了如何学习Java Web开发技术,正准备入门进行实际开发,也就是说你是一个开发新手,那么这本书不太适合你。但是当你知道了如何开发一个Web应用并想知道它们是如何工作时,欢迎你再回来看本书,它能帮助你进一步提高。

总的来说,本书适合以下读者人群。

Web技术感觉迷茫,不知道如何开始学习,对整个B/S工作机制不了解的同学。

Java技术爱好者,以及想深入学习Java技术内部实现细节的人。

有一定开发基础,但是不了解Web中一些容器和框架的内部工作原理的人。

对性能优化和分布式数据管理有兴趣的大型互联网工程师,这里介绍了淘宝的一些实践经验。

开源代码爱好者,喜欢研究开源代码的Coder可以从本书中找到一些分析源码的方法。

本书不会教你如何开发Web应用程序,也不会介绍StrutsSpringiBatis等框架如何使用。这些框架的使用参考手册在图书市场上有很多,本书没有必要重复介绍。但是如果你已经掌握了如何使用并且不满足只会使用,想知道它们是如何工作的,想打开这些黑盒子,想以后告诉他人这些黑盒子里到底有些什么东西,对每种技术有强烈的好奇心,如果你是这样的人,那么本书值得你拥有。

本书特点

本书按照通常的学习习惯设计,为你展示了从浏览器发出请求到浏览器最终显示页面的整个过程,让你对Web开发的整个过程有个总体的理解。

本书虽然讲解的都是比较深入的技术,但是有关实践的示例和比较恰当的比喻将帮你更好地理解。

本书将结合淘宝网中真实使用的示例应用程序来讲解技术,让读者有更好的直观认识。

读者讨论

由于作者水平有限,书中难免有错误之处。在本书出版后的任何时间,若你对本书有任何问题,你都可以通过[email protected]发送邮件给我,或者到http://xulingbo.net上向我提交你的建议和想法,我会对所有问题给予回复。

致谢

感谢我的父母,在我高考失败后仍然给我机会让我选择做自己想做的事,支持我选择了自己喜欢的计算机行业,并在家庭并不富裕的情况下给我配置了第1台计算机,让我有机会继续追求自己的梦想,是你们的支持和鼓励让我在做自己一直喜欢做的事。

感谢我的老婆,从大学你就一直陪伴在我身边,有你在我身边是我不断努力的最大动力,在本书的写作过程中,你完成初稿的审阅工作,同时也给了我很多鼓励和建议。

感谢电子工业出版社的刘皎和张国霞编辑,你们严谨认真的工作态度让我非常敬佩。

感谢吴泽明(范禹)老大为本书写序,你不仅带我进入淘宝,而且一直帮助我持续进步。感谢王保平、林昊和刘达在繁忙的工作中为我写推荐语。

感谢在本书写作过程中提出宝贵意见的同事们,他们的花名是:小凡、小邪、丹臣、哲别、景升、文通、向飞、凌弃、路奇、济城、大仁、常彬、旭天、韩章、小赌、雁声、索尼、凤豪、柳擎、华黎、空望、嗷嗷、渐飞、普智、胜衣、叔度、文景、撒迦、狄龙、祝幽、单通、承泽等。

感谢developerWorks上所有向我提出问题和建议的网友们。

 

 

许令波

20127

 

再版序

自《深入分析Java Web技术内幕》一书出版以来,我收到了不少读者的反馈,也很感谢他们指出了书中的一些错误和不足。时隔两年,在电子工业出版社博文视点编辑的帮助下,《深入分析Java Web技术内幕》有了修订再版的机会。

这两年来,一些技术也在发生着变化:无线技术越来越成熟,我们的系统开始更多地支持无线,并衍生出系统要进行多终端化改造等问题;同时我们也遇到了一些新的技术问题如大流量、网络瓶颈及机房的电力短缺等,这给系统的部署和系统架构带来新的挑战。所以我借这次再版的机会,将这方面的技术更新和实践尝试一并分享给读者。除了修正前版的一些错漏之处,本次修订还主要做了以下更新。

1章增加了CDN动态加速的内容,介绍了我们当前最新的想法和尝试。

3章增加一种繁简转换的实现方式的内容,介绍了我们在遇到多终端的情况下面临的多语言的问题,将我们的思路和实践分享给大家。

10章增加了多终端Session统一的内容,也介绍了在多终端的情况下如何解决Session统一的问题。

新增了第18章,重点介绍了我们在近两年遇到大流量的情况下,如何跨越性能、网络和一个地区的电力瓶颈等问题,并提供了一个比较完整的解决方案。

感谢刘皎和张国霞两位编辑,感谢阿里巴巴的几位大牛范禹、黄眉等对修订版提供的一些有益建议,也感谢我们技术发展部恬玉同学的大力帮助。

 

许令波

2014.7

 

你可能感兴趣的:(java,Web)