Java Enterprise in a Nutshell

Java Enterprise in a Nutshell

還記得在學生時代因為升學壓力的影響,手邊除了上課所用的標準教材以外,還會有不少課外補充教材(當時所謂的參考書),像是什麼《國文全方位考前總複 習》、《歷史考前秘笈總整理》等,這類型的書籍標榜著一書到位,以最短的時間研讀之後便可以克服所有難題,成為「無敵」、「領先」、「超群」且「最高水 準」的優秀者。

一本書將J2EE吃到飽,俗擱大碗

當然在IT領域也有類似的書籍出現,程式開發人員常會因為同時需要接觸多種不同技術,加上J2EE相關技術算是程式開發中相對複雜的課題,光是一 堆技術黑話(專有名詞),時常會讓剛剛接觸J2EE的開發人員望之卻步,要能順利上手,運用在實際工作上更是不容易,所以若有一本可以提供開發人員快速上 手的寶典,相信必然會受到開發人員的歡迎。

O’reilly的《In A Nutshell》系列一直是程式設計中實作建議的經典書籍,像是各位已經耳熟能詳的《Java In A Nutshell》(噲炙人口的虎頭書)、《Java Foundation Classes in a Nutshell》等。此系列的書籍其特色在於觀念簡單清楚,搭配簡短的程式範例說明,讓讀者能夠快速上手,針對己身的需求及用途進行修改。本書的設計理 念亦著重在利用程式說明技術重點,而非逐一說明Java API方式,在實務上的參考價值頗高。

篇幅精簡但不失深度

本書的特色是內容的著墨廣度甚於深度,只要跟J2EE有關的主題都會被納入此書,但每個主題討論的內容,雖然篇幅不多但針針見血。除了基本觀念的 簡明闡述外,佐以簡單的程式範例逐步說明讓讀者體會技術的實作細節,若還想深入某個主題或是要精通某項特別的技術,則可以參考其他專題書。所以筆者覺得本 書適合以下的讀者閱讀:

● 已經從事Java程式開發工作一陣子,想花點時間溫故知新者
● 對J2EE領域的相關技術還不是十分熟悉,想做個概括性通盤的了解
● 常常聽到同事們聊到一些J2EE技術名詞,卻始終搞不清楚那是什麼意思的求知若渴者
● 不太清楚J2EE 1.4版又多了那些新功能,想透過書本快速瀏覽的Java老鳥
● 想尋找一本J2EE完整的工具書,遇到問題時可以立即派上用場

《Java Enterprise in a Nutshell》至今已經推出到第三個版本,當然內容的更新與J2EE標準本身的版本有關(本書以1.4版為主要內容),另外本書亦納入與J2EE關係 密切,也十分流行的開放源碼框架(像是JUnit、Structs、Hibernate、XDoclet等),提供了不少章節,這些開放源碼雖然未被納入 J2EE的標準之中,但其對於Java社群及業界的影響力仍不容忽視。

本書內容分為三大部份,第一部份針對Java Enterprise API討論。雖然名為API介紹,但作者拋棄了過往食之無味且消化不良像字典般的API參考手冊寫作方式,而是以技術主題方式帶入實作重點。而章節順序的 安排亦從應用系統的呈現層開始(Servlet/JSP/JSFs),到商業邏輯層(EJB/Security/Transaction),到資料層 (JDBC/JMS/JavaMail/XML),及整合層(EAI/JMS/Web Services/RMI/COBRA),方便讀者深入淺出閱讀。

開放源碼亦納入本版內容

而第二部份則著重在非J2EE標準API的開放源碼(Open Source)軟體框架及開發工具上,這些技術也是在參與J2EE開發時不可避免的課題,從程式碼建構(Ant)、單元測試工具(JUnit)、Web展 現層的MVC軟體框架(Structs)、資料層的永續機制(Hibernate)、以及XDoclet等。

第三部份則是彙整了與J2EE技術相關的參考手冊,內容整理了與除了API以外,J2EE技術所需的實作細節。包括許多部署描述檔 (Deployment Descriptor)的撰寫、JSF標籤(Tag Libraries)的使用、EJB-QL的查詢語法、與關連式資料庫之間的SQL語法使用方式、訊息過濾時所需要使用的JMS Selector語法、與RMI、IDL有關的工具程式使用方法等。

