摘要:JavaServer Faces作為一種新興的Web表現層框架,正在受到越來越多的關注。本文描述了JSF的幾大優勢,以及這些優勢所帶來的Web開發的重大變革,從而試圖說明JSF將會在眾多競爭者中脫穎而出,成為Web表現層框架的主流。 1. 引子:我與JSF的第一次親密接觸
2004年3月,當我著手開發我的第一個Web程序時,我選擇了JSP.作為一個傳統的桌面程序員,而且是老程序員,向Web程序員的轉變是異常痛苦的。3個月的時間,程序總算完成了,但從此對JSP恨之入骨。凌亂的書寫格式,數據和界面的混雜,尤其是嵌入到頁面裡的Scriptlet,讓我搞不清自己是編程序的還是寫網頁的。
因此,當接到第二版的開發任務時,我毫不猶豫地放棄了JSP,尋找一種替代技術。上網一搜,卻發現框架多如牛毛,評論文章各執一詞,莫衷一是,讓我徹底迷失了。猶豫搖擺不定之際,sun的J2EE Tutorial文檔中關於JavaServer Faces技術的介紹吸引了我:UI、component、event、listener這些在桌面程序中熟悉的字眼,讓我在Web開發中找到了桌面程序員的一些感覺。
象開發桌面程序那樣開發web程序,這是我選擇JSF的初衷。基於這樣膚淺的認識,跌跌撞撞上路了,在工期和新技術的雙重壓力之下,超負荷的工作令人透不過氣來,但每每從JSF中發掘出令人驚喜的新特性,又給我帶來極大的滿足感。第二版終於完成時,日歷恰好翻過一個整月。JSF帶來的效率提升是顯著的。
事實上,到現在為止,我對於JSF還只能說是初步了解,遠未達到掌握,更談不上精通,但這並不妨礙我視JSF為Web開發的首選框架。尤其是對於新手,如果還沒有在Struts、Tiles、Spring、Tapestry等框架中走得太遠,那麼,集中你有限的精力踏上JSF之路吧。
2. JSF優勢之一:UI組件(UI-component)
UI組件(UI-component)一直是桌面程序的專利,web程序中,雖然HTML定義了基本的UI標簽,但要使這些UI標簽像UI組件那樣工作,還需要很多代碼片斷來處理數據及其表現形式,而且有效地組織這些代碼片斷使其協調一致也是一件繁瑣的工作。JSF的UI組件是真正意義上的UI組件,能極大地簡化程序員的工作,例如,在頁面上放置一個文本輸入框,這個輸入框立即具備了數據填充、界面更新、事件偵聽、動作觸發、有效性檢查和類型轉換的功能。更為重要的是,程序員只需根據業務邏輯編寫核心業務代碼,JSF會保證代碼在合適的時候被執行,完全不用考慮代碼與代碼之間該如何來配合。
3. JSF優勢之二:事件驅動模式
事件是面向對象方法的重要組成部分,對象之間通過事件進行溝通和交流,使得一個或多個對象能夠對另一個對象的行為作出響應,共同合作去完成一項業務邏輯。通常,編寫Web程序時,程序員要為對象之間的溝通設計機制,編寫代碼。雖然溝通的內容屬於業務邏輯,但溝通的機制顯然與業務沒有太大關系,程序員因此為業務邏輯之外的功能浪費了時間。JSF改變了這種狀況。JSF的事件和偵聽模式與大家熟悉的Javabean的事件模式類似,有Java基礎的程序員並不需要學習任何新的東西。JSF的UI組件可以產生事件,例如,當頁面上一個文本輸入框的內容被修改時,會發出一個“值改變事件”。另一個對象如果對“值改變事件”感興趣,只需注冊為該對象的偵聽者,並編寫處理例程,即可命令JSF在事件發生時自動調用處理例程。JSF做了所有該做的事,留給程序員的只有業務邏輯代碼的編寫。
4. JSF優勢之三:用戶界面到業務邏輯的直接映射
舉個例子,表單提交是Web編程最常見的任務,也是最復雜的任務之一。當用戶在網頁上點擊“確定”按鈕時,浏覽器將生成一個HTTP請求,發往服務器端的某個Servlet,執行該Servlet的service方法。在service方法中,HTTP請求需要經歷解碼、類型轉換、有效性驗證、狀態保存、數據更新等環節,處理這些環節的所有細節,對程序員來說是沉重的負擔。在JSF下,這些工作的很大一部分都由框架承擔了,在程序員看來,這個過程是透明的,用戶界面端的HTTP請求可以直接映射到後端的一個事件處理例程,JSF起到了承前啟後的作用。
5. JSF優勢之四:程序員和網頁設計人員的分工
在JSP中,程序員和網頁設計人員的工作有時候是互相交織、無法區分的。這是因為JSP頁面中摻入了網頁設計人員所不熟悉的一些JSP標簽,甚至是晦澀的Java代碼。要求網頁設計人員理解這些標簽和代碼是不現實的,不符合分工合作的原則。在JSF中,框架為網頁設計人員提供了一套標准的UI組件,在工具的支持下,可以通過拖放簡單地添加到網頁上,然後設置某些顯示屬性來滿足視覺要求。網頁設計人員不需要知道UI組件背後的復雜代碼,那是程序員的事,而程序員也不需要再處理任何與視覺相關的細節,程序員所做的只是給UI組件綁定類的屬性或方法。雖然程序員和網頁設計人員需要修改同一份文件,但他們各司其職,各得其所,互不干擾。程序員和網頁設計人員工作的明確劃分,是JSF在易用性方面邁出的一大步。
6. JSF優勢之五:請求處理生命周期的多階段劃分
雖然都是建立在Servlet基礎之上,但JSF的生命周期要比JSP復雜得多。JSP的生命周期非常簡單,頁面被執行時,HTML標記立即被生成了,生命周期隨即結束。而一個完整的JSF請求-處理生命周期被精心規劃為6個階段,典型的JSF請求需要經歷所有階段,某些特殊的請求也可以跳過一些階段。階段的細分,顯然引入了更多的處理,但JSF框架會管理這一切,所以,程序員在獲得更多控制能力的同時,工作量並沒有增加。
7. JSF優勢之六:伴隨工具而生存
JSF帶來了Web編程的巨大變革,變革的強烈程度超出了很多工具廠商的預料,以至於現在可供JSF使用的工具非常缺乏。缺乏工具支持的JSF只會令人敬而遠之,因此,JSF在設計之初就為工具廠商預留了用武之地。在為數不多的JSF工具中,sun的Java Studio Creator是一個優秀的開發環境;Borland的Jbuilder在JSF1.1時曾經是非常好用的開發工具,可惜現在對JSF1.2的支持沒有跟上;Eclipse下JSF的插件很多,但真正支持所見即所得的JSF插件都是收費的,例如Bea的Workshop for JSF、Exadel的JSF Studio等等;此外,Oracle和IBM也有JSF的開發工具。隨著工具的不斷湧現,用JSF開發Web程序將會越來越方便和快速。
8. JSF優勢之七:全面的用戶自定義支持
前面提到,JSF將極大地簡化Web程序的開發,作為一個相對復雜的框架,JSF是如何做到這點的呢?原來JSF為程序員提供了很多默認的組件和類,通常情況下,JSF的這些默認組件和類足以滿足Web開發的需要了。但是,考慮到在某些應用場合,框架的默認行為也許不符合業務的要求,JSF特別允許程序員編寫自己的組件和類,來滿足客戶的特殊需求。例如,程序員可以編寫自己的UI組件,甚至可以創建自己的EL解釋器,來支持非標准的EL表達語言。
9. JSF優勢之八:Web開發的官方標准之一
JSF的1.0版本發布於2004年2月份,當時是作為一項獨立的Web技術推出的。經過1.1版到現在最新的1.2版,短短的兩年多時間,JSF終於在2006年年中成為Java EE 5的組成部分,上升為Web開發的官方標准之一。Java EE 5最重要的使命就是簡化Java的開發,而JSF無疑為這一使命立下了汗馬功勞。在Web框架層出不窮甚至有些泛濫成災的今天,Sun以JSF來樹立標准,對Java的發展是有益的。Sun在Java領域的領袖地位不容動搖,對於Java程序員來說,始終追隨業界領袖的步伐,也許是避免技術落伍的最好方法。
10. 結束語:該你了,JSF!
考察某項技術的流行程度,google的關鍵字搜索不失為一種簡便易行的方法。為了便於說明,我們選擇目前最熱門的Struts與JSF進行比較。在google中分別輸入關鍵字“Struts”和“JSF”,看看google返回的網頁數量。令我們感興趣的不是網頁的絕對數量,而是JSF網頁數量與Struts網頁數量的比值。我們看到,對於英文網頁,這個比值是0.6,日文網頁是1.0,繁體中文網頁是0.8,而簡體中文網頁只有0.4.表1列出了具體的數據和比值。
英文網頁數量(萬) 日文網頁數量(萬) 繁體網頁數量(萬) 簡體網頁數量(萬)
JSF Struts JSF Struts JSF Struts JSF Struts
719 1170 145 140 10 13 59 138
JSF / Struts = 0.6JSF / Struts = 1.0JSF / Struts = 0.8JSF / Struts = 0.4
雖然這樣的比較方法不夠嚴謹,但0.4的比例從一個側面說明JSF在國內還沒有流行起來,用“方興未艾”四個字來描述JSF的這種狀況,是再合適不過了。由於歷史的原因,國內的軟件技術一直亦步亦趨地跟著國外跑,這不是我們希望的,但我們不得不承認,因此,從國外的情況來推論,我們有理由相信,JSF必將成為國內程序員追捧的對象。正如某位哲人說的那樣,JSF是早晨八、九點鐘的太陽,希望寄托在JSF身上。
11. 後記:不同的聲音
客觀地說,JSF並非完美,業界對JSF的評價也褒貶不一。例如,由於JSF過於復雜,其學習曲線明顯長於其他框架如Struts等,這在一定程度上妨礙了JSF的推廣;此外,JSF的推出略顯倉促,1.0版在使用中發現很多bug,以至於sun匆忙發布的1.1版主要是為了修正這些bug;還有,在JSF1.2版之前,JSP和JSF的融合有嚴重的缺陷,這主要是由於二者不同的生命周期造成的,不過,1.2版在這方面作出了改進,現在,JSP和JSF可以在一個項目中相安無事了。
JSF的不足之處還有很多,比如UI組件不夠豐富、具體實現的可選擇余地過窄、使用JSF開發的實際項目不多、sun的參考實現還存在諸多bug、短期內缺乏工具支持等等,尤其是在國內,JSF的中文文檔和書籍相當缺乏。但是,不管怎樣,這些都是JSF成長道路上必須經歷的磨難,我相信,Sun會努力的。