目錄
第1章 概述 1
1.1 閱讀順序 2
1.2 本書縱覽 2
1.3 導引 2
1.4 讀者對象 3
1.5 進一步的資源 4
1.6 升級到Spring的新版本 5
1.7 本章小結 6
第2章spring框架7
2.1 控制反轉 7
2.1.1 控制反轉實例 7
2.1.2 小結 10
2.2 依賴注入 10
2.2.1 Service Locator模式 12
2.2.2 依賴注入 13
2.3 Spring的ApplicationContext15
2.4 POJO歸來 16
2.5 對Web應用程式的影響 17
2.6 本章小結 17
第3章 Spring MVC應用程式架構 18
3.1 抽象層 18
3.1.1 層隔離 19
3.1.2java接口作為層的約定 20
3.1.3 Spring MVC應用程式中的層 21
3.2 選擇:條條大路通羅馬 32
3.3 本章小結 33
第4章 Spring MVC初體驗 34
4.1 用例 34
4.1.1 服務接口 34
4.1.2 用例1 35
4.1.3 用例2 37
4.1.4 小結 42
4.2 Web組件 42
4.2.1 JAR依賴 42
4.2.2 Controller類 43
4.2.3 View類 44
4.2.4 ModelAndView類 44
4.3 構建主頁用例 44
4.3.1 Spring MVC 組件 44
4.3.2 Web應用程式配置 49
4.3.3 啟動應用程式 52
4.3.4 請求處理順序 53
4.3.5 小結 54
4.4 構建航班搜尋用例 55
4.4.1 SimpleFormController 55
4.4.2 SearchFlightsController 56
4.4.3 表單視圖 59
4.4.4 Spring JSP標籤 61
4.4.5 成功視圖 62
4.4.6 小結 63
4.5 整裝待發 64
第5章 處理管道 65
5.1 處理請求 65
5.1.1 請求工作流 65
5.1.2 功能概覽 65
5.1.3 處理請求的各組件 67
5.2 本章小結 97
第6章 深入解析Controller 98
6.1 概述 98
6.2 Controller接口和實現 99
6.2.1 設計初探 99
6.2.2 AbstractController 100
6.2.3 BaseCommandController 104
6.2.4 綁定表單到bean 105
6.2.5 SimpleFormController和處理表單 128
6.2.6redirectAfter Submit模式 142
6.2.7 MultiActionController 145
6.2.8 AbstractWizardFormController 153
6.2.9 ThrowawayController 168
6.2.10 ValidatableThrowaway-Controller 170
6.3 HandlerInterceptor 171
6.3.1 HandlerInterceptor示例 172
6.3.2 小結 173
6.4 本章小結 173
第7章 視圖層 175
7.1 視圖中包含什麼 175
7.2 Spring的視圖接口 176
7.2.1 實現視圖 177
7.2.2 View和Controller:愉快的分離 180
7.3 ViewResolver 181
7.3.1 在上下文中解析視圖 182
7.3.2 ViewResolver的類型 183
7.3.3 使Dispatcher知道ViewResolver 186
7.4 重定向簡述 187
7.5 主題 188
7.5.1 ThemeSource 189
7.5.2 ThemeResolver 190
7.6 視圖層的國際化 190
7.6.1 區域解析 191
7.6.2 MessageSource Bean 191
7.6.3 視圖解析 192
7.6.4 主題解析 192
7.7 綁定支持 193
7.7.1 綁定和驗證順序的概述 193
7.7.2 視圖模板的綁定支持 193
7.8 本章小結 193
第8章 受支持的視圖類型 194
8.1 JSP和JSTL 194
8.1.1 模型暴露為請求屬性 195
8.1.2 展示模型 196
8.1.3 JSP標籤庫 197
8.1.4 表單 198
8.2 Tiles 202
8.3 Velocity和freemarker204
8.3.1 模板的優點和缺點 205
8.3.2 模板引擎的基本配置 205
8.3.3 暴露模型 206
8.3.4 模板語言 207
8.3.5 高級配置選項 208
8.3.6 表單和SpringBind宏 209
8.3.7 數字和日期工具 215
8.3.8 附加的Velocity視圖 216
8.3.9 小結 216
8.4 XML和XSLT 217
8.4.1 定義XSLT視圖 217
8.4.2 轉化XML原始碼 219
8.4.3 返回原始狀態的XML 220
8.4.4 XSLT的其他顯著功能 221
8.4.5 小結 222
8.5 PDF 222
8.5.1 配置應用程式以使用PDF視圖 223
8.5.2 用FOP創建模板PDF 224
8.6 Excel 224
8.6.1 創建模板 224
8.6.2 編程 225
8.6.3 配置應用程式 225
8.7JasperReports226
8.7.1 多種形式的視圖 227
8.7.2 填充報表 228
8.7.3 小結 229
8.8 創建新視圖 229
8.9 本章小結 229
第9章 驗證 230
9.1 編程式Validator 230
9.2 聲明式Validator 231
9.3訊息源241
9.4 Validator和業務邏輯 242
9.5 Errors接口 243
9.6 測試驗證器 244
9.7 本章小結 245
第10章 測試Spring MVC應用程式 246
10.1 概覽 246
10.1.1 單元測試 246
10.1.2 單元測試小結 262
10.1.3 集成測試 263
10.2 測試小結 267
第11章Spring Web Flow入門 268
11.1 Spring Web Flow的動機 268
11.1.1 servlet規範的問題 268
11.1.2 解決方案 270
11.2 不是萬能鑰匙 272
11.3 總覽 272
11.3.1 架構概覽 272
11.3.2 Spring Web Flow系統內部 273
11.3.3 不同的作用域 273
11.3.4 組成 274
11.4 第一個流 276
11.4.1 安裝Spring Web Flow 276
11.4.2 提出流目錄結構 276
11.4.3 Purchase Product流定義 277
11.4.4 實現第一步:視圖狀態277
11.4.5 過渡 277
11.4.6 動作 278
11.4.7 Action bean定義 279
11.4.8 測試流執行 280
11.4.9 擴展AbstractFlowExecution-Tests 281
11.4.10 決定狀態 282
11.4.11 動作狀態 283
11.4.12 結束狀態 284
11.4.13 Purchase Product流:接下來做什麼 285
11.4.14 Spring MVC部署 285
11.4.15 FlowController 286
11.4.16 FlowRegistry 286
11.4.17 附加配置 286
11.4.18 視圖模板解析 287
11.4.19 視圖模板要求 287
11.4.20 從瀏覽器中啟動流 288
11.5 本章小結 288
11.5.1 模型對話 289
11.5.2 允許擴展 289
11.5.3 可測試 289
11.5.4 鑑別流(簡單而自然的語言) 289
第12章 高級Spring Web Flow 290
12.1 業務邏輯和流 290
12.2 流粒度 291
12.2.1 子流 291
12.2.2 內嵌流 297
12.2.3 小結 299
12.3 管理FlowExecutions 299
12.3.1 與Web框架集成 299
12.3.2 FlowExecutionManager 301
12.3.3 FlowExecution 301
12.3.4 FlowExecutionListener 304
12.4 FlowExecution倉庫 306
12.4.1 延續鍵 306
12.4.2 FlowExecutionRepository實現 308
12.4.3 有狀態FlowExecution倉庫 309
12.4.4 無狀態FlowExecution倉庫 309
12.4.5 完成後對話失效 310
12.5 再次訪問的狀態和過渡 310
12.5.1 動作狀態 311
12.5.2 POJO動作 313
12.5.3 暴露POJO方法返回值 314
12.5.4 使用視圖狀態和結束狀態定製視圖選擇 314
12.5.5 決定狀態 316
12.6 異常處理 317
12.7 異常處理小結 319
12.8 本章小結 320
附錄A MVC應用程式的文檔 321
A.1 BeanDoc 321
A.1.1 安裝和構建BeanDoc 321
A.1.2 在配置檔案上運行BeanDoc 322
A.1.3 其他選項 323
A.1.4 控制輸出 324
A.2 小結 324
附錄B Ajax和DWR 325
B.1 Spring和DWR 325
B.2 套用的示例 326
B.2.1 配置和代碼改變 326
B.2.2 介紹檔案改變 328
B.3 無障礙 333
前言
Spring MVC和Spring Web Flow是Spring的開發人員和社區為我們帶來的兩個非常靈活和強大的兩個Web框架。Spring MVC是一個構建於Spring Framework之上的現代Web應用程式框架;而Spring Web Flow則是一個現在已經獨立於Spring Framework之外、用於配合Spring MVC的新項目,主要用於構建可重用的封裝了豐富的頁面導航規則的Web控制器模組。本書深入探討了這兩個框架。除了詳細分析代碼及其功能之外,我們還穿插了與這兩個框架以及一般意義上的Web開發相關的大量技巧。
我們寫作本書的目的是告訴讀者如何最大程度地發揮出這兩個框架的潛力。在本書的幫助下,你可以更清楚地研究原始碼,加深對框架的理解,開發出高質量的應用程式。
我們在開發Spring MVC和Spring Web Flow時充分運用了設計模式和許多面向對象的專家技術。本書不僅將解釋我們設計這兩個框架時的許多設計決策是如何做出的,而且還會告訴讀者如何在自己的項目中套用類似的設計思路和技巧。
我們花費了不少心血,力圖講清楚Spring MVC和Spring Web Flow兩個框架的每個細節,給讀者建立大局觀。除了它們最著名的特性之外,我們還講述了許多不為人知的技術亮點。但是我們深知,框架不可能解決所有問題,所以還詳細探討了如何正確和安全地擴展框架,得到靈活、更符合客戶需求的解決方案。
無論你是初學者,還是專家,通過本書,你可以更加自信地投入到Spring Web套用的開發中去。
致謝
一本書僅靠作者是不可能完成的,它是很多人的專業知識、辛勤勞動、寶貴時間和超常努力的成果。本書應歸功於參與其事的每個人。
首先我要感謝我的妻子,一個擁有天使般耐心的人。她的愛和支持陪伴我寫作的始終。
我也要感謝我的合著者,因為他們貢獻了獨特而無價的知識和洞察力,從而產生了比我單獨創作更出色的著作。感謝Darren、Steven、Keith和Colin!
如果沒有Apress出版社編輯們的才幹和專業知識,這本書不可能面世。具體地說,我衷心感謝Sofia Marchant和Beckie Brand協調各部門,並盡最大努力確保本書做到最好。我要特別感謝Stephanie Provines,沒有她的幫助,我們將很難完成Spring MVC的相關內容。她對細節的關注令人印象深刻,而且極具價值。我也要特別感謝Steve Anglin給了我這個機會。對於未提及的其他所有人,我永遠感謝你們。
我很高興由Rob Harrop 來做本書的技術審稿人。他的建議總是準確有用而且專業。謝謝你,Rob,我很榮幸有你作為這個團隊的一份子。
謝謝Erwin Vervaet、Dan Leuck和Colin Sampaleanu在審閱本書時提出的專業建議。謝謝Kathleen Fitzgerald的拍攝。最後,謝謝Spring框架的開發者和社區,從他們那裡我學到了極其多的關於軟體開發的知識。