想要有一本可以快速導覽J2EE技術的書籍,無論是當成自修或參考,本書會是你的最佳良伴。

在幾年前若你是搞J2EE,並用上EJB(Enterprise Java Bean)技術,會被人投以欽羨崇拜的眼光,J2EE有如專業與高手的代名詞,常被人遠觀而不可褻玩焉。J2EE會被認為是個艱深難懂,挑戰層次頗高的複 雜技術,其中又以EJB的相關技術,名列J2EE排行榜榜首。難道J2EE的應用程式非得搞得這麼不易近人嗎?光設計一個EJB就得實作三個標準介面,多 出了不少程式碼需要撰寫,如此在規劃大型應用系統時,程式數量是相當可觀的,從設計到測試的成本實在令開發者汗顏。

EJB技術門檻高,想學好還真的不容易

想當初筆者剛開始研究EJB時(應該是1.1版吧),光搞懂EJB整個技術架構就花了不少時間,還好當時拜讀《Mastering Enterprise JavaBeans》釐清了不少觀念,該書算是當時EJB技術領域實屬難得的好書之一。作者Ed Roman以流暢的文筆及有系統的章節編排,詳細介紹整個EJB技術及建議的實作方針,廣度與深度並俱,可以讓新手循序漸進地學習,目前已經出到第三版, 是開發人員在撰寫EJB時值得參考的一本實戰指南。

由於開發EJB相關應用程式實屬不易,J2EE開發人員常透過強大的Java IDE開發工具(像是Eclipse、Borland JBuilder、IBM WSAD等),甚至搭配類似XDoclet的程式產生器,協助快速開發EJB元件,不過這些工具雖然可以少去撰寫一部份的EJB程式碼,但問題是EJB元 件測試都必須佈署到Container後才能進行,造成整個開發過程時間拉長,加上採用不同廠商的Application Server產品時,也許又會發生不同的問題,常常讓開發人員一個頭兩個大,挫折感油然而生。

以銅為鏡正衣冠,以人為鏡明得失

許多同好在開發EJB時常常碰釘子,所以你會發覺在坊間的書籍中、網路社群討論的話題裡、或是Java技術研討會中,找到或聽到許多已經被 J2EE凌虐多時的專家先進們,提出不少前車之鑑避免重蹈覆轍的良心建議,繞過費時費力的開發方式。不管是在設計模式(Design Patterns)或最佳實踐方案(Best Practices)的議題上,在當時整個J2EE的核心技術尚未能有革命性的突破時,這些都被視為設計J2EE應用系統的架構聖經,必須詳細拜讀且乖乖 遵循才行,因為實在是被惡搞到怕了。

討論J2EE設計模式的書籍中,以最具代表性的《Core J2EE Patterns:Best Practices and Design Strategies》為經典,本書作者Deepak Alur等專家分別針對J2EE的不同層面(Presentation、Business、Integration)來進行因素分解,利用J2EE本身技 術的特性,列舉出適合的設計模式讓讀者參考,闡述每個模式的使用時機及其優劣之處,為四人幫《Design Patterns》之後,在J2EE領域談論設計模式之先例。

要用EJB,看看專家怎麼說?

而在《EJB Design Patterns》書中,作者Floyd Marinescu提出了許多在實務上,設計EJB時常用到的設計模式。由於EJB本身的技術特性,在實務設計上針對各種不同的情境及狀況(像是 Session Facade、Data Transfer Object等設計方式),作者都提出了建議的做法。

值得令人玩味的是,該書第八章亦提出了非Entity Bean的Persistence解法(JDBC/DAO或JDO),尤其在大量資料存取的情境下,可能會因為產生過多的Entity Bean而影響效能,作者已經試圖以非EJB技術來處理相關問題。Bruce A. Tate在《Bitter EJB》書中更是以反向思考的方式,討論實作EJB技術時,應該避開的設計陷阱,提出對於EJB技術適當的使用時機,強調EJB並非解決所有難題的唯一途 徑,需要謹慎考慮評估。

