第1章 深入Web請求過程 1
1.1 B/S網路架構概述 2
基於統一的應用層協議HTTP來互動資料。
1.2 如何發起一個請求 4
HTTP連線本質是建立Socket連線。請求實現方式:工具包如HttpClient、curl+URL、瀏覽器輸入URL回車。
1.3 HTTP協議解析 6
Headers檢視步驟:F12->Network->F5->URL->Headers。
1.3.1 檢視HTTP資訊的工具 8
Firefox--Firebug、F12
1.3.2 瀏覽器快取機制 9
Ctrl+F5組合鍵重新整理,會不使用快取。Request Headers會多Pragma: no-cache,Cache-Control: private變為Cache-Control: no-cache
1.4 DNS域名解析 12
域名解析成IP地址
1.4.1 DNS域名解析過程 12
1.瀏覽器檢查快取中有沒有這個域名解析過的IP地址。
2.作業系統域名解析,Windows在C:\Windows\System32\drivers\etc\hosts,Linux在/etc/hosts,可以指定域名對應IP。(被黑客修改導致域名劫持)
3.傳送給本地區的域名伺服器(Loal DNS),通常是網際網路供應商,如聯通、電信,約80%的域名解析到這裡已經完成。
4.域名伺服器(Root Server)請求解析
5.Root Server返回給LDNS一個所查詢域的主域名伺服器(gTLD Server)地址。gTLD 是國際頂級域名伺服器,如.com、.cn等
6.LDNS再向gTLD傳送請求
7.gTLD返回對應的Name Server域名伺服器的地址,Name Server是你在某個域名服務提供商註冊的域名伺服器。
8.Name Server查詢域名和IP對映關係表,連同TTL(Time To Live)返回給DNS Server
9.LDNS快取域名和IP對應關係和快取的時間
10.結果返回給使用者,使用者根據TTL值快取在本地系統快取中。
1.4.2 跟蹤域名解析過程 15
Linux、Windows下都可以使用nslookup命令查詢域名解析結果;Linux還可以使用dig命令查詢DNS解析過程
1.4.3 清除快取的域名 18
Windows:ipconfig /flushdns
Linux:sudo /etc/init.d/nscd restart
1.4.4 幾種域名解析方式 19
A記錄:Address,指定域名對應的IP地址
MX記錄:Mail Exchange,可以將某個域名下的郵件服務指向到自己的Mail Server
CNAME記錄:Canonical Name,別名解析,為一個域名設定一個或多個別名
NS記錄:為某個域名指定DNS解析伺服器
TXT記錄:為主機或域名設定說明
1.5 CDN工作機制 20
CDN( Content Delivery Network):內容分佈網路,在現有的 Internet中增加一層新的網路架構,將網站的內容釋出到最接近使用者的網路“邊緣”,使使用者可以就近取得所需的內容,提高用戶訪問網站的響應速度。以快取網站中的靜態資料為主
1.5.1 CDN架構 20
1.5.2 負載均衡 21
1.5.3 CDN動態加速 21
在CDN的DNS解析中通過動態的鏈路探測來尋找回源最好的一條路徑,然後通過DNS的排程將所有請求排程到選定的這條路徑上回源,從而加速使用者訪問的效率。
1.6 總結 24
第2章 深入分析Java I/O的工作機制 25
2.1 Java的I/O類庫的基本架構 25
基於位元組操作的IO介面:InputStream 和 OutputStream(傳輸資料的資料格式)
基於字元操作的IO介面:Writer 和 Reader(傳輸資料的資料格式)
基於磁碟操作的IO介面:File(傳輸資料的方式)
基於網路操作的IO介面:Socket(傳輸資料的方式)
2.1.1 基於位元組的I/O操作介面 26
2.1.2 基於字元的I/O操作介面 27
2.1.3 位元組與字元的轉化介面 28
2.2 磁碟I/O工作機制 29
2.2.1 幾種訪問檔案的方式 29
2.2.2 Java訪問磁碟檔案 33
2.2.3 Java序列化技術 34
2.3 網路I/O工作機制 36
2.3.1 TCP狀態轉化 37
2.3.2 影響網路傳輸的因素 39
2.3.3 Java Socket的工作機制 39
2.3.4 建立通訊鏈路 40
2.3.5 資料傳輸 41
2.4 NIO的工作方式 41
2.4.1 BIO帶來的挑戰 41
2.4.2 NIO的工作機制 42
2.4.3 Buffer的工作方式 45
2.4.4 NIO的資料訪問方式 47
2.5 I/O調優 49
2.5.1 磁碟I/O優化 49
2.5.2 TCP網路引數調優 50
2.5.3 網路I/O優化 52
2.6 設計模式解析之介面卡模式 56
2.6.1 介面卡模式的結構 56
2.6.2 Java I/O中的介面卡模式 57
2.7 設計模式解析之裝飾器模式 57
2.7.1 裝飾器模式的結構 58
2.7.2 Java I/O中的裝飾器模式 58
2.8 介面卡模式與裝飾器模式的區別 59
2.9 總結 59
第3章 深入分析Java Web中的中文編碼問題 60
3.1 幾種常見的編碼格式 60
3.1.1 為什麼要編碼 60
3.1.2 如何“翻譯” 61
3.2 Java中需要編碼的場景 63
3.2.1 I/O操作中存在的編碼 63
3.2.2 記憶體操作中的編碼 65
3.3 Java中如何編解碼 66
3.3.1 按照ISO-8859-1編碼 68
3.3.2 按照GB2312編碼 69
3.3.3 按照GBK編碼 70
3.3.4 按照UTF-16編碼 70
3.3.5 按照UTF-8編碼 71
3.3.6 UTF-8編碼程式碼片段 71
3.3.7 幾種編碼格式的比較 73
3.4 Java Web中涉及的編解碼 73
3.4.1 URL的編解碼 75
3.4.2 HTTP Header的編解碼 78
3.4.3 POST表單的編解碼 78
3.4.4 HTTP BODY的編解碼 79
3.5 JS中的編碼問題 80
3.5.1 外部引入JS檔案 80
3.5.2 JS的URL編碼 81
3.5.3 其他需要編碼的地方 83
3.6 常見問題分析 83
3.6.1 中文變成了看不懂的字元 83
3.6.2 一個漢字變成一個問號 84
3.6.3 一個漢字變成兩個問號 84
3.6.4 一種不正常的正確編碼 85
3.7 總結 86
第4章 Javac編譯原理 87
4.1 Javac是什麼 88
4.2 Javac編譯器的基本結構 88
4.3 Javac工作原理分析 90
4.3.1 詞法分析器 91
4.3.2 語法分析器 98
4.3.3 語義分析器 103
4.3.4 程式碼生成器 113
4.4 設計模式解析之訪問者模式 116
4.4.1 訪問者模式的結構 117
4.4.2 Javac中訪問者模式的實現 118
4.5 總結 119
第5章 深入class檔案結構 120
5.1 JVM指令集簡介 120
5.1.1 類相關的指令 122
5.1.2 方法的定義 123
5.1.3 屬性的定義 124
5.1.4 其他指令集 125
5.2 class檔案頭的表示形式 133
5.3 常量池 137
5.3.1 UTF8常量型別 140
5.3.2 Fieldref、Methodref常量型別 141
5.3.3 Class常量型別 141
5.3.4 NameAndType常量型別 142
5.4 類資訊 142
5.5 Fields和Methods定義 143
5.6 類屬性描述 147
5.7 Javap生成的class檔案結構 148
5.7.1 LineNumberTable 150
5.7.2 LocalVariableTable 151
5.8 總結 153
第6章 深入分析ClassLoader 工作機制 154
6.1 ClassLoader類結構分析 155
6.2 ClassLoader的等級載入機制 156
6.3 如何載入class檔案 159
6.3.1 載入位元組碼到記憶體 159
6.3.2 驗證與解析 161
6.3.3 初始化Class物件 161
6.4 常見載入類錯誤分析 161
6.4.1 ClassNotFoundException 161
6.4.2 NoClassDefFoundError 162
6.4.3 UnsatisfiedLinkError 163
6.4.4 ClassCastException 164
6.4.5 ExceptionInInitializerError 165
6.5 常用的ClassLoader分析 166
6.6 如何實現自己的ClassLoader 170
6.6.1 載入自定義路徑下的class檔案 170
6.6.2 載入自定義格式的class檔案 172
6.7 實現類的熱部署 174
6.8 Java應不應該動態載入類 176
6.9 總結 177
第7章 JVM體系結構與工作方式 178
7.1 JVM體系結構 178
7.1.1 何謂JVM 178
7.1.2 JVM體系結構詳解 181
7.2 JVM工作機制 183
7.2.1 機器如何執行程式碼 183
7.2.2 JVM為何選擇基於棧的架構 184
7.2.3 執行引擎的架構設計 185
7.2.4 執行引擎的執行過程 186
7.2.5 JVM方法呼叫棧 191
7.3 總結 195
第8章 JVM記憶體管理 196
8.1 實體記憶體與虛擬記憶體 197
8.2 核心空間與使用者空間 198
8.3 Java中哪些元件需要使用記憶體 199
8.3.1 Java堆 199
8.3.2 執行緒 199
8.3.3 類和類載入器 200
8.3.4 NIO 200
8.3.5 JNI 201
8.4 JVM記憶體結構 201
8.4.1 PC暫存器 202
8.4.2 Java棧 202
8.4.3 堆 203
8.4.4 方法區 203
8.4.5 執行時常量池 204
8.4.6 本地方法棧 204
8.5 JVM記憶體分配策略 204
8.5.1 通常的記憶體分配策略 205
8.5.2 Java中記憶體分配詳解 205
8.6 JVM記憶體回收策略 210
8.6.1 靜態記憶體分配和回收 210
8.6.2 動態記憶體分配和回收 211
8.6.3 如何檢測垃圾 211
8.6.4 基於分代的垃圾收集演算法 213
8.7 記憶體問題分析 222
8.7.1 GC日誌分析 222
8.7.2 堆快照檔案分析 225
8.7.3 JVM Crash日誌分析 225
8.8 例項1 231
8.9 例項2 233
8.10 例項3 235
8.11 總結 240
第9章 Servlet工作原理解析 241
9.1 從Servlet容器說起 241
9.1.1 Servlet容器的啟動過程 242
9.1.2 Web應用的初始化工作 245
9.2 建立Servlet例項 247
9.2.1 建立Servlet物件 248
9.2.2 初始化Servlet 248
9.3 Servlet體系結構 250
9.4 Servlet如何工作 253
9.5 Servlet中的Listener 255
9.6 Filter如何工作 257
9.7 Servlet中的url-pattern 259
9.8 總結 260
第10章 深入理解Session與Cookie 261
10.1 理解Cookie 262
10.1.1 Cookie屬性項 262
10.1.2 Cookie如何工作 263
10.1.3 使用Cookie的限制 266
10.2 理解Session 267
10.2.1 Session與Cookie 267
10.2.2 Session如何工作 268
10.3 Cookie安全問題 271
10.4 分散式Session框架 272
10.4.1 存在哪些問題 272
10.4.2 可以解決哪些問題 273
10.4.3 總體實現思路 273
10.5 Cookie壓縮 278
10.6 表單重複提交問題 280
10.7 總結 281
第11章 Tomcat的系統架構與 設計模式 282
11.1 Tomcat總體設計 282
11.1.1 Tomcat總體結構 283
11.1.2 Connector元件 289
11.1.3 Servlet容器Container 294
11.1.4 Tomcat中的其他元件 305
11.2 Tomcat中的設計模式 305
11.2.1 門面設計模式 305
11.2.2 觀察者設計模式 307
11.2.3 命令設計模式 309
11.2.4 責任鏈設計模式 310
11.3 總結 312
第12章 Jetty的工作原理解析 313
12.1 Jetty的基本架構 313
12.1.1 Jetty的基本架構簡介 313
12.1.2 Handler的體系結構 315
12.2 Jetty的啟動過程 316
12.3 接受請求 317
12.3.1 基於HTTP協議工作 317
12.3.2 基於AJP工作 319
12.3.3 基於NIO方式工作 322
12.4 處理請求 323
12.5 與Jboss整合 326
12.6 與Tomcat的比較 327
12.6.1 架構比較 327
12.6.2 效能比較 328
12.6.3 特性比較 328
12.7 總結 329
第13章 Spring框架的設計理念與 設計模式分析 330
13.1 Spring的骨骼架構 330
13.1.1 Spring的設計理念 331
13.1.2 核心元件如何協同工作 332
13.2 核心元件詳解 333
13.2.1 Bean元件 333
13.2.2 Context元件 335
13.2.3 Core元件 336
13.2.4 Ioc容器如何工作 338
13.3 Spring中AOP特性詳解 348
13.3.1 動態代理的實現原理 348
13.3.2 Spring AOP如何實現 351
13.4 設計模式解析之代理模式 354
13.4.1 代理模式原理 354
13.4.2 Spring中代理模式的實現 354
13.5 設計模式解析之策略模式 357
13.5.1 策略模式原理 357
13.5.2 Spring中策略模式的實現 358
13.6 總結 358
第14章 Spring MVC工作機制與 設計模式 360
14.1 Spring MVC的總體設計 360
14.2 Control設計 365
14.2.1 HandlerMapping初始化 366
14.2.2 HandlerAdapter初始化 368
14.2.3 Control的呼叫邏輯 369
14.3 Model設計 370
14.4 View設計 371
14.5 框架設計的思考 373
14.5.1 為什麼需要框架 373
14.5.2 需要什麼樣的框架 373
14.5.3 框架設計的原則 374
14.5.4 “指航燈” 374
14.5.5 最基本的原則 374
14.6 設計模式解析之模板模式 375
14.6.1 模板模式的結構 375
14.6.2 Spring MVC中的模板模式示例 376
14.7 總結 377
第15章 深入分析Ibatis框架之系統 架構與對映原理 378
15.1 Ibatis框架主要的類層次結構 378
15.2 Ibatis框架的設計策略 379
15.3 Ibatis框架的執行原理 381
15.4 示例 383
15.5 Ibatis對SQL語句的解析 385
15.6 資料庫欄位對映到Java物件 386
15.7 示例執行的結果 388
15.8 設計模式解析之簡單工廠模式 388
15.8.1 簡單工廠模式的實現原理 388
15.8.2 Ibatis中的簡單工廠模式示例 389
15.9 設計模式解析之工廠模式 390
15.9.1 工廠模式的實現原理 390
15.9.2 Ibatis中的工廠模式示例 391
15.10 總結 392
第16章 Velocity工作原理解析 394
16.1 Velocity總體架構 395
16.2 JJTree渲染過程解析 398
16.2.1 #set語法 402
16.2.2 Velocity的方法呼叫 403
16.2.3 #if、#elseif和#else語法 406
16.2.4 #foreach語法 407
16.2.5 #parse語法 409
16.3 事件處理機制 410
16.4 常用優化技巧 413
16.4.1 減少樹的總節點數量 413
16.4.2 減少渲染耗時的節點數量 413
16.5 與JSP比較 414
16.5.1 JSP渲染機制 414
16.5.2 Velocity與JSP 420
16.6 設計模式解析之合成模式 420
16.6.1 合成模式的結構 420
16.6.2 Velocity中合成模式的實現 421
16.7 設計模式解析之直譯器模式 422
16.7.1 直譯器模式的結構 422
16.7.2 Velocity中直譯器模式的實現 423
16.8 總結 423
第17章 Velocity優化實踐 424
17.1 現實存在的問題 424
17.2 優化的理論基礎 425
17.2.1 程式語言的三角形結構 425
17.2.2 資料結構減少抽象化 426
17.2.3 簡單的程式複雜化 426
17.2.4 減少翻譯的代價 427
17.2.5 變的轉化為不變 427
17.3 一個高效的模板引擎的實現思路 427
17.3.1 vm模板如何被編譯 429
17.3.2 方法呼叫的無反射優化 436
17.3.3 字元輸出改成位元組輸出 439
17.4 優化的成果 440
17.4.1 char轉成byte 440
17.4.2 無反射執行 441
17.5 其他優化手段 442
17.6 總結 442