《深刻分析Java Web技術內幕》讀書筆記 - 第1章 深刻Web請求過程

第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 

相關文章
相關標籤/搜索