內容簡介
本書介紹了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 下載和安裝Maven33
1.6.2 設定Maven34
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、TortoiseGit47
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.1 何謂ORM68
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執行CRUD78
2.2.4 利用Mapper對象80
2.2.5 在Eclipse中使用MyBatis84
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 載入Mapper105
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 運行MBG146
2.10 本章小結149
第3章 深入使用MyBatis151
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 動態SQL210
3.5.1 if元素的用法210
3.5.2 在update更新列中使用if216
3.5.3 在insert動態插入列中使用if219
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 用外掛程式擴展MyBatis254
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管理Bean270
4.2.3 在Eclipse中使用Spring274
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 使用ApplicationContext286
4.4.3 ApplicationContext的國際化支持287
4.4.4 ApplicationContext的事件機制289
4.4.5 讓Bean獲取Spring容器292
4.5 Spring容器中的Bean294
4.5.1 Bean的基本定義和Bean別名294
4.5.2 容器中Bean的作用域295
4.5.3 配置依賴299
4.5.4 設定普通屬性值300
4.5.5 配置合作者Bean302
4.5.6 使用自動裝配注入合作者Bean302
4.5.7 注入嵌套Bean305
4.5.8 注入集合值306
4.5.9 組合屬性311
4.5.10 Spring的Bean和JavaBean312
4.6 Spring的Java配置管理313
4.7 創建Bean的三種方式316
4.7.1 使用構造器創建Bean316
4.7.2 使用靜態工廠方法創建Bean317
4.7.3 使用實例工廠方法創建Bean319
4.8 深入理解容器中的Bean321
4.8.1 抽象Bean與子Bean322
4.8.2 Bean繼承與Java繼承的區別323
4.8.3 容器中的工廠Bean323
4.8.4 獲得Bean本身的id326
4.8.5 強制初始化Bean327
4.9 容器中Bean的生命周期327
4.9.1 依賴關係注入之後的行為328
4.9.2 Bean銷毀之前的行為330
4.9.3 協調作用域不同步的Bean332
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章 深入使用Spring359
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和@Lazy374
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的AOP392
5.4.1 為什麼需要AOP393
5.4.2 使用AspectJ實現AOP394
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 使用@Transactional442
5.7 Spring整合MyBatis443
5.7.1 整合MyBatis的關鍵點及快速入門443
5.7.2 配置SqlSessionFactory448
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 配置默認Servlet483
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註解與MultiValueMap516
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和RedirectAttributes541
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 API566
6.9.5 使用WebRequest和NativeWebRequest偽訪問567
6.9.6 使用@CookieValue獲取cookie值569
6.9.7 在處理方法中使用IO流571
6.10 本章小結573
第7章 深入使用Spring MVC574
7.1 國際化575
7.1.1 國際化到底怎么做575
7.1.2 根據瀏覽器請求頭確定Locale577
7.1.3 根據session確定Locale582
7.1.4 根據cookie值確定Locale586
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定義異常Aspect599
7.2.6 使用@RestControllerAdvice定義異常Aspect600
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 自定義PropertyEditor619
7.4.4 使用WebBindingInitializer註冊全局PropertyEditor621
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 使用Quartz693
8.5.2 在Spring中使用Quartz698
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
5.3.3 使用Resource作為屬性388
5.3.4 在ApplicationContext中使用資源389
5.4 Spring的AOP392
5.4.1 為什麼需要AOP393
5.4.2 使用AspectJ實現AOP394
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 使用@Transactional442
5.7 Spring整合MyBatis443
5.7.1 整合MyBatis的關鍵點及快速入門443
5.7.2 配置SqlSessionFactory448
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 配置默認Servlet483
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註解與MultiValueMap516
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和RedirectAttributes541
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 API566
6.9.5 使用WebRequest和NativeWebRequest偽訪問567
6.9.6 使用@CookieValue獲取cookie值569
6.9.7 在處理方法中使用IO流571
6.10 本章小結573
第7章 深入使用Spring MVC574
7.1 國際化575
7.1.1 國際化到底怎么做575
7.1.2 根據瀏覽器請求頭確定Locale577
7.1.3 根據session確定Locale582
7.1.4 根據cookie值確定Locale586
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定義異常Aspect599
7.2.6 使用@RestControllerAdvice定義異常Aspect600
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 自定義PropertyEditor619
7.4.4 使用WebBindingInitializer註冊全局PropertyEditor621
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