在一些中小型規模的軟體專案中,EJB技術中較常被採用的以Stateless Session Bean較多,而Stateful Session Bean、Container Managed Persistence Entity Bean反倒是乏人問津,在抽象化的物件設計來看,Entity Bean很難直接表示領域物件(Domain Object)的需求,因為它在物件與關連式資料庫之間對應(O/R Mapping)的機制上仍然有不少限制,像是不易表達資料表之間較複雜的關連性,無法直接滿足領域物件的需求,讓Entity Bean在設計階段時,物件數量居高不下,不太合乎設計抽象化的基本精神。慢慢地,Entity Bean的採用率愈來愈低,取而代之的是簡單的DAO設計模式。

J2EE + Design Patterns =消化不良?

換個角度來思考Design Pattern及Best Practices背後代表的意義,這些即是累積了前人的不斷試誤歸納而成的經驗法則,這樣的經驗在技術門檻高的狀況下需求更是殷切,入門級的新手想要快速上手,便得乖乖的跟隨著前輩的腳步,以免誤入歧途。

所以你會發現前些時間只要書名掛上這些字眼的都賣得不差,突然之間大家都開始重視這模式導向設計(Pattern-Driven Design)的議題,這也是千百個不願意呀!不過設計模式本身亦是個抽象度極高的概念,對一個缺乏實務經驗的入門級開發者,同時要吸收J2EE技術及設 計模式,消化不良是必然的。

Nissan March再怎麼保養,吃再好的機油,駕駛員技術再好,跑起來還是不可能比Mercedes-Benz來得快。不過就算這些大師們提出了不少值得參考的見 解,但在EJB技術架構不變的大前提下,能夠改善的空間仍然十分有限。前提是Nissan March與Mercedes-Benz訴求重點並不儘相同,將他們直接拿來做比較,是稍嫌殘忍了點。

殺雞焉用牛刀?

真的複雜的需求只有透過EJB才能解決嗎?單純以POJO(Plain Old Java Objects)的方式也難以實現嗎?有沒有其他的軟體框架可以取代EJB Container?相信這些問題都是當時許多J2EE開發者一直想了解的。

所以有些專家們受不了被EJB不斷荼毒,便開始有一些替代技術紛紛出現。最先針對EJB Entity Bean機制有了iBATIS、JDO(Java Data Objects)、Hibernate等開放源碼框架,簡單地透過POJO的核心,發揮物件關聯對應關係(ORM、Object Relational Mapping)的功能,其中包括了在應用程式對資料庫進行存取時最重要的資料永續(Database Persistence)及交易管理(Transaction)機制。

這些技術都秉持著輕薄短小的特色,完完全全推翻了原本EJB Entity Bean肥厚的複雜作法,省略了Bean複雜的生命週期,去掉了繁瑣的佈署描述檔,而且提供了對於關連式資料庫的資料抽象化功能,讓應用系統對資料庫的存 取直接對領域物件操作,物件的設計更能符合抽象化的概念,大幅減少開發人員所需花費的時間。

另外在傳統物件之間依序性的關係,也被注入新的行為模式。IoC(Inversion of Control)、DI(Dependency Injection)、AOP(Aspect-Oriented Programming)陸續被廣泛討論,物件導向設計的概念又有了革命性的思維。利用宣告XML組態檔的方式來定義物件之間的關係,讓物件之間耦合性 (Coupling)更低,更能發揮物件重用的精神。相關的軟體框架也陸續被推廣使用,像是AspectJ、PicoContainer、Avalon 等,最有名的不外乎被公認是「春天來了」且令人「如沐春風」的Spring Framework了。

J2EE邁向輕量級發展的重要里程碑

在《Expert One-on-One J2EE Development without EJB》一書中,作者Rod Johnson(Spring Framework之父)從EJB的演進史開始,探討為何這樣的技術一直未被市場廣泛接受的原因,質疑EJB這個複雜技術的必要性,開宗明義就提出不需要 用EJB,也可以設計出企業級的應用系統,當然這裡提到的另類解法便是Spring Framework。由於作者親身參與Spring的發展歷程,書中提出許多十分精闢的見解,值得讀者深思。在他的另一著作《Professional Java Development with the Spring Framework》中,對此技術有更深入的介紹。

而在《Better, Faster, Lighter Java》中,作者Bruce Tate也不約而同站在同一陣線,倡導如何以更輕薄,更簡潔的方式,來達成J2EE應用系統的瘦身計畫。他指出開發人員常會使用過度複雜的技術,只是用於 解決十分簡單的需求,而落入技術本位的迷思中。在他的書中更是將Spring及Hibernate這些輕量級的軟體框架視為EJB的替代方案,並配合敏捷 開發(Agile Development)及XP極限軟體製程(eXtreme Programming)將開發流程調整得更有效率。

