出版時間:2012-9 出版社:電子工業(yè)出版社 作者:許令波
Tag標簽:無
內(nèi)容概要
《深入分析Java Web技術(shù)內(nèi)幕》圍繞Java Web相關(guān)技術(shù)從三方面全面深入地進行闡述。首先介紹前端知識,主要介紹Java Web開發(fā)中涉及的一些基本知識,包括Web請求過程、HTTP協(xié)議、DNS技術(shù)和CDN技術(shù)。其次深入介紹Java技術(shù),包括I/O技術(shù)、中文編碼問題、Javac編譯原理、class文件結(jié)構(gòu)解析、ClassLoader工作機制及JVM的內(nèi)存管理等。最后介紹Java服務端技術(shù),主要包括Servlet、Session與Cookie、Tomcat與Jetty服務器、Spring容器、Ibatis框架和Velocity框架等原理介紹。本書不僅介紹這些技術(shù)和框架的工作原理,而且結(jié)合示例來講解,通過通俗易懂的文字和豐富生動的配圖,讓讀者充分并深入理解它們的內(nèi)部工作原理,同時還結(jié)合了設計模式來介紹這些技術(shù)背后的架構(gòu)思維。
作者簡介
許令波,畢業(yè)于合肥工業(yè)大學,獲計算機碩士學位。熱愛Java Web技術(shù),關(guān)注服務端性能優(yōu)化,熱衷開源技術(shù)的研究和分享,曲獲developerWorks最佳作者稱號。2009年進入淘寶工作,目前從事模板渲染框架與MVC框架的開發(fā)與應用、Java Web的性能優(yōu)化、高訪問量系統(tǒng)靜態(tài)化和商品詳情系統(tǒng)的業(yè)務改造等工作。
書籍目錄
第1章 深入Web請求過程1 1.1 B/S網(wǎng)絡架構(gòu)概述2 1.2 如何發(fā)起一個請求4 1.3 HTTP協(xié)議解析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架構(gòu)20 1.5.2 負載均衡21 1.6 總結(jié)24 第2章 深入分析JavaI/O的工作機制25 2.1 Java的I/O類庫的基本架構(gòu)25 2.1.1 基于字節(jié)的I/O操作接口26 2.1.2 基于字符的I/O操作接口27 2.1.3 字節(jié)與字符的轉(zhuǎn)化接口28 2.2 磁盤I/O工作機制29 2.2.1 幾種訪問文件的方式29 2.2.2 Java訪問磁盤文件33 2.2.3 Java序列化技術(shù)34 2.3 網(wǎng)絡I/O工作機制36 2.3.1 TCP狀態(tài)轉(zhuǎn)化37 2.3.2 影響網(wǎng)絡傳輸?shù)囊蛩?9 2.3.3 JavaSocket的工作機制39 2.3.4 建立通信鏈路40 2.3.5 數(shù)據(jù)傳輸41 2.4 NIO的工作方式41 2.4.1 BIO帶來的挑戰(zhàn)41 2.4.2 NIO的工作機制42 2.4.3 Buffer的工作方式45 2.4.4 NIO的數(shù)據(jù)訪問方式47 2.5 I/O調(diào)優(yōu)49 2.5.1 磁盤I/O優(yōu)化49 2.5.2 TCP網(wǎng)絡參數(shù)調(diào)優(yōu)50 2.5.3 網(wǎng)絡I/O優(yōu)化52 2.6 設計模式解析之適配器模式56 2.6.1 適配器模式的結(jié)構(gòu)56 2.6.2 JavaI/O中的適配器模式57 2.7 設計模式解析之裝飾器模式57 2.7.1 裝飾器模式的結(jié)構(gòu)58 2.7.2 JavaI/O中的裝飾器模式58 2.8 適配器模式與裝飾器模式的區(qū)別59 2.9 總結(jié)59 第3章 深入分析JavaWeb中的中文編碼問題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 內(nèi)存操作中的編碼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 JavaWeb中涉及的編解碼73 3.4.1 URL的編解碼75 3.4.2 HTTPHeader的編解碼78 3.4.3 POST表單的編解碼78 3.4.4 HTTPBODY的編解碼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 總結(jié)86 第4章 Javac編譯原理87 4.1 Javac是什么88 4.2 Javac編譯器的基本結(jié)構(gòu)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 訪問者模式的結(jié)構(gòu)117 4.4.2 Javac中訪問者模式的實現(xiàn)118 4.5 總結(jié)119 第5章 深入class文件結(jié)構(gòu)120 5.1 JVM指令集簡介120 5.1.1 類相關(guān)的指令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文件結(jié)構(gòu)148 5.7.1 LineNumberTable150 5.7.2 LocalVariableTable151 5.8 總結(jié)153 第6章 深入分析ClassLoader工作機制154 6.1 ClassLoader類結(jié)構(gòu)分析155 6.2 ClassLoader的等級加載機制156 6.3 如何加載class文件159 6.3.1 加載字節(jié)碼到內(nèi)存159 6.3.2 驗證與解析161 6.3.3 初始化Class對象161 6.4 常見加載類錯誤分析161 6.4.1 ClassNotFoundException161 6.4.2 NoClassDefFoundError162 6.4.3 UnsatisfiedLinkError163 6.4.4 ClassCastException164 6.4.5 ExceptionInInitializerError165 6.5 常用的ClassLoader分析166 6.6 如何實現(xiàn)自己的ClassLoader170 6.6.1 加載自定義路徑下的class文件170 6.6.2 加載自定義格式的class文件172 6.7 實現(xiàn)類的熱部署174 6.8 Java應不應該動態(tài)加載類176 6.9 總結(jié)177 第7章 JVM體系結(jié)構(gòu)與工作方式178 7.1 JVM體系結(jié)構(gòu)178 7.1.1 何謂JVM178 7.1.2 JVM體系結(jié)構(gòu)詳解181 7.2 JVM工作機制183 7.2.1 機器如何執(zhí)行代碼183 7.2.2 JVM為何選擇基于棧的架構(gòu)184 7.2.3 執(zhí)行引擎的架構(gòu)設計185 7.2.4 執(zhí)行引擎的執(zhí)行過程186 7.2.5 JVM方法調(diào)用棧191 7.3 總結(jié)195 第8章 JVM內(nèi)存管理196 8.1 物理內(nèi)存與虛擬內(nèi)存197 8.2 內(nèi)核空間與用戶空間198 8.3 Java中哪些組件需要使用內(nèi)存199 8.3.1 Java堆199 8.3.2 線程199 8.3.3 類和類加載器200 8.3.4 NIO200 8.3.5 JNI201 8.4 JVM內(nèi)存結(jié)構(gòu)201 8.4.1 PC寄存器202 8.4.2 Java棧202 8.4.3 堆203 8.4.4 方法區(qū)203 8.4.5 運行時常量池204 8.4.6 本地方法棧204 8.5 JVM內(nèi)存分配策略204 8.5.1 通常的內(nèi)存分配策略205 8.5.2 Java中內(nèi)存分配詳解205 8.6 JVM內(nèi)存回收策略210 8.6.1 靜態(tài)內(nèi)存分配和回收210 8.6.2 動態(tài)內(nèi)存分配和回收211 8.6.3 如何檢測垃圾211 8.6.4 基于分代的垃圾收集算法213 8.7 內(nèi)存問題分析222 8.7.1 GC日志分析222 8.7.2 堆快照文件分析225 8.7.3 JVMCrash日志分析225 8.8 實例1231 8.9 實例2233 8.10 實例3235 8.11 總結(jié)240 第9章 Servlet工作原理解析241 9.1 從Servlet容器說起241 9.1.1 Servlet容器的啟動過程242 9.1.2 Web應用的初始化工作245 9.2 創(chuàng)建Servlet實例247 9.2.1 創(chuàng)建Servlet對象248 9.2.2 初始化Servlet248 9.3 Servlet體系結(jié)構(gòu)250 9.4 Servlet如何工作253 9.5 Servlet中的Listener255 9.6 Filter如何工作257 9.7 Servlet中的url—pattern259 9.8 總結(jié)260 第10章 深入理解Session與Cookie261 10.1 理解Cookie262 10.1.1 Cookie屬性項262 10.1.2 Cookie如何工作263 10.1.3 使用Cookie的限制266 10.2 理解Session267 10.2.1 Session與Cookie267 10.2.2 Session如何工作268 10.3 Cookie安全問題271 10.4 分布式Session框架272 10.4.1 存在哪些問題272 10.4.2 可以解決哪些問題273 10.4.3 總體實現(xiàn)思路273 10.5 Cookie壓縮278 10.6 表單重復提交問題280 10.7 總結(jié)281 第11章 Tomcat的系統(tǒng)架構(gòu)與設計模式282 11.1 Tomcat總體設計282 11.1.1 Tomcat總體結(jié)構(gòu)283 11.1.2 Connector組件289 11.1.3 Servlet容器Container294 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 總結(jié)312 第12章 Jetty的工作原理解析313 12.1 Jetty的基本架構(gòu)313 12.1.1 Jetty的基本架構(gòu)簡介313 12.1.2 Handler的體系結(jié)構(gòu)315 12.2 Jetty的啟動過程316 12.3 接受請求317 12.3.1 基于HTTP協(xié)議工作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 架構(gòu)比較327 12.6.2 性能比較328 12.6.3 特性比較328 12.7 總結(jié)329 第13章 Spring框架的設計理念與設計模式分析330 13.1 Spring的骨骼架構(gòu)330 13.1.1 Spring的設計理念331 13.1.2 核心組件如何協(xié)同工作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 動態(tài)代理的實現(xiàn)原理348 13.3.2 SpringAOP如何實現(xiàn)351 13.4 設計模式解析之代理模式354 13.4.1 代理模式原理354 13.4.2 Spring中代理模式的實現(xiàn)354 13.5 設計模式解析之策略模式357 13.5.1 策略模式原理357 13.5.2 Spring中策略模式的實現(xiàn)358 13.6 總結(jié)358 第14章 SpringMVC工作機制與設計模式360 14.1 SpringMVC的總體設計360 14.2 Control設計365 14.2.1 HandlerMapping初始化366 14.2.2 HandlerAdapter初始化368 14.2.3 Control的調(diào)用邏輯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 模板模式的結(jié)構(gòu)375 14.6.2 SpringMVC中的模板模式示例376 14.7 總結(jié)377 第15章 深入分析Ibatis框架之系統(tǒng)架構(gòu)與映射原理378 15.1 Ibatis框架主要的類層次結(jié)構(gòu)378 15.2 Ibatis框架的設計策略379 15.3 Ibatis框架的運行原理381 15.4 示例383 15.5 Ibatis對SQL語句的解析385 15.6 數(shù)據(jù)庫字段映射到Java對象386 15.7 示例運行的結(jié)果388 15.8 設計模式解析之簡單工廠模式388 15.8.1 簡單工廠模式的實現(xiàn)原理388 15.8.2 Ibatis中的簡單工廠模式示例389 15.9 設計模式解析之工廠模式390 15.9.1 工廠模式的實現(xiàn)原理390 15.9.2 Ibatis中的工廠模式示例391 15.10 總結(jié)392 第16章 Velocity工作原理解析394 16.1 Velocity總體架構(gòu)395 16.2 JJTree渲染過程解析398 16.2.1 #set語法402 16.2.2 Velocity的方法調(diào)用403 16.2.3 #if、#elseif和#else語法406 16.2.4 #foreach語法407 16.2.5 #parse語法409 16.3 事件處理機制410 16.4 常用優(yōu)化技巧413 16.4.1 減少樹的總節(jié)點數(shù)量413 16.4.2 減少渲染耗時的節(jié)點數(shù)量413 16.5 與JSP比較414 16.5.1 JSP渲染機制414 16.5.2 Velocity與JSP420 16.6 設計模式解析之合成模式420 16.6.1 合成模式的結(jié)構(gòu)420 16.6.2 Velocity中合成模式的實現(xiàn)421 16.7 設計模式解析之解釋器模式422 16.7.1 解釋器模式的結(jié)構(gòu)422 16.7.2 Velocity中解釋器模式的實現(xiàn)423 16.8 總結(jié)423 第17章 Velocity優(yōu)化實踐424 17.1 現(xiàn)實存在的問題424 17.2 優(yōu)化的理論基礎425 17.2.1 程序語言的三角形結(jié)構(gòu)425 17.2.2 數(shù)據(jù)結(jié)構(gòu)減少抽象化426 17.2.3 簡單的程序復雜化426 17.2.4 減少翻譯的代價427 17.2.5 變的轉(zhuǎn)化為不變427 17.3 一個高效的模板引擎的實現(xiàn)思路427 17.3.1 vm模板如何被編譯429 17.3.2 方法調(diào)用的無反射優(yōu)化436 17.3.3 字符輸出改成字節(jié)輸出439 17.4 優(yōu)化的成果440 17.4.1 char轉(zhuǎn)成byte440 17.4.2 無反射執(zhí)行441 17.5 其他優(yōu)化手段442 17.6 總結(jié)442
章節(jié)摘錄
版權(quán)頁: 插圖: 1.類加載器 在深入分析ClassLoader時我們詳細分析了ClassLoader的工作機制,這里需要說明的是,每一個被JVM裝載的類型都有一個對應的java.lang.Class類的實例來表示該類型,該實例可以唯一表示被JVM裝載的class類,要求這個實例和其他類實例一樣都存放在Java的堆中。 2.執(zhí)行引擎 執(zhí)行引擎是JVM的核心部分,執(zhí)行引擎的作用就是解析JVM字節(jié)碼指令,得到執(zhí)行結(jié)果。在《Java虛擬機規(guī)范》中詳細地定義了執(zhí)行引擎遇到每條字節(jié)碼指令時應該處理什么,并且應該得到什么結(jié)果。但是并沒有規(guī)定執(zhí)行引擎應該如何或采取什么方式處理而得到這個結(jié)果。因為執(zhí)行引擎具體采取什么方式由JVM的實現(xiàn)廠家自己去實現(xiàn),是直接解釋執(zhí)行還是采用JIT技術(shù)轉(zhuǎn)成本地代碼去執(zhí)行,還是采用寄存器這個芯片模式去執(zhí)行都可以。所以執(zhí)行引擎的具體實現(xiàn)有很大的發(fā)揮空間,如SUN的hotspot是基于棧的執(zhí)行引擎,而Google的Dalvik是基于寄存器的執(zhí)行引擎。 執(zhí)行引擎也就是執(zhí)行一條條代碼的一個流程,而代碼都是包含在方法體內(nèi)的,所以執(zhí)行引擎本質(zhì)上就是執(zhí)行一個個方法所串起來的流程,對應到操作系統(tǒng)中一個執(zhí)行流程是一個Java進程還是一個Java線程呢?很顯然是后者,因為一個Java進程可以有多個同時執(zhí)行的執(zhí)行流程。這樣說來每一個Java線程就是一個執(zhí)行引擎的實例,那么一個JVM實例中就會同時有多個執(zhí)行引擎在工作,這些執(zhí)行引擎有的在執(zhí)行用戶的程序,而有的在執(zhí)行JVM內(nèi)部的程序(如Java垃圾收集器)。 3.Java內(nèi)存管理 執(zhí)行引擎在執(zhí)行一段程序時需要存儲一些東西,如操作碼需要的操作數(shù),操作碼的執(zhí)行結(jié)果需要保存。class類的字節(jié)碼還有類的對象等這些信息都需要在執(zhí)行引擎執(zhí)行之前就準備好。從圖7—2中可以看出一個JVM實例會有一個方法區(qū)、Java堆、Java棧、PC寄存器和本地方法區(qū)。其中方法區(qū)和Java堆是所有線程共享的,也就是可以被所有的執(zhí)行引擎實例訪問。每一個新的執(zhí)行引擎實例被創(chuàng)建時會為這個執(zhí)行引擎創(chuàng)建一個Java棧和一個PC寄存器,如果當前正在執(zhí)行一個Java方法,那么當前的這個Java棧中保存的是該線程中方法調(diào)用的狀態(tài),包括方法的參數(shù)、方法的局部變量、方法的返回值以及運算的中間結(jié)果等。而PC寄存器會指向即將執(zhí)行的下一條指令。
編輯推薦
《深入分析Java Web技術(shù)內(nèi)幕》不僅介紹這些技術(shù)和框架的工作原理,而且結(jié)合示例來講解,通過通俗易懂的文字和豐富生動的配圖,讓讀者充分并深入理解它們的內(nèi)部工作原理,同時還結(jié)合了設計模式來介紹這些技術(shù)背后的架構(gòu)思維。
名人推薦
這是一本有關(guān)Java的書,里面講述的大量基礎知識對前端開發(fā)工程師也非常有幫助。比如中文編碼章節(jié),作者以一個實踐者的身份詳細闡述了編碼問題的方方面面??傊?,這是一本用心的書,是實踐者的思考和總結(jié)。國內(nèi)目前很少看到這類書籍,強烈推薦從事Web開發(fā)工作的人員購買閱讀并實踐之。 ——王保平,開源前端類庫KISSY、SeaJS作者 作者在淘寶做了很:多Java Web方面的改造項目,在Java Web的相關(guān)技術(shù)上有深入的掌握,并積累了豐富的經(jīng)驗。在這本書中作者不僅向讀者展示了這類大改造項目所需的知識。還展示了Java Web更為全景的技術(shù)知識體系,值得Java Web開發(fā)人員閱讀。 ——林昊,淘寶資探深技術(shù)專家、China OSGi User Group總監(jiān) 從第一次拜讀相關(guān)內(nèi)容開始,就可以感覺到作者并不是簡簡單單地講述一個技術(shù)或者概念,他的分析和講解十分深入,并且可以很好地聚焦讀者的思路,尤其是在Java Web、Servlet規(guī)范及字符串處理方面,都有很優(yōu)秀的內(nèi)容。在眾多向developerWorks投稿的國內(nèi)作者中,無論從文章的質(zhì)量看,還是從內(nèi)容的選題方向看,作者的文章都可稱是上乘之作。同時,他的多篇文章還得到了廣大網(wǎng)站讀者的好評,其訪問量、評分及評論的數(shù)量均名列前茅。 ——劉達
圖書封面
圖書標簽Tags
無
評論、評分、閱讀與下載
深入分析Java Web技術(shù)內(nèi)幕 PDF格式下載