本書是《輕量級Java EE企業應用實戰》的第5版,這一版保持了前幾版內容全面、深入的特點,主要完成全部知識的升級。本書介紹了Java EE領域的四個開源框架和技術:Struts 2、Spring、Hibernate和JPA。其中Struts 2升級到2.5.14,Spring升級到5.0.2,Hibernate升級到5.2.12。第5版新增介紹了JPA的內容,包括其API的基本用法、JPA查詢、JPA動態條件查詢等。本書還全面介紹了Servlet 3.1的新特性,以及Tomcat 8.5的配置和用法,本書的示例也應該在Tomcat 8.5上運行。本書重點介紹了如何整合Struts 2.5 Spring 5.0 Hibernate 5.2進行Java EE開發,主要包括三部分。*部介紹了Java EE開發的基礎知識,以及如何搭建開發環境。第二部分詳細講解了Struts 2.5、Spring 5.0、Hibernate 5.2、JPA的用法,在介紹三個框架時,以Eclipse IDE的使用來上手,一步步帶領讀者深入這些技術的核心。這部分內容是筆者講授瘋狂Java實訓的培訓講義,因此是本書的重點部分。這部分內容既包含了筆者多年開發經歷的領悟,也融入了豐富的授課經驗。第三部分示范開發了一個包含7個表,表之間具有復雜的關聯映射、繼承映射等關系,且業務也相對復雜的工作流案例,希望讓讀者理論聯系實際,將三個框架真正運用到實際開發中。該案例采用目前非常流行、規范的Java EE架構,整個應用分為領域對象層、DAO層、業務邏輯層、MVC層和視圖層,各層之間分層清晰,層與層之間以松耦合的方式組織在一起。該案例既提供了與IDE無關的、基于Ant管理的項目源碼,也提供了基于Eclipse IDE的項目源碼,以*限度地滿足讀者的需求。本書不再介紹Struts 1.x相關內容,如果讀者希望獲取《輕量級Java EE企業應用實戰》第1版中關于Struts 1.x的知識,請登錄http://www.crazyit.org下載。當讀者閱讀此書遇到技術難題時,也可登錄http://www.crazyit.org發帖,筆者將會及時予以解答。在閱讀本書之前,建議先認真閱讀筆者所著的《瘋狂Java講義》一書。本書適合于有較好的Java編程基礎,或者有初步JSP、Servlet基礎的讀者閱讀。本書尤其適合于對Struts 2、Spring、Hibernate了解不夠深入,或者對Struts 2 Spring Hibernate整合開發不太熟悉的開發人員閱讀。
1.軟件版本新!計算機圖書所涉及軟件版本的重要性不言而喻
本書基于Spring 5,Struts2.5.14,Hibernate 5.2.12,新增JPA的內容,還介紹了Servlet 3.1的新特性以及Tomcat 8.5。
2. 名師名家作品
李剛老師一向是品質的保證,所創作的專業作品深受讀者好評,所培訓學生中有不少人入職騰訊、阿里、唯品會等IT名企。
3. 圖書的附加值超燃
DVD光盤中包含超長視頻、豐富代碼等內容。為讀者提供用于學習交流的配套網站、微信群、QQ群。
4. 經驗豐富,針對性強
作者既擔任過軟件開發的技術經理,也擔任過軟件公司的培訓導師,還從事過職業培訓的專職講師。這些經驗影響了作者寫書的目的,這不是一本學院派的理論讀物,而是一本實際的開發指南。
5.內容實際,實用性強
《輕量級Java EE企業應用實戰》所介紹的Java EE應用范例,采用了目前企業流行的開發架構,嚴格遵守Java EE開發規范,而不是將各種技術雜亂地糅合在一起。
6.高屋建瓴,啟發性強
《輕量級Java EE企業應用實戰》介紹的幾種架構模式,幾乎是時下常見的多種Java EE架構模式,有助于提升讀者對系統架構設計的把握。
前 言
經過多年沉淀,Java EE平臺已經成為電信、金融、電子商務、保險、證券等各行業的大型應用系統的首選開發平臺。在企業級應用的開發選擇上,.Net已趨式微,PHP通常只用于開發一些企業展示站點或小型應用,因此這些開發語言、開發平臺基本上已無法與Java EE進行對抗了。
Java EE開發大致可分為兩種方式:以Spring為核心的輕量級Java EE企業開發平臺;以EJB 3 JPA為核心的經典Java EE開發平臺。無論使用哪種平臺進行開發,應用的性能、穩定性都有很好的保證,開發人群也有很穩定的保證。
本書介紹的開發平臺,就是以Struts 2.5 Spring 5.0 Hibernate 5.2/JPA(在實際項目中可能以MyBatis代替Hibernate/JPA)為核心的輕量級Java EE,這種組合在保留經典Java EE應用架構、高度可擴展性、高度可維護性的基礎上,降低了Java EE應用的開發、部署成本,對于大部分中小型企業應用是首選。在一些需要具有高度伸縮性、高度穩定性的企業應用(比如銀行系統、保險系統)中,以EJB 3 JPA為核心的經典Java EE應用則具有一定的占有率。本書姊妹篇《經典Java EE企業應用實戰》主要介紹了后一種Java EE開發平臺。
本書主要升級了《輕量級Java EE企業應用實戰》的知識。本書采用最新的Tomcat 8.5作為Web服務器,全面而細致地介紹了Servlet 3.1的新特性,并將Struts 2升級到Struts 2.5.14,將Spring升級到5.0.2,將Hibernate升級到5.2.12。本書詳細介紹了Spring和Hibernate的零配置特性,并充分介紹了Struts 2的Convention(約定)支持。為了順應技術的改變,本書介紹的Hibernate持久化映射已經全部升級為注解方式,不再采用傳統的XML映射方式。本書還詳細介紹了Spring 3.1新增的緩存機制,包括使用@Cacheable執行緩存,使用@CacheEvict清除緩存等,也詳細介紹了Spring 5.0的改變,包括Spring 5.0引入的@NonNull、@NonNullApi、@NonNullFields等新注解。
Hibernate 5.x的變化較大,Hibernate進一步向JPA規范靠攏,它的不少API都借用于JPA規范。此外,Hibernate將自身的動態條件查詢API標記為過時(未來會刪除它們),全面改為使用JPA的動態條件查詢API。因此,本書同時介紹了Hibernate 5.2和JPA規范的用法,包括Hibernate API與JPA API之間的對應關系,使用Hibernate與JPA的區別,并詳細介紹了JPA的基本用法、JPA批量操作、JPQL查詢、JPA動態條件查詢等,讀者可通過本書同時掌握Hibernate和JPA的用法。
本書創作感言
筆者首先要感謝廣大讀者對本書前幾版的認同,本書前幾版累計發行十幾萬冊,并獲得中國書刊發行業協會頒發的2011年度全行業優秀暢銷品種大獎,且多次獲得電子工業出版社頒發的最暢銷圖書獎。是廣大讀者的選擇讓瘋狂Java體系圖書大放異彩;是廣大讀者的支持讓我在孤獨的技術創作道路上堅持求索;是廣大讀者的反饋讓瘋狂Java體系圖書日臻完美。
廣大讀者的熱情對我來說既是支持,又是責任瘋狂Java體系圖書有責任必須完美!因此筆者在改進、升級瘋狂Java體系圖書時,有一種如履薄冰的感覺,希望以最大的努力來貢獻最好的作品。
另外,本書還有一本配套的姊妹篇:《經典Java EE企業應用實戰》。學習本書時可以采用輕經合參的方式來學習輕指的是以SSH整合的輕量級Java EE開發平臺,經指的是以EJB3 JPA整合的經典Java EE開發平臺;這兩種平臺本身具有很大的相似性,將兩種Java EE開發平臺結構放在一起參考、對照著學習,能更好地理解Spring、Hibernate框架的設計思想,從而更深入地掌握它們。與此同時,也可以深入理解EJB 3與Spring容器中的Bean、EJB容器與Spring容器之間的聯系和區別,從而融會貫通地掌握EJB 3 JPA整合的開發方式。
在介紹非常專業的編程知識之時,筆者總會通過一些淺顯的類比來幫助讀者更好地理解。簡單、易讀成為筆者一貫堅持的創作風格,也是瘋狂Java體系圖書的特色。另外,瘋狂Java體系圖書的知識也很全面、實用。筆者希望讀者在看完瘋狂Java體系圖書之后,可以較為輕松地理解書中所介紹的知識,并切實學會一種實用的開發技術,進而將之應用到實際開發中。如果讀者在學習過程中遇到無法理解的問題,可以登錄瘋狂Java聯盟(http://www.crazyit.org)與廣大Java學習者交流,筆者也會通過該平臺與大家一起交流、學習。
本書有什么特點
本書保持了《輕量級Java EE企業應用實戰》前幾版簡單、實用的優勢,同樣堅持讓案例說話,以案例來介紹知識點的風格。本書最后同樣示范開發了企業工作流案例,希望讀者通過該案例真正步入實際企業開發的殿堂。
本書依然保留了《輕量級Java EE企業應用實戰》前幾版的三個特色。
1.經驗豐富,針對性強
筆者既擔任過軟件開發的技術經理,也擔任過軟件公司的培訓導師,還從事過職業培訓的專職講師。這些經驗影響了筆者寫書的目的,本書不是一本學院派的理論讀物,而是一本實際的開發指南。
2.內容實際,實用性強
本書所介紹的Java EE應用范例,采用了目前企業流行的開發架構,絕對嚴格遵守Java EE開發規范,而不是將各種技術雜亂地糅合在一起號稱Java EE。讀者參考本書的架構,完全可以身臨其境地感受企業實際開發。
3.高屋建瓴,啟發性強
本書介紹的幾種架構模式,幾乎是時下最全面的Java EE架構模式。這些架構模式可以直接提升讀者對系統架構設計的把握。
本書寫給誰看
如果你已經掌握Java SE內容,或已經學完了《瘋狂Java講義》一書,那么你非常適合閱讀此書。除此之外,如果你已有初步的JSP、Servlet基礎,甚至對Struts 2、Spring 5.0、Hibernate 5.2、JPA有所了解,但希望掌握它們在實際開發中的應用,本書也將非常適合你。如果你對Java的掌握還不熟練,則建議遵從學習規律,循序漸進,暫時不要購買、閱讀此書,而是按照《瘋狂Java學習路線圖》中的建議順序學習。
2018-1-10
李剛,十余年軟件開發從業經驗,瘋狂軟件教育中心教學總監。瘋狂Java實訓營創始人,瘋狂Java體系原創圖書作者。廣東技術師范學院計算機科學系兼職副教授,CSDN特邀講師。培訓的學生已在騰訊、阿里、華為、IBM、網易、唯品會、電信盈科等名企就職。國內知名高端IT技術圖書作家,已出版《瘋狂Java講義》《瘋狂Android講義》《輕量級Java EE企業應用實戰》《瘋狂前端開發講義》《瘋狂HTML5/CSS3/JavaScript講義》《瘋狂iOS講義(基礎篇)(提高篇)》《瘋狂XML講義》《經典JavaEE企業應用實戰》《Struts 2.x quanwei指南》等著作。其中瘋狂Java體系圖書均已沉淀多年,贏得極高的市場認同,多次重印,多部著作印刷數量超過10萬冊,并被多所985211院校選作教材,部分圖書已被翻譯成繁體中文版,授權到中國臺灣地區。
第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 3.x和JavaBean及替代技術5
1.2.2 Struts 2.5及替代技術5
1.2.3 Hibernate 5.2及替代技術6
1.2.4 Spring 5.0及替代技術6
1.3 Tomcat的下載和安裝7
1.3.1 安裝Tomcat服務器8
1.3.2 配置Tomcat的服務端口9
1.3.3 進入控制臺9
1.3.4 部署Web應用12
1.3.5 配置Tomcat的數據源12
1.4 Eclipse的安裝和使用14
1.4.1 Eclipse的下載和安裝14
1.4.2 在線安裝Eclipse插件15
1.4.3 從本地壓縮包安裝插件17
1.4.4 手動安裝Eclipse插件17
1.4.5 使用Eclipse開發Java EE應用17
1.4.6 導入Eclipse項目20
1.4.7 導入非Eclipse項目21
1.5 Ant的安裝和使用22
1.5.1 Ant的下載和安裝23
1.5.2 使用Ant工具23
1.5.3 定義生成文件25
1.5.4 Ant的任務(task)29
1.6 Maven的安裝和使用31
1.6.1 下載和安裝Maven31
1.6.2 設置Maven32
1.6.3 創建、構建簡單的項目33
1.6.4 Maven的核心概念36
1.6.5 依賴管理41
1.6.6 POM文件的元素43
1.7 使用SVN進行協作開發44
1.7.1 下載和安裝SVN服務器45
1.7.2 配置SVN資源庫45
1.7.3 下載和安裝SVN客戶端47
1.7.4 將項目發布到服務器47
1.7.5 從服務器下載項目48
1.7.6 提交(Commit)修改48
1.7.7 同步(Update)本地文件48
1.7.8 添加文件和目錄49
1.7.9 刪除文件和目錄50
1.7.10 查看文件或目錄的版本變革50
1.7.11 從以前版本重新開始50
1.7.12 創建分支51
1.7.13 沿著分支開發51
1.7.14 合并分支52
1.7.15 使用Eclipse作為SVN客戶端52
1.8 使用Git進行軟件配置管理(SCM)55
1.8.1 下載和安裝Git、TortoiseGit56
1.8.2 創建本地資源庫58
1.8.3 添加(Add)文件和目錄59
1.8.4 提交(Commit)修改60
1.8.5 查看文件或目錄的版本變更61
1.8.6 刪除文件和目錄62
1.8.7 從以前版本重新開始62
1.8.8 克隆(Clone)項目63
1.8.9 創建分支64
1.8.10 沿著分支開發64
1.8.11 合并分支65
1.8.12 使用Eclipse作為Git客戶端65
1.8.13 配置遠程中央資源庫67
1.8.14 推送(Push)項目69
1.8.15 獲取(Fetch)項目和拉取(Pull)項目70
1.9 本章小結72
第2章 JSP/Servlet及相關技術詳解73
2.1 Web應用和web.xml文件74
2.1.1 構建Web應用74
2.1.2 配置描述符web.xml75
2.2 JSP的基本原理76
2.3 JSP的4種基本語法80
2.3.1 JSP注釋80
2.3.2 JSP聲明81
2.3.3 JSP輸出表達式82
2.3.4 JSP小腳本83
2.4 JSP的3個編譯指令85
2.4.1 page指令85
2.4.2 include指令89
2.5 JSP的7個動作指令90
2.5.1 forward指令90
2.5.2 include指令92
2.5.3 useBean、setProperty、getProperty指令93
2.5.4 plugin指令96
2.5.5 param指令96
2.6 JSP腳本中的9個內置對象96
2.6.1 application對象98
2.6.2 config對象103
2.6.3 exception對象105
2.6.4 out對象107
2.6.5 pageContext對象108
2.6.6 request對象109
2.6.7 response對象116
2.6.8 session對象120
2.7 Servlet介紹122
2.7.1 Servlet的開發122
2.7.2 Servlet的配置124
2.7.3 JSP/Servlet的生命周期125
2.7.4 load-on-startup Servlet126
2.7.5 訪問Servlet的配置參數127
2.7.6 使用Servlet作為控制器129
2.8 JSP 2的自定義標簽133
2.8.1 開發自定義標簽類133
2.8.2 建立TLD文件134
2.8.3 使用標簽庫135
2.8.4 帶屬性的標簽136
2.8.5 帶標簽體的標簽139
2.8.6 以頁面片段作為屬性的標簽141
2.8.7 動態屬性的標簽143
2.9 Filter介紹144
2.9.1 創建Filter類145
2.9.2 配置Filter146
2.9.3 使用URL Rewrite實現網站偽靜態149
2.10 Listener介紹150
2.10.1 實現Listener類151
2.10.2 配置Listener152
2.10.3 使用ServletContextAttributeListener153
2.10.4 使用ServletRequestListener和ServletRequestAttributeListener154
2.10.5 使用HttpSessionListener和HttpSessionAttributeListener155
2.11 JSP 2特性160
2.11.1 配置JSP屬性160
2.11.2 表達式語言162
2.11.3 Tag File支持170
2.12 Servlet 3新特性172
2.12.1 Servlet 3的注解172
2.12.2 Servlet 3的Web模塊支持172
2.12.3 Servlet 3提供的異步處理174
2.12.4 改進的Servlet API177
2.13 Servlet 3.1新增的非阻塞式IO180
2.14 Tomcat 8.5的WebSocket支持182
2.15 本章小結187
第3章 Struts 2的基本用法188
3.1 MVC思想概述189
3.1.1 傳統Model 1和Model 2189
3.1.2 MVC思想及其優勢190
3.2 Struts 2的下載和安裝191
3.2.1 為Web應用增加Struts 2支持191
3.2.2 在Eclipse中使用Struts 2192
3.2.3 增加登錄處理193
3.3 Struts 2的流程196
3.3.1 Struts 2應用的開發步驟196
3.3.2 Struts 2的運行流程197
3.4 Struts 2的常規配置198
3.4.1 常量配置198
3.4.2 包含其他配置文件204
3.5 實現Action204
3.5.1 Action接口和ActionSupport基類206
3.5.2 Action訪問Servlet API208
3.5.3 Action直接訪問Servlet API210
3.5.4 使用ServletActionContext訪問Servlet API212
3.6 配置Action212
3.6.1 包和命名空間213
3.6.2 Action的基本配置216
3.6.3 使用Action的動態方法調用217
3.6.4 指定method屬性及使用通配符219
3.6.5 配置默認Action224
3.6.6 配置Action的默認處理類225
3.7 配置處理結果225
3.7.1 理解處理結果225
3.7.2 配置結果226
3.7.3 Struts 2支持的結果類型227
3.7.4 plainText結果類型229
3.7.5 redirect結果類型230
3.7.6 redirectAction結果類型231
3.7.7 動態結果232
3.7.8 Action屬性值決定物理視圖資源232
3.7.9 全局結果234
3.7.10 使用PreResultListener235
3.8 配置Struts 2的異常處理236
3.8.1 Struts 2的異常處理機制236
3.8.2 聲明式異常捕捉238
3.8.3 輸出異常信息239
3.9 Convention插件與約定支持240
3.9.1 Action的搜索和映射約定241
3.9.2 按約定映射Result243
3.9.3 Action鏈的約定246
3.9.4 自動重加載映射247
3.9.5 Convention插件的相關常量247
3.9.6 Convention插件相關注解248
3.10 使用Struts 2的國際化248
3.10.1 視圖頁面的國際化249
3.10.2 Action的國際化250
3.10.3 使用包范圍的國際化資源251
3.10.4 使用全局國際化資源252
3.10.5 輸出帶占位符的國際化消息254
3.10.6 加載資源文件的順序256
3.11 使用Struts 2的標簽庫256
3.11.1 Struts 2標簽庫概述256
3.11.2 使用Struts 2標簽257
3.11.3 Struts 2的OGNL表達式語言258
3.11.4 OGNL中的集合操作260
3.11.5 訪問靜態成員261
3.11.6 Lambda(?)表達式261
3.11.7 控制標簽262
3.11.8 數據標簽271
3.11.9 主題和模板279
3.11.10 自定義主題281
3.11.11 表單標簽282
3.11.12 非表單標簽294
3.12 本章小結297
第4章 深入使用Struts 2298
4.1 詳解Struts 2的類型轉換299
4.1.1 Struts 2內建的類型轉換器299
4.1.2 基于OGNL的類型轉換300
4.1.3 指定集合元素的類型302
4.1.4 自定義類型轉換器304
4.1.5 注冊類型轉換器306
4.1.6 基于Struts 2的自定義類型轉換器308
4.1.7 處理Set集合308
4.1.8 類型轉換中的錯誤處理311
4.2 使用Struts 2的輸入校驗316
4.2.1 編寫校驗規則文件316
4.2.2 國際化提示信息319
4.2.3 使用客戶端校驗320
4.2.4 字段校驗器配置風格321
4.2.5 非字段校驗器配置風格322
4.2.6 短路校驗器324
4.2.7 校驗文件的搜索規則325
4.2.8 校驗順序和短路327
4.2.9 內建校驗器327
4.2.10 基于注解的輸入校驗337
4.2.11 手動完成輸入校驗339
4.3 使用Struts 2控制文件上傳342
4.3.1 Struts 2的文件上傳342
4.3.2 實現文件上傳的Action343
4.3.3 配置文件上傳的Action345
4.3.4 手動實現文件過濾347
4.3.5 攔截器實現文件過濾348
4.3.6 輸出錯誤提示349
4.3.7 文件上傳的常量配置350
4.4 使用Struts 2控制文件下載351
4.4.1 實現文件下載的Action351
4.4.2 配置Action352
4.4.3 下載前的授權控制352
4.5 詳解Struts 2的攔截器機制353
4.5.1 攔截器在Struts 2中的作用354
4.5.2 Struts 2內建的攔截器354
4.5.3 配置攔截器356
4.5.4 使用攔截器的配置語法357
4.5.5 配置默認攔截器358
4.5.6 實現攔截器類360
4.5.7 使用攔截器361
4.5.8 攔截方法的攔截器362
4.5.9 攔截器的執行順序365
4.5.10 攔截結果的監聽器366
4.5.11 覆蓋攔截器棧里特定攔截器的參數367
4.5.12 使用攔截器完成權限控制368
4.6 使用Struts 2的Ajax支持370
4.6