Java界颳起POJO的極簡風

根據Martin Fowler、Rebbecca Parsons,及Josh MacKenzie在2000年提出的想法,POJO是一個未實作任何特定介面(Interface)的Java元件,其結構簡單且易於實作。當時這些專 家提出取代Entity Bean的作法,希望以一個特殊的名稱來代表這樣的精神,同時希望能被廣為流傳,故以POJO為命名。

而作者Chris Richardson在《POJOs in Action》書中亦提到POJO的本質,是讓開發人員容易進行程式撰寫、功能測試、維護及需求變更等工作,使整個開發流程趨於簡單快速,避免因為技術複雜度過高,引發太多的不確定風險,進而有效提高生產力。

在《POJOs in Action》書中便提到如何結合當今流行的輕量級軟體框架,將POJO的設計理念套用在J2EE架構上。與傳統EJB技術相較之下,POJO降低了開發 所會面臨的複雜度,而且執行時期的環境也擺脫了厚重的EJB Container,在系統資源上更能有效運用。

更能專注在商業邏輯的設計

採用POJO真的可以減少開發人員的負擔嗎?《POJOs in Action》書中一開始便以傳統銀行轉帳的範例,說明利用POJO與EJB之間進行系統設計及開發方式的差異,從設計模式、資料永續機制、交易管理、到 最後的部署,POJO突破了EJB受限於僅能在EJB Container中運行的限制,既有的程序化開發方式,讓你更能專注於商業邏輯元件的設計開發,而不會因為受限於Container的機制而彆手彆腳。 而在決定採用POJO或者EJB 2.1時,本書亦透過範例來逐步分析,討論在設計階段所必須要考慮到的重點,這些重點則直接影響選用的技術為何。

由於先天特性的不同,當以POJO為主要設計方向時,整個設計決策亦與傳統的EJB架構有所不同。作者一直反覆提醒讀者的領域模型(Domain Model Pattern),則為採用POJO方式進行開發時所必須重視的,因為領域模型為設計架構的重要來源,系統架構統一以領域物件做為操作的對象,可以讓系統 更為單純容易。透過輕量級的資料永續框架,直接將領域物件轉化成POJO程式碼,且完成與資料庫之間的對應關係,更能符合Domain Model的精神。

多種資料永續機制供你選擇

企業應用系統免不了在與資料庫之間,作者針對建立動態資料查詢機制,交易鎖定及同步存取管理都有專章說明。本書分別搭配不同的軟體框架 (iBATIS、JDO、Hibernate、EJB3)來實作,而非僅限於一種解法,可以感受到作者的用心良苦,讓讀者可以從中比較之外,也可以客觀分 析彼此之間的差異。而作者精確的分析內容,也讓提出的論點及整個實作結果更具可信度及參考價值。

POJO的重新被重視,代表著J2EE輕量化的時代來臨,Spring Framework的意氣風發,使得EJB的發展也受到影響,EJB 3.0也不得不將POJO的設計理念納入核心架構中。在本書的第十章亦介紹了EJB 3.0的新功能,以及和以往設計的相異之處,並且說明了透過EJB 3.0與POJO實作的細節,讓讀者可以了解EJB3的新面貌。

KISS: Keep It Simple & Smart

延續著《Expert One-on-One J2EE Development without EJB》、《Better, Faster, Lighter Java》等書的中心思想,本書除了的基本論調與這兩本書雷同外,另加入更多在設計建議及實作細節的內容,詳細的程式碼,讓讀者可以一步步體會作者欲表達 的真正理念。

當然,每一項技術都有其優劣之處,POJO也不例外。也因為透過宣告組態檔來定義物件之間的關聯性,若你已採用Spring Framework進行軟體開發,面對功能點較多或規模較大的應用系統時,維護冗長複雜的組態檔也是令人十分頭大。大家也不需要因為業界流行,過度吹捧 Spring、Hibernate的優點,重點是依你的需求選擇合適的技術架構。技術本身是無罪的,端看你如何在正確的時機運用它。

