內容簡介
本書介紹了Java EE開發非常流行的三個開源框架:Spring MVC、Spring和MyBatis,其中Spring MVC、Spring用的是5.1版本,MyBatis用的是3.5版本。本書重點介紹了如何整合Spring MVC + Spring + MyBatis進行開發,內容主要包括三部分。第一部分介紹Java EE開發的基礎知識,以及如何搭建開發環境。第二部分詳細講解MyBatis、Spring和Spring MVC三個框架的用法,並從Eclipse IDE的使用上手,一步步帶領讀者深入三個框架的核心。這部分是本書的核心內容,因此也是重點部分。這部分並不是簡單地講授三個框架的基本用法,而是真正剖析它們在實際開發場景中面臨的挑戰及最佳實踐,並對其諸多關鍵技術實現提供了原始碼解讀,這樣既能加深讀者對框架本質的理解,也能直接提升讀者的Java功底。第三部分示範開發了一個包含7個表,表之間具有複雜的關聯映射、繼承映射等關係,且業務也相對複雜的工作流案例,幫助讀者理論聯繫實際,將三個框架真正運用到實際開發中。該案例採用目前非常流行、規範的Java EE架構,整個套用分為領域對象層、Mapper(DAO)。層、業務邏輯層、MVC層和視圖層,各層之間分層清晰,層與層之間以松耦合的方式組織在一起。該案例既提供了與IDE無關的、基於Ant管理的項目原始碼,也提供了基於Eclipse IDE的項目原始碼,最大限度地滿足讀者的需求。本書配有讀者答疑交流群,讀者可通過掃描本書封面勒口上的二維碼,按照指引加入,本書作者將通過交流群提供線上不定期答疑服務。
圖書目錄
第1章 Java EE套用和開發環境 1
1.1 Java EE套用概述 2
1.1.1 Java EE套用的分層模型 2
1.1.2 Java EE套用的組件 3
1.1.3 Java EE套用的結構和優勢 4
1.1.4 常用的Java EE伺服器 4
1.2 輕量級Java EE套用相關技術 5
1.2.1 JSP、Servlet 4.x和JavaBean及替代技術 5
1.2.2 Spring MVC及替代技術 6
1.2.3 MyBatis及替代技術 6
1.2.4 Spring及替代技術 7
1.3 Tomcat的下載和安裝 8
1.3.1 安裝Tomcat伺服器 8
1.3.2 配置Tomcat的服務連線埠 9
1.3.3 進入控制台 10
1.3.4 部署Web套用 12
1.3.5 配置Tomcat的數據源 13
1.4 Eclipse的安裝和使用 15
1.4.1 Eclipse的下載和安裝 15
1.4.2 線上安裝Eclipse外掛程式 15
1.4.3 從本地壓縮檔安裝外掛程式 17
1.4.4 手動安裝Eclipse外掛程式 18
1.4.5 使用Eclipse開發Java Web套用 18
1.4.6 導入Eclipse項目 21
1.4.7 導入非Eclipse項目 22
1.5 Ant的安裝和使用 23
1.5.1 Ant的下載和安裝 24
1.5.2 使用Ant工具 25
1.5.3 定義生成檔案 26
1.5.4 Ant的任務(task) 30
1.6 Maven的安裝和使用 32
1.6.1 下載和安裝Maven 33
1.6.2 設定Maven 34
1.6.3 創建、構建簡單的項目 35
1.6.4 Maven的核心概念 39
1.6.5 依賴管理 44
1.6.6 POM檔案的元素 46
1.7 使用Git進行軟體配置管理(SCM) 47
1.7.1 下載和安裝Git、TortoiseGit 47
1.7.2 創建本地資源庫 49
1.7.3 添加檔案和資料夾 51
1.7.4 提交修改 52
1.7.5 查看檔案或資料夾的版本變更 53
1.7.6 刪除檔案或資料夾 54
1.7.7 從以前版本重新開始 55
1.7.8 克隆項目 56
1.7.9 創建分支 56
1.7.10 沿著分支開發 57
1.7.11 合併分支 58
1.7.12 使用Eclipse作為Git客戶端 59
1.7.13 配置遠程中央資源庫 61
1.7.14 推送項目 64
1.7.15 獲取項目和拉取項目 64
1.8 本章小結 66
第2章 MyBatis的基礎用法 67
2.1 MyBatis是ORM框架嗎 68
2.1.1 何謂ORM 68
2.1.2 ORM的映射方式 69
2.1.3 MyBatis的映射方式 70
2.2 MyBatis入門 71
2.2.1 MyBatis的下載和安裝 72
2.2.2 MyBatis的資料庫操作 72
2.2.3 使用MyBatis執行CRUD 78
2.2.4 利用Mapper對象 80
2.2.5 在Eclipse中使用MyBatis 84
2.3 MyBatis核心API及作用域 90
2.3.1 SqlSessionFactoryBuilder的作用域 90
2.3.2 SqlSessionFactory的作用域 91
2.3.3 SqlSession及其作用域 92
2.3.4 Mapper組件的作用域 94
2.4 MyBatis配置詳解 94
2.4.1 屬性配置 95
2.4.2 設定配置 98
2.4.3 為類型配置別名 101
2.4.4 對象工廠 103
2.4.5 載入Mapper 105
2.5 類型處理器 106
2.5.1 內置的類型處理器 106
2.5.2 自定義類型處理器 107
2.5.3 枚舉的類型處理器 111
2.5.4 存儲枚舉值的序號 112
2.5.5 同時存儲枚舉值的名稱和序號 113
2.6 資料庫環境配置 116
2.6.1 環境配置與默認環境配置 116
2.6.2 事務管理器 117
2.6.3 數據源配置 121
2.6.4 配置第三方C3P0數據源 122
2.7 支持不同類型的資料庫 124
2.8 Mapper基礎 127
2.8.1 select的用法 128
2.8.2 insert的用法 130
2.8.3 使用useGeneratedKeys返回 自增長的主鍵值 131
2.8.4 使用selectKey生成主鍵值 132
2.8.5 update和delete元素的用法 134
2.8.6 使用sql元素定義可復用的SQL片段 134
2.8.7 參數處理 136
2.8.8 參數的額外聲明 142
2.8.9 字元串替換 142
2.9 MyBatis代碼生成器 144
2.9.1 提供配置檔案 145
2.9.2 運行MBG 146
2.10 本章小結 149
第3章 深入使用MyBatis 151
3.1 結果集映射 152
3.1.1 簡單resultMap映射 152
3.1.2 構造器映射 154
3.1.3 自動映射 157
3.2 調用存儲過程 159
3.2.1 調用返回結果集的存儲過程 159
3.2.2 調用帶out模式參數的存儲過程 160
3.2.3 調用傳出參數為游標引用的存儲過程 162
3.3 關聯映射 165
3.3.1 基於嵌套select的一對一映射 165
3.3.2 基於嵌套select映射策略的性能缺陷 171
3.3.3 延遲載入的原理 175
3.3.4 基於多表連線查詢的一對一映射 176
3.3.5 基於多結果集的一對一映射 182
3.3.6 基於嵌套select的一對多映射 184
3.3.7 基於多表連線查詢的一對多映射 191
3.3.8 基於多結果集的一對多映射 192
3.3.9 多對多映射的三種策略 194
3.4 基於辨別者列的繼承映射 201
3.4.1 繼承映射的簡單示例 201
3.4.2 繼承映射的複雜示例 205
3.5 動態SQL 210
3.5.1 if元素的用法 210
3.5.2 在update更新列中使用if 216
3.5.3 在insert動態插入列中使用if 219
3.5.4 choose、when、otherwise元素的 用法 222
3.5.5 where與trim的用法 225
3.5.6 set與trim的用法 228
3.5.7 使用trim實現動態插入 230
3.5.8 foreach元素的基本用法 232
3.5.9 foreach實現批量插入 234
3.5.10 foreach實現批量更新 236
3.5.11 bind元素的用法 239
3.6 快取 240
3.6.1 一級快取 240
3.6.2 一級快取的髒數據與避免方法 243
3.6.3 二級快取 246
3.6.4 二級快取的髒數據與避免方法 248
3.6.5 整合Ehcache實現二級快取 252
3.7 用外掛程式擴展MyBatis 254
3.7.1 攔截器接口及作用原理 254
3.7.2 可攔截的目標 256
3.7.3 為MyBatis開發分頁外掛程式 260
3.8 本章小結 266
第4章 Spring的基礎用法 267
4.1 Spring簡介和Spring 5的變化 268
4.1.1 Spring簡介 268
4.1.2 Spring 5.x的變化 269
4.2 Spring入門 269
4.2.1 Spring的下載和安裝 270
4.2.2 使用Spring管理Bean 270
4.2.3 在Eclipse中使用Spring 274
4.3 Spring的核心機制:依賴注入 276
4.3.1 理解依賴注入 277
4.3.2 設值注入 278
4.3.3 構造注入 282
4.3.4 兩種注入方式的對比 284
4.4 使用Spring容器 284
4.4.1 Spring容器 284
4.4.2 使用ApplicationContext 286
4.4.3 ApplicationContext的國際化支持 287
4.4.4 ApplicationContext的事件機制 289
4.4.5 讓Bean獲取Spring容器 292
4.5 Spring容器中的Bean 294
4.5.1 Bean的基本定義和Bean別名 294
4.5.2 容器中Bean的作用域 295
4.5.3 配置依賴 299
4.5.4 設定普通屬性值 300
4.5.5 配置合作者Bean 302
4.5.6 使用自動裝配注入合作者Bean 302
4.5.7 注入嵌套Bean 305
4.5.8 注入集合值 306
4.5.9 組合屬性 311
4.5.10 Spring的Bean和JavaBean 312
4.6 Spring的Java配置管理 313
4.7 創建Bean的三種方式 316
4.7.1 使用構造器創建Bean 316
4.7.2 使用靜態工廠方法創建Bean 317
4.7.3 使用實例工廠方法創建Bean 319
4.8 深入理解容器中的Bean 321
4.8.1 抽象Bean與子Bean 322
4.8.2 Bean繼承與Java繼承的區別 323
4.8.3 容器中的工廠Bean 323
4.8.4 獲得Bean本身的id 326
4.8.5 強制初始化Bean 327
4.9 容器中Bean的生命周期 327
4.9.1 依賴關係注入之後的行為 328
4.9.2 Bean銷毀之前的行為 330
4.9.3 協調作用域不同步的Bean 332
4.10 高級依賴關係配置 336
4.10.1 獲取其他Bean的屬性值 336
4.10.2 獲取Field值 339
4.10.3 獲取方法的返回值 341
4.11 基於XML Schema的簡化配置方式 344
4.11.1 使用p:命名空間簡化配置 344
4.11.2 使用c:命名空間簡化配置 345
4.11.3 使用util:命名空間簡化配置 347
4.12 Spring表達式語言 349
4.12.1 使用Expression接口進行表達式求值 350
4.12.2 Bean定義中的表達式語言支持 352
4.12.3 SpEL語法詳述 353
4.13 本章小結 358
第5章 深入使用Spring 359
5.1 兩種後處理器 360
5.1.1 Bean後處理器 360
5.1.2 Bean後處理器的用處 364
5.1.3 容器後處理器 364
5.1.4 屬性占位符配置器 366
5.1.5 重寫占位符配置器 367
5.2 “零配置”支持 368
5.2.1 搜尋Bean類 368
5.2.2 指定Bean的作用域 371
5.2.3 使用@Resource、@Value配置依賴 372
5.2.4 使用@PostConstruct和@PreDestroy定製生命周期行為 373
5.2.5 @DependsOn和@Lazy 374
5.2.6 自動裝配和精確裝配 374
5.2.7 Spring 5新增的註解 379
5.3 資源訪問 380
5.3.1 Resource實現類 381
5.3.2 ResourceLoader接口和 ResourceLoaderAware接口 385
5.3.3 使用Resource作為屬性 388
5.3.4 在ApplicationContext中使用資源 389
5.4 Spring的AOP 392
5.4.1 為什麼需要AOP 393
5.4.2 使用AspectJ實現AOP 394
5.4.3 AOP的基本概念 401
5.4.4 Spring的AOP支持 402
5.4.5 基於註解的“零配置”方式 403
5.4.6 基於XML配置檔案的管理方式 418
5.5 Spring的快取機制 424
5.5.1 啟用Spring快取 425
5.5.2 使用@Cacheable執行快取 427
5.5.3 使用@CacheEvict清除快取數據 431
5.6 Spring的事務 433
5.6.1 Spring支持的事務策略 433
5.6.2 使用XML Schema配置事務策略 436
5.6.3 使用@Transactional 442
5.7 Spring整合MyBatis 443
5.7.1 整合MyBatis的關鍵點及快速入門 443
5.7.2 配置SqlSessionFactory 448
5.7.3 通過工廠Bean配置Mapper組件 449
5.7.4 通過掃描自動配置Mapper組件 450
5.7.5 基於SqlSession實現DAO組件 452
5.7.6 繼承SqlSessionDaoSupport實現DAO組件 455
5.7.7 事務管理 457
5.8 本章小結 458
第6章 Spring MVC的基礎用法 459
6.1 MVC概述 460
6.1.1 MVC模式及其優勢 460
6.1.2 Spring MVC與Struts 2的區別 461
6.2 Spring MVC入門 463
6.2.1 在Web套用中啟動Spring容器 463
6.2.2 配置核心控制器 466
6.2.3 開發控制器 468
6.2.4 提供視圖資源 470
6.2.5 使用Eclipse開發Spring MVC套用 471
6.3 Spring MVC的流程 472
6.3.1 Spring MVC套用的開發步驟 472
6.3.2 Spring MVC的運行流程 474
6.3.3 DispatcherServlet詳解 475
6.3.4 mvc:annotation-driven詳解 480
6.4 靜態資源處理 481
6.4.1 靜態資源映射 481
6.4.2 配置默認Servlet 483
6.5 視圖解析器 485
6.5.1 UrlBasedViewResolver的功能與用法 486
6.5.2 InternalResourceViewResolver的功能與用法 491
6.5.3 XmlViewResolver及視圖解析器的鏈式處理 492
6.5.4 ResourceBundleViewResolver的功能與用法 496
6.5.5 BeanNameViewResolver的功能與用法 497
6.5.6 重定向視圖 499
6.5.7 將數據傳給重定向目標 500
6.5.8 ContentNegotiatingViewResolver的功能與用法 503
6.6 請求映射與參數處理 510
6.6.1 HandlerMapping與處理映射 510
6.6.2 SimpleUrlHandlerMapping的功能與用法 511
6.6.3 @RequestMapping註解及其變體 512
6.6.4 處理方法允許的返回值類型 515
6.6.5 @RequestParam註解與MultiValueMap 516
6.6.6 使用@PathVariable獲取路徑變數的值 520
6.6.7 使用@PathVariable處理正則 表達式 523
6.6.8 路徑模式 524
6.6.9 使用@MatrixVariable處理Matrix變數 526
6.6.10 使用@RequestHeader獲取請求頭的值 529
6.6.11 異步處理 530
6.6.12 使用DeferredResult支持異步處理 534
6.6.13 使用@ModelAttribute修飾方法本身 536
6.6.14 使用@ModelAttribute修飾方法參數 539
6.7 將數據傳給視圖頁面 541
6.7.1 Model、ModelMap和RedirectAttributes 541
6.7.2 使用@SessionAttributes添加session屬性 542
6.8 RESTful服務支持 544
6.8.1 RESTful簡介 544
6.8.2 @RequestBody與@ResponseBody註解 546
6.8.3 HttpMessageConverter與訊息轉換 550
6.8.4 轉換XML數據 553
6.8.5 使用@RestController修飾RESTful控制器 557
6.8.6 @CrossOrigin註解與跨域請求 557
6.9 訪問Servlet API相關數據 561
6.9.1 處理方法可接受的形參類型 561
6.9.2 使用@RequestAttribute獲取請求屬性 562
6.9.3 使用@SessionAttribute獲取session屬性 563
6.9.4 直接訪問Servlet API 566
6.9.5 使用WebRequest和NativeWebRequest偽訪問 567
6.9.6 使用@CookieValue獲取cookie值 569
6.9.7 在處理方法中使用IO流 571
6.10 本章小結 573
第7章 深入使用Spring MVC 574
7.1 國際化 575
7.1.1 國際化到底怎么做 575
7.1.2 根據瀏覽器請求頭確定Locale 577
7.1.3 根據session確定Locale 582
7.1.4 根據cookie值確定Locale 586
7.2 異常處理 587
7.2.1 Spring MVC異常處理 587
7.2.2 傳統的異常處理機制 590
7.2.3 使用@ResponseStatus修飾異常類 594
7.2.4 使用@ExceptionHandler修飾異常 處理方法 596
7.2.5 使用@ControllerAdvice定義異常Aspect 599
7.2.6 使用@RestControllerAdvice定義異常Aspect 600
7.3 標籤庫 602
7.3.1 form標籤與普通表單域標籤 602
7.3.2 radiobutton和radiobuttons標籤 605
7.3.3 checkbox和checkboxes標籤 607
7.3.4 select和option、options標籤 610
7.3.5 htmlEscape和escapeBody標籤 612
7.3.6 url和param標籤 613
7.4 類型轉換與綁定 615
7.4.1 BeanWrapper簡介 616
7.4.2 PropertyEditor與內置實現類 618
7.4.3 自定義PropertyEditor 619
7.4.4 使用WebBindingInitializer註冊全局PropertyEditor 621
7.4.5 使用ConversionService執行轉換 623
7.4.6 處理轉換錯誤 626
7.5 格式化 629
7.5.1 使用格式化器 630
7.5.2 使用FormatterRegistrar註冊 格式化器 633
7.6 數據校驗 634
7.6.1 使用Validation執行校驗 634
7.6.2 基於JSR 303執行校驗 638
7.7 檔案上傳與下載 641
7.7.1 使用MultipartFile處理檔案上傳 641
7.7.2 基於Commons FileUpload組件 上傳檔案 646
7.7.3 使用@RequestPart註解 647
7.7.4 檔案下載 650
7.7.5 下載前的授權控制 652
7.8 攔截器 653
7.9 SSM整合開發 656
7.9.1 搭建項目 657
7.9.2 開發Mapper組件 659
7.9.3 開發Service組件 660
7.9.4 控制器與視圖 661
7.10 本章小結 666
第8章 簡單工作流系統 667
8.1 項目背景及系統結構 668
8.1.1 套用背景 668
8.1.2 系統功能介紹 668
8.1.3 相關技術介紹 669
8.1.4 系統結構 670
8.1.5 系統的功能模組 670
8.2 領域對象層 671
8.2.1 設計領域對象 671
8.2.2 創建領域對象類 672
8.3 實現Mapper(DAO)層 677
8.3.1 Mapper組件的定義 677
8.3.2 實現Mapper組件 681
8.3.3 部署Mapper層 685
8.4 實現Service層 686
8.4.1 業務邏輯組件的設計 686
8.4.2 實現業務邏輯組件 687
8.4.3 事務管理 692
8.4.4 部署業務邏輯組件 693
8.5 實現任務的自動調度 693
8.5.1 使用Quartz 693
8.5.2 在Spring中使用Quartz 698
8.6 實現系統Web層 700
8.6.1 配置核心控制器和啟動Spring容器 700
8.6.2 控制器的處理順序 701
8.6.3 員工登錄 702
8.6.4 進入打卡 705
8.6.5 處理打卡 707
8.6.6 進入申請 708
8.6.7 提交申請 709
8.6.8 使用攔截器完成許可權管理 710
8.7 本章小結 712