深入分析Java Web技術內幕(修訂版)

broadviewbj發表於2014-08-15

阿里巴巴集團技術叢書

深入分析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  深入理解SessionCookie 263

10.1  理解Cookie 264

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開發的整個過程有個總體的理解。

本書雖然講解的都是比較深入的技術,但是有關實踐的示例和比較恰當的比喻將幫你更好地理解。

本書將結合淘寶網中真實使用的示例應用程式來講解技術,讓讀者有更好的直觀認識。

讀者討論

由於作者水平有限,書中難免有錯誤之處。在本書出版後的任何時間,若你對本書有任何問題,你都可以透過xulingbo0201@163.com傳送郵件給我,或者到上向我提交你的建議和想法,我會對所有問題給予回覆。

致謝

感謝我的父母,在我高考失敗後仍然給我機會讓我選擇做自己想做的事,支援我選擇了自己喜歡的計算機行業,並在家庭並不富裕的情況下給我配置了第1臺計算機,讓我有機會繼續追求自己的夢想,是你們的支援和鼓勵讓我在做自己一直喜歡做的事。

感謝我的老婆,從大學你就一直陪伴在我身邊,有你在我身邊是我不斷努力的最大動力,在本書的寫作過程中,你完成初稿的審閱工作,同時也給了我很多鼓勵和建議。

感謝電子工業出版社的劉皎和張國霞編輯,你們嚴謹認真的工作態度讓我非常敬佩。

感謝吳澤明(範禹)老大為本書寫序,你不僅帶我進入淘寶,而且一直幫助我持續進步。感謝王保平、林昊和劉達在繁忙的工作中為我寫推薦語。

感謝在本書寫作過程中提出寶貴意見的同事們,他們的花名是:小凡、小邪、丹臣、哲別、景升、文通、向飛、凌棄、路奇、濟城、大仁、常彬、旭天、韓章、小賭、雁聲、索尼、鳳豪、柳擎、華黎、空望、嗷嗷、漸飛、普智、勝衣、叔度、文景、撒迦、狄龍、祝幽、單通、承澤等。

感謝developerWorks上所有向我提出問題和建議的網友們。

 

 

許令波

20127

 

再版序

自《深入分析Java Web技術內幕》一書出版以來,我收到了不少讀者的反饋,也很感謝他們指出了書中的一些錯誤和不足。時隔兩年,在電子工業出版社博文視點編輯的幫助下,《深入分析Java Web技術內幕》有了修訂再版的機會。

這兩年來,一些技術也在發生著變化:無線技術越來越成熟,我們的系統開始更多地支援無線,並衍生出系統要進行多終端化改造等問題;同時我們也遇到了一些新的技術問題如大流量、網路瓶頸及機房的電力短缺等,這給系統的部署和系統架構帶來新的挑戰。所以我借這次再版的機會,將這方面的技術更新和實踐嘗試一併分享給讀者。除了修正前版的一些錯漏之處,本次修訂還主要做了以下更新。

1章增加了CDN動態加速的內容,介紹了我們當前最新的想法和嘗試。

3章增加一種繁簡轉換的實現方式的內容,介紹了我們在遇到多終端的情況下面臨的多語言的問題,將我們的思路和實踐分享給大家。

10章增加了多終端Session統一的內容,也介紹了在多終端的情況下如何解決Session統一的問題。

新增了第18章,重點介紹了我們在近兩年遇到大流量的情況下,如何跨越效能、網路和一個地區的電力瓶頸等問題,並提供了一個比較完整的解決方案。

感謝劉皎和張國霞兩位編輯,感謝阿里巴巴的幾位大牛範禹、黃眉等對修訂版提供的一些有益建議,也感謝我們技術發展部恬玉同學的大力幫助。

 

許令波

2014.7

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/13164110/viewspace-1251884/,如需轉載,請註明出處,否則將追究法律責任。

相關文章