另外,在Spring Framework與其他輕量級軟體框架尚未列入J2EE官方標準前,社群的力量固然重要,但商業軟體大廠的加持與背書更是需要,畢竟市場使用的普遍性仍需要標準來主導,讓好用的技術能夠成為真正的主流,這才是Java普羅大眾的福祉。

Art of Java Web Development

Art of Java Web Development

前一陣子有個好友P先生問我:「Struts跟Tapestry兩個Framework那個比較好?」像這樣類似的問題相信您也曾經遇到,後來想到有本書《Art of Java Web Development》恰好可以拿來解答!

就Java這個技術領域來說,Java Servlet、JSP及Custom Tag是最主要的Web開發技術,在MVC(Model,View,Controller)觀念不斷倡導下,許多開放源碼社群便將這樣的觀念落實到Web Framework上,像Struts就是一個典型的例子。但與Web相關的開放原碼框架(Web Framework)種類十分繁多,每個框架都有自己的特色及適用的時機,要好好發揮是需要套用合適的Web Framework,以利未來擴充及維護。

通常知名的Java Web Framework有以下共通特性:
● 採用XML為其組態檔格式,用來控制網頁流程及實作元件之宣告。
● 實作時必須繼承或實作Framework所定義的類別或介面。
● 允許透過標準介面與其他J2EE Framework輕易整合
● 可以自行改寫原始碼,做出適用於自身需求的新框架

介紹加上評估,實作參考價值高

本書內容分三大部份,第一部份先針對Java開發Web應用系統的歷史沿革進行簡要回顧,作者說明欲開發一個頂尖水準的Web應用系統應該注意的 事項,強調設計模式(Design Patterns)的重要性,在架構設計時導入合適的Web框架,並遵循最佳實踐方案(Best Practices)以避免錯誤及降低風險。另外亦提到在實作時使用的相關技術,包括Java Servlet、JSP、及Custom JSP Tag,亦針對這些方式分別評估其利弊及優劣分析,最後便談論Model 2的設計方式,建議讀者以MVC架構您的Web Application。

第二部份便分別介紹時下較知名的Java Web Framework,包括Apache Jakarta專案的 Struts,Tapestry,Velocity,Cocoon,Open Symphony專案的WebWork,JBuilder中的InternetBean Express等。作者設計了一個時程表(Schedule)的範例,包括行程新增、檢視、資料驗證等功能,分別透過這些不同的Web Framework來實作,讓讀者可以方便比較彼此之間實作上的差異性。針對每個Web Framework都會提到該軟體架構,包含的主要組成元件,及作者對這些Framework的評估結果,提供讀者在使用這些框架時之參考。

在了解每個Web Framework的特性之後,相信您心裡對於採用那一個Framework應該有些眉目,但在開發過程中免不了會遭遇到一些常見的問題需要解決,像是網 頁流程設計、使用者界面設計、效能調校、系統資源配置、測試及除錯等議題。第三部份便討論在建構Web應用系統時之最佳實踐方案。在這個部份作者利用電子 商務網站範例(eMotherEarth.com)來說明建議的實作技巧,並搭配程式碼輔助說明。另外亦介紹了相關的Open Source工具(像是JUnit,Log4J)來輔助開發。本部份的章節相當精彩,讀者必然不可錯過!

妥善評估,選擇合適的Framework

至於您要採用那個Framework,評估的重點可以分別由架構本身的擴充性,架構本身研發的速度及維護的週期來檢視,而文件的完整性、社群參與 程度亦是開發人員需要重視之處,是否提供配套的工具軟體(像是一些知名開發平台的Plug-in)對開發效率影響甚鉅;Framework本身是否遵循良 好的設計原則,所採用的技術是否創新,也會是評估的重點。

導入Framework也許會比較費事,因為Framework的價值在於它已完整定義基礎框架及所需的基本元件,開發人員必須遵循它所定義的規則來實作內容。但在規模較大而且經常進行內容更新的的網站系統,導入Framework的效益就很容易被彰顯出來。

本書原則上是對每個Web Framework進行概要性介紹及適用性評估,由於篇幅有限,更細部的實作方式不會在本書過多著墨,您可以參考對應的專書或技術文件,Manning的《In Action》系列書籍即可以提供您滿意的答案。

Follow

Get every new post delivered to your Inbox.