作者簡介
李剛,從事近10年的Java EE套用開發。曾任LITEON公司的J2EE技術主管,負責該公司的企業信息平台的架構設計。曾任廣州電信、廣東龍泉科技等公司的技術培訓導師。2007年3月26日的《電腦報》專訪人物。瘋狂Java實訓營創立人,瘋狂Java體系圖書作者,曾兼任廣東技術師範學院計算機科學系的兼職副教授。培訓的學生已在華為、立信、普信,
網易、電信盈科、中企動力等公司就職。 國內知名的高端IT技術作家,已出版《瘋狂Java講義》、《輕量級Java EE企業套用實戰》、《瘋狂Ajax講義》、《Struts 2權威指南》、《Ruby On Rails敏捷開發最佳實踐》、《Sprin9 2.0寶典》等著作。
內容簡介
《Struts 2.1權威指南》是《Struts 2權威指南》的第二版,《Struts 2.1權威指南》介紹的Struts 2是最新的Struts 2.1。相對於2007年發布的Struts 2.0,Struts 2.1改變較大,Struts 2.1不僅修正了Struts 2.0中少量Bug(這些Bug在《Struts 2.1權威指南》第一版中已經指出)。而且新增了REST、Convention和Java Templates,這些都是Struts 2未來的發展方向。不僅如此,Struts 2.1不再支持Ajax主題,而是改為使用Dojo外掛程式來提供對Ajax的支持。Struts 2.1拋棄了Codebehind外掛程式提供的“零配置”支持,改為使用Convention外掛程式提供“零配置”,Struts 2.1新增了Portlet支持……為了讓眾多Struts學習者、工作者快速從Struts 2.0的開發升級到Struts 2.1,筆者升級了《Struts 2權威指南》,第二版改寫了第一版中所有程式,將它們改為基於Struts 2.1運行。第二版刪除了第一版中第18章的內容(Struts 2和Struts 1整合部分),全面介紹了Struts 2.1新增的Convention和REST支持。《Struts 2.1權威指南》最後配備的兩個常用的實例也都升級為基於Struts 2.1運行,讀者可通過這兩個實例觸類旁通,解決日常開發中的問題。
《Struts 2.1權威指南》第二版保留了第一版通俗易懂的寫作風格:按Struts 2.1的架構體系,細緻地介紹了Struts 2.1各個知識點。在介紹過程中,筆者依照讀者的學習規律,首先介紹基本概念和基本操作,然後對內容進行深入講解。筆者在介紹Struts 2.1框架時,既照顧到了Struts 2.1初學者的能力,對每個知識點都給出簡單的快速上手的示例;同時也考慮到開發者在日後開發中可能遇到的問題,詳細講解了每個知識點的各種用法,《Struts 2.1權威指南》覆蓋了Struts 2.1近80%的API。因此,《Struts 2.1權威指南》完全可以作為Struts 2框架的權威手冊,以供開發者在實際開發過程中參考。
《Struts 2.1權威指南》適用於有較好的Java編程基礎,有一定JSP、Servlet等Web編程基礎或具備初步Java EE編程基礎的讀者。《Struts 2.1權威指南》既給出了Struts 2入門級的示範實例,也詳細講解了Struts 2各個知識點及各個選項的詳細用法,可以作為Struts 2框架的權威參考。
目錄
第1章 Struts 2概述1
1.1 MVC思想概述2
1.1.1 Web技術的發展2
1.1.2 Model 1和Model 24
1.1.3 MVC思想及其優勢6
1.1.4 常用的MVC框架7
1.2 Struts 2的起源和背景8
1.2.1 Struts 1簡介及存在的問題9
1.2.2 WebWork簡介12
1.2.3 Struts 2起源15
1.3 Struts 2體系介紹16
1.3.1 Struts 2框架架構16
1.3.2 Struts 2的配置檔案17
1.3.3 Strut 2的標籤庫18
1.3.4 Struts 2的控制器組件19
1.4 Struts 2與Struts 1的對比20
1.5 WebWork和Struts 2對比21
1.6 本章小結22
第2章 Struts 2下的HelloWorld23
2.1 下載和安裝Struts 2框架23
2.2 從用戶請求開始25
2.3 創建Struts 2的Web套用27
2.3.1 創建Web套用27
2.3.2 增加Struts 2功能28
2.4 實現控制器28
2.4.1 實現控制器類29
2.4.2 配置Action30
2.4.3 增加視圖資源完成套用30
2.5 改進控制器32
2.5.1 實現Action接口32
2.5.2 跟蹤用戶狀態33
2.5.3 添加處理信息35
2.5.4 輸出處理信息37
2.6 改進視圖組件39
2.6.1 改善輸出頁面39
2.6.2 使用UI標籤簡化表單頁面40
2.7 完成程式國際化42
2.7.1 定義國際化資源檔案42
2.7.2 載入資源檔案43
2.7.3 輸出國際化信息44
2.8 增加數據校驗46
2.8.1 繼承ActionSupport46
2.8.2 使用Struts 2的校驗框架49
2.9 本章小結51
第3章 Struts 2基礎52
3.1 WebWork的MVC實現52
3.1.1 WebWork的下載和安裝53
3.1.2 實現Action53
3.1.3 配置Action56
3.1.4 完成數據校驗58
3.1.5 完成套用流程59
3.2 在Eclipse中開發Struts 260
3.2.1 創建Web套用61
3.2.2 增加Struts 2支持63
3.2.3 部署Struts 2套用64
3.2.4 增加套用的Action65
3.3 Struts 2的基本流程66
3.3.1 核心控制器:FilterDispatcher66
3.3.2 業務控制器67
3.3.3 Struts 2的模型組件67
3.3.4 Struts 2的視圖組件68
3.3.5 Struts 2的運行流程68
3.4 Struts 2的基本配置69
3.4.1 配置web.xml檔案69
3.4.2 struts.xml配置檔案71
3.4.3 struts.properties配置檔案74
3.4.4 struts.xml檔案結構78
3.5 本章小結82
第4章 深入Struts 283
4.1 深入Struts 2的配置檔案83
4.1.1 Bean配置84
4.1.2 常量配置85
4.1.3 包配置87
4.1.4 命名空間配置89
4.1.5 包含配置91
4.1.6 攔截器配置91
4.2 Struts 2的Action92
4.2.1 實現Action處理類92
4.2.2 Action訪問Servlet API97
4.2.3 Action直接訪問Servlet API100
4.2.4 配置Action103
4.2.5 配置Action的默認處理類104
4.2.6 動態方法調用105
4.2.7 為action元素指定method
4.2.7 屬性107
4.2.8 使用通配符109
4.2.9 配置默認Action115
4.3 管理處理結果116
4.3.1 處理結果的改進116
4.3.2 配置結果117
4.3.3 Struts 2支持的處理結果
4.2.7 類型118
4.3.4 plainText結果類型120
4.3.5 redirect結果類型123
4.3.6 redirectAction結果類型124
4.3.7 動態結果125
4.3.8 請求參數決定結果126
4.3.9 全局結果129
4.4 屬性驅動和模型驅動130
4.4.1 模型的作用130
4.4.2 使用模型驅動131
4.5 Struts 2的異常機制134
4.5.1 Struts 2的異常處理哲學135
4.5.2 聲明式異常捕捉136
4.5.3 輸出異常信息139
4.6 未知處理器141
4.7 本章小結143
第5章 Struts 2的類型轉換144
5.1 類型轉換的意義145
5.1.1 表現層數據處理145
5.1.2 類型轉換145
5.2 Struts 2內建的類型轉換器149
5.3 基於OGNL的類型轉換151
5.4 自定義類型轉換器155
5.4.1 系統需求155
5.4.2 實現類型轉換器157
5.4.3 局部類型轉換器159
5.4.4 全局類型轉換器161
5.4.5 基於Struts 2的類型轉換器163
5.4.6 數組屬性的類型轉換器165
5.4.7 集合屬性的類型轉換器168
5.5 集合類型轉換的高級特性170
5.5.1 指定集合元素的類型170
5.5.2 為Set集合的元素指定
4.2.7 索引屬性172
5.6 類型轉換中錯誤處理174
5.6.1 類型轉換的錯誤處理流程174
5.6.2 處理類型轉換錯誤176
5.6.3 輸出類型轉換錯誤176
5.6.4 處理集合屬性的轉換錯誤179
5.7 本章小結182
第6章 Struts 2的輸入校驗183
6.1 輸入校驗概述184
6.1.1 為什麼需要輸入校驗184
6.1.2 客戶端校驗185
6.1.3 伺服器端校驗187
6.1.4 類型轉換和輸入校驗191
6.2 基本輸入校驗192
6.2.1 編寫校驗規則檔案192
6.2.2 國際化提示信息195
6.2.3 使用客戶端校驗197
6.3 校驗器的配置風格200
6.3.1 欄位校驗器配置風格201
6.3.2 非欄位校驗器配置風格201
6.3.3 短路校驗器203
6.3.4 校驗順序和短路205
6.4 校驗檔案的搜尋規則205
6.5 內建校驗器208
6.5.1 註冊校驗器208
6.5.2 必填校驗器210
6.5.3 必填字元串校驗器210
6.5.4 整數校驗器211
6.5.5 日期校驗器212
6.5.6 表達式校驗器213
6.5.7 欄位表達式校驗器213
6.5.8 郵件地址校驗器214
6.5.9 網址校驗器215
6.5.10 Visitor校驗器216
6.5.11 轉換校驗器219
6.5.12 字元串長度校驗器220
6.5.13 正則表達式校驗器221
6.6 基於Annotation的輸入校驗221
6.7 手動完成輸入校驗223
6.7.1 重寫validate()方法223
6.7.2 重寫validateXxx()方法225
6.7.3 Struts 2的輸入校驗流程227
6.8 本章小結228
第7章 上傳和下載檔案229
7.1 檔案上傳的原理230
7.1.1 表單元素的enctype屬性230
7.1.2 手動上傳233
7.1.3 使用上傳框架完成上傳235
7.2 Struts 2的檔案上傳241
7.2.1 Struts 2的檔案上傳支持241
7.2.2 實現檔案上傳的Action242
7.2.3 配置檔案上傳的Action244
7.2.4 手動實現檔案過濾246
7.2.5 攔截器實現檔案過濾249
7.2.6 輸出錯誤提示250
7.2.7 檔案上傳的常量配置252
7.3 使用Pell上傳252
7.4 同時上傳多個檔案253
7.4.1 使用數組同時上傳多個檔案254
7.4.2 使用List同時上傳多個檔案257
7.5 使用Struts 2控制檔案下載258
7.5.1 實現檔案下載的Action259
7.5.2 配置Action260
7.5.3 下載前的授權控制261
7.6 本章小結263
第8章 Struts 2的國際化264
8.1 程式國際化簡介265
8.1.1 程式國際化的意義265
8.1.2 Java國際化的思路265
8.1.3 Java支持的語言和國家266
8.1.4 完成程式國際化267
8.1.5 使用MessageFormat處理
8.1.5 帶占位符的訊息269
8.1.6 使用類檔案代替資源檔案270
8.2 Struts 2的國際化入門271
8.2.1 載入全局資源檔案271
8.2.2 訪問國際化訊息272
8.2.3 輸出帶占位符的國際化訊息275
8.3 載入資源檔案的不同方式277
8.3.1 包範圍資源檔案277
8.3.2 Action範圍資源檔案279
8.3.3 臨時指定資源檔案279
8.3.4 載入資源檔案的順序281
8.4 允許用戶自行選擇程式語言282
8.4.1 Struts 2國際化的運行機制282
8.4.2 創建下拉列表框283
8.4.3 選擇程式語言286
8.5 本章小結287
第9章 Struts 2的標籤庫288
9.1 Struts 2標籤庫概述289
9.1.1 標籤的優勢289
9.1.2 Struts 2的標籤分類290
9.2 Struts 2標籤入門291
9.2.1 使用Struts 2標籤的準備291
9.2.2 Struts 2的OGNL表達式
9.2.2 語言292
9.2.3 OGNL中的集合操作295
9.2.4 訪問靜態成員296
9.2.5 Lambda(λ)表達式296
9.3 控制標籤297
9.3.1 if/elseif/else標籤297
9.3.2 iterator標籤298
9.3.3 append標籤300
9.3.4 generator標籤302
9.3.5 merge標籤304
9.3.6 subset標籤304
9.3.7 sort標籤307
9.4 數據標籤309
9.4.1 action標籤309
9.4.2 bean標籤311
9.4.3 date標籤313
9.4.4 debug標籤314
9.4.5 include標籤315
9.4.6 param標籤316
9.4.7 push標籤316
9.4.8 set標籤317
9.4.9 url標籤319
9.4.10 property標籤320
9.5 主題和模板321
9.5.1 選擇主題321
9.5.2 自定義主題323
9.6 表單標籤325
9.6.1 表單標籤的通用屬性325
9.6.2 表單標籤的name和
9.6.2 value屬性328
9.6.3 checkboxlist標籤328
9.6.4 combobox標籤331
9.6.5 doubleselect標籤331
9.6.6 head標籤334
9.6.7 optiontransferselect標籤334
9.6.8 select標籤336
9.6.9 radio標籤337
9.6.10 optgroup標籤338
9.6.11 token標籤340
9.6.12 updownselect標籤341
9.7 非表單標籤343
9.7.1 actionerror和actionmessage
9.7.1 標籤343
9.7.2 component標籤344
9.8 本章小結347
第10章 Struts 2的攔截器348
10.1 理解攔截器349
10.1.1 理解DRY規則349
10.1.2 攔截器的意義350
10.1.3 攔截器的實現原理352
10.1.4 攔截器和AOP的關係356
10.1.5 攔截器在Struts 2中的作用357
10.2 攔截器配置初步359
10.2.1 配置攔截器359
10.2.2 使用攔截器361
10.2.3 配置默認攔截器362
10.3 Struts 2內建的攔截器365
10.3.1 Struts 2內建的攔截器365
10.3.2 struts-default.properties里
10.3.2 配置的攔截器366
10.4 開發自己的攔截器370
10.4.1 實現攔截器類371
10.4.2 使用攔截器372
10.4.3 攔截器和Struts 2外掛程式的
10.4.3 關係374
10.5 深入攔截器編程375
10.5.1 攔截方法的攔截器375
10.5.2 攔截器的執行順序378
10.5.3 攔截結果的監聽器380
10.5.4 覆蓋攔截器棧里特定
10.5.4 攔截器的參數381
10.6 攔截器示例:實現許可權控制383
10.6.1 實現攔截器類383
10.6.2 配置許可權控制攔截器384
10.7 本章小結386
第11章 Struts 2的Ajax支持387
11.1 Ajax概述388
11.1.1 Ajax的起源和變革388
11.1.2 Ajax的核心技術391
11.2 Struts 2提供的Ajax支持393
11.3 基於Dojo的異步表單397
11.3.1 安裝Dojo外掛程式398
11.3.2 定義異步表單398
11.3.3 實現Action400
11.3.4 實現伺服器回響頁面402
11.4 基於Dojo的pub-sub事件
11.4 模型403
11.4.1 pub-sub的原理404
11.4.2 pub-sub的示例405
11.4.3 阻止請求407
11.5 基於Dojo的Ajax標籤407
11.5.1 div標籤407
11.5.2 submit和a標籤414
11.5.3 autocompleter標籤419
11.5.4 tabbedpanel標籤426
11.5.5 datetimepicker430
11.5.6 tree和treenode432
11.5.7 textarea435
11.5.8 bind436
11.6 基於JSON外掛程式的Ajax
11.6 實現438
11.6.1 JSON的基本知識438
11.6.2 安裝Struts 2的JSON外掛程式441
11.6.3 實現Action邏輯441
11.6.4 實現JSP頁面443
11.7 本章小結446
第12章 Struts 2的REST支持447
12.1 Codebehind外掛程式和零配置448
12.1.1 自動搜尋Action448
12.1.2 使用Annotation指定命名
12.1.2 空間、父包和結果映射449
12.2 Convention外掛程式和零配置452
12.2.1 搜尋Action453
12.2.2 按約定映射Action454
12.2.3 按約定映射Result456
12.2.4 Action鏈的約定459
12.2.5 自動重載入映射461
12.3 Convention外掛程式的相關常量461
12.4 Convention的Annotation462
12.4.1 Action配置相關的
12.4.1 Annotation463
12.4.2 Result配置相關的
12.4.1 Annotation464
12.4.3 包和命名空間相關的
12.4.1 Annotation466
12.4.4 異常處理相關的Annotation466
12.4.5 攔截器配置相關的
12.4.1 Annotation468
12.5 REST簡介468
12.5.1 資源和標識符469
12.5.2 操作資源的方式470
12.6 Struts 2的REST支持471
12.6.1 RestActionMapper簡介471
12.6.2 安裝REST外掛程式472
12.6.3 實現支持REST的
12.6.3 Action類473
12.6.4 實現視圖層478
12.7 本章小結481
第13章 使用FreeMarker作為
第13章 表現層482
13.1 體驗FreeMarker483
13.1.1 下載和安裝FreeMarker483
13.1.2 在Java程式中使用
13.1.2 FreeMarker483
13.1.3 在Web套用中使用
13.1.2 FreeMarker485
13.2 FreeMarker的模板檔案489
13.2.1 模板結構489
13.2.2 FTL指令規則490
13.2.3 插值規則490
13.3 表達式492
13.3.1 直接指定值492
13.3.2 輸出變數值494
13.3.3 字元串操作496
13.3.4 集合連線運算符497
13.3.5 Map連線運算符497
13.3.6 算術運算符498
13.3.7 比較運算符499
13.3.8 邏輯運算符499
13.3.9 內建函式499
13.3.10 空值處理運算符500
13.3.11 運算符優先權500
13.4 FreeMarker的常用指令501
13.4.1 if指令501
13.4.2 switch、case、default、
13.4.2 break指令502
13.4.3 list、break指令502
13.4.4 include指令503
13.4.5 import指令503
13.4.6 noparse指令503
13.4.7 escape、noescape指令504
13.4.8 assign指令505
13.4.9 setting指令506
13.4.10 macro、nested、return指令506
13.5 使用FreeMarker作為
13.5 Struts 2的視圖技術509
13.5.1 在FreeMarker模板中
13.5.1 使用Struts 2標籤509
13.5.2 使用Freemarker Result512
13.5.3 解析模板中的變數514
13.5.4 訪問Servlet/JSP範圍的值516
13.6 本章小結517
第14章 整合Spring518
14.1 Spring簡介519
14.1.1 Spring的起源和核心519
14.1.2 使用Spring的IoC容器521
14.2 Struts 2外掛程式524
14.2.1 外掛程式概述524
14.2.2 外掛程式開發概述526
14.3 使用Spring外掛程式完成整合527
14.3.1 整合Spring前的準備工作528
14.3.2 整合Spring的思考531
14.4 讓Spring管理控制器532
14.4.1 整合流程532
14.4.2 從頁面請求開始533
14.4.3 實現控制器邏輯533
14.4.4 實現業務邏輯535
14.5 使用自動裝配537
14.5.1 指定自動裝配537
14.5.2 修改配置檔案538
14.5.3 改變自動裝配策略539
14.6 本章小結540
第15章 整合JSF541
15.1 JSF簡介541
15.1.1 JSF概述542
15.1.2 JSF和Struts 2的對比542
15.2 使用MyFaces543
15.2.1 下載和安裝MyFaces543
15.2.2 從輸入頁面開始545
15.2.3 在Web套用中配置MyFaces547
15.2.4 實現後台Bean548
15.2.5 定義導航規則549
15.3 安裝JSF外掛程式551
15.4 使用JSF外掛程式552
15.4.1 實現業務邏輯組件553
15.4.2 列出全部圖書556
15.4.3 添加/修改圖書558
15.5 整合JSF的思考563
15.6 本章小結564
第16章 整合SiteMesh565
16.1 SiteMesh簡介565
16.1.1 SiteMesh概述566
16.1.2 下載和安裝SiteMesh567
16.1.3 定義裝飾器頁面569
16.1.4 定義原始頁面570
16.1.5 更複雜的裝飾器頁面572
16.2 使用SiteMesh外掛程式575
16.2.1 安裝SiteMesh外掛程式575
16.2.2 在Struts 2中使用SiteMesh577
16.3 本章小結579
第17章 整合JasperReports580
17.1 JasperReports簡介581
17.1.1 下載和安裝JasperReports581
17.1.2 JasperReports初探582
17.1.3 JasperReports的開發流程588
17.1.4 解決PDF報表的中文問題589
17.2 動態報表590
17.2.1 帶參數的報表590
17.2.2 帶查詢的報表594
17.2.3 以VO集合作為數據源的
17.2.3 動態報表600
17.3 使用iReport設計報表605
17.3.1 下載和安裝iReport605
17.3.2 使用iReport607
17.3.3 建立數據源608
17.3.4 設計報表布局611
17.4 安裝JasperReports外掛程式614
17.5 使用JasperReports報表614
17.5.1 創建生成報表的Action615
17.5.2 配置生成JasperReports
17.2.3 報表的Action616
17.5.3 生成JasperReports報表617
17.6 本章小結618
第18章 整合JFreeChart619
18.1 JFreeChart簡介620
18.1.1 JFreeChart的下載和安裝620
18.1.2 使用JFreeChart621
18.1.3 JFreeChart開發步驟623
18.2 JFreeChart的常用統計圖表624
18.2.1 柱狀圖625
18.2.2 折線圖629
18.2.3 時間順序圖630
18.3 在網頁中生成帶互動功能的
18.3 統計圖633
18.4 安裝JFreeChart外掛程式638
18.5 在Struts 2套用中使用
18.5 JFreeChart639
18.5.1 創建Action類639
18.5.2 配置Action641
18.6 本章小結642
第19章 整合Hibernate643
19.1 Hibernate概述644
19.1.1 Hibernate的作用644
19.1.2 Hibernate的優勢646
19.2 Hibernate開發入門646
19.2.1 Hibernate下載和安裝646
19.2.2 使用Hibernate保存記錄647
19.2.3 使用Hibernate查詢記錄652
19.3 Struts 2整合Hibernate的思考654
19.3.1 自定義的整合方案654
19.3.2 整合方案的實現策略656
19.4 整合示例656
19.4.1 持久層設計656
19.4.2 DAO層設計660
19.4.3 業務邏輯層設計663
19.4.4 初始化組件工廠665
19.4.5 控制器實現666
19.5 整合後的思考和Spring框架668
19.6 本章小結669
第20章 “零配置”案例:註冊
第20章 登錄系統670
20.1 系統概述671
20.1.1 系統功能簡介671
20.1.2 系統總體設計671
20.2 實現Hibernate持久層672
20.2.1 編寫持久化PO類672
20.2.2 編寫映射檔案673
20.3 實現DAO層674
20.3.1 管理SessionFactory674
20.3.2 編寫DAO接口675
20.3.3 實現DAO組件677
20.3.4 配置DAO組件679
20.4 實現業務邏輯層679
20.4.1 定義業務邏輯組件接口679
20.4.2 提供業務邏輯組件實現類680
20.4.3 配置業務邏輯組件682
20.5 使用Struts 2683
20.5.1 整合Struts 2和Spring683
20.5.2 處理登錄685
20.5.3 圖形驗證碼689
20.5.4 使用Ajax驗證用戶名692
20.5.5 註冊新用戶696
20.6 使用SiteMesh裝飾頁面699
20.7 本章小結700
第21章 電子拍賣系統701
21.1 系統功能簡介和架構設計702
21.1.1 系統功能簡介702
21.1.2 系統架構設計702
21.1.3 相關技術介紹703
21.2 持久層設計706
21.2.1 系統實體706
21.2.2 系統E-R圖和數據表707
21.2.3 實現Hibernate PO709
21.2.4 管理SessionFactory718
21.3 實現系統DAO層720
21.3.1 DAO的基礎配置721
21.3.2 實現系統DAO組件721
21.3.3 配置系統DAO組件728
21.4 實現業務邏輯層729
21.4.1 定義業務邏輯組件接口730
21.4.2 依賴注入DAO組件732
21.4.3 業務邏輯組件中的異常
21.4.3 處理733
21.4.4 處理用戶競價735
21.4.5 判斷拍賣物品狀態737
21.4.6 事務管理740
21.4.7 配置業務層組件741
21.5 實現系統Web層744
21.5.1 配置Struts 2的核心Filter744
21.5.2 處理用戶登錄745
21.5.3 圖形驗證碼749
21.5.4 Web層的異常處理750
21.5.5 登錄控制751
21.5.6 添加物品753
21.5.7 處理用戶競價760
21.6 使用SiteMesh頁面裝飾766
21.6.1 在Struts 2中整合SiteMesh
21.6.1 頁面裝飾766
21.6.2 定義頁面裝飾767