一個程序員的JavaWeb之路

摘要:一個沒有Java經驗,完全不懂Web編程的程序員,也能用JSF寫出複雜的Web程序?本文作者向讀者介紹了自己的JSF歷程,以親身經歷證明JSF是程序員通往Java   Web世界的捷徑。

說實在的,我的Java   Web之路,其實沒有什麼特別的,之所以寫成文字,將自己的經歷拿出來和讀者共享,是希望給剛剛投身Java的程序員們一個參考。我相信每個Java程序員都有自己獨特的Java歷程,每段Java歷程都有值得大家去分享的理由。經驗也好,教訓也罷,如果能夠在Java程序員彷徨徘徊之際,給予他們一點幫助,讓他們鼓起勇氣,繼續前進,那就不枉此文了。 
  
爲了讓您對文章內容有個大致的瞭解,以便決定是否要浪費時間看下去,下面列出了文章的目錄: 

    1.   前言:此文的目的 

    2.   Hello,world!我的全部Java經驗

        初遇Java,我的真實感受 
        缺乏IDE的Java 
        別了,Java 

    3.   一片空白的Web 

        不懂Web的老程序員 
        程序人生的十字路口 
        魚與熊掌,不可兼得

    4.   用JSP寫的第一個Web程序

        Jbuilder引領我的JSP之旅 
        Jbuilder老矣,尚能飯否? 
        Java   Web裏的彙編、C和C++ 
        JSP繁瑣的Form處理 
        Sun所宣稱的JSF優點 

    5.   因爲無知,我選擇了JSF 

        傻人的傻福 
        JSF的UI組件 
        JSF的事件和生命週期 

    6.   結束語:享受Java,享受程序人生 

初遇Java,我的真實感受 

關於Java的最初記憶已經很遙遠了,遙遠到連年份都已模糊。是什麼吸引我注意Java的?是它奇怪的名字?還是它Write   Once,Run   Anywhere的宣言?我沒有確切的答案。只記得那是上個世紀九十年代,我正是一名快樂的程序員,做着自己喜歡做的事,拿着令人羨慕的不菲薪水,生活緊張有序,人生充滿期待。 

那時還沒有如今這麼方便的互聯網,看書和上機實踐是程序員學習新技術的唯一手段。我手邊經常擺放着大量的計算機書籍,各種各樣的語言、系統、平臺、技術以、內核以及奧祕等等,我都興趣盎然。寫完程序,偶有閒暇時,翻翻書,寫段小程序,體驗一下新的技術,是我那時最好的娛樂。 

我就是在這樣的情形下認識Java的。當時Java剛被髮明出來,我不知道從哪裏搞來一篇文章,是介紹Java的,具體內容早已忘到爪哇國去了,只記得裏面有一個“Hello,world!”的例子。程序員沒有不知道“Hello,world!”的,尤其是學過C語言的。我就是在C語言教材裏第一次碰到“Hello,world!”的。由於C相當的普及,以至於在屏幕上打印“Hello,world!”,都成了各種編程語言入門教程的八股格式了。 

我照着那篇介紹Java的文章裏的例子,原封不動地敲到電腦裏面去,當屏幕上果真打印出那句著名的“Hello,world!”時,我一點也不驚奇。 Java的“Hello,world!”沒有什麼特別的,和C一樣,甚至還不如C,至少,C有Borland公司的IDE,Java有嗎?用文本編輯器寫代碼,用字符界面輸出信息,用命令行執行程序,沒有比這個更落後的了。Java沒有打動我,被塞到了書堆的最底層。於是,“Hello,world!”成了我唯一的也是全部的Java經驗。

缺乏IDE的Java 

我曾經是“文本-字符-命令行”的狂熱愛好者。在大學時代,我們學習單片機,一塊電路板上安裝了集CPU、RAM和其他一些模塊於一體的集成塊,配上一些輔助電路,裝在一個塑料盒子裏,外加一個直流電源,那是我最初的筆記本電腦。雖然屏幕只有一行,雖然一行只能顯示16個字符,雖然每個字符只有16個段,但當通電後屏幕上藍色的字符開始閃爍時,我會立刻變得十分興奮。胳膊下夾着我的心愛的筆記本電腦,往返於宿舍、食堂和實驗室,是我最驕傲的記憶。 

單片機之後是DOS,同樣是“文本-字符-命令行”的天下,不過,已經有一些界面優美的程序出現了,最著名的莫過於PCTOOLS了,一個軟件集成了幾乎所有的操作,並且用一個功能鍵就代替了冗長的命令行。那時我們用容量爲360K或720K的軟盤,裏面有操作系統、Basic編譯程序、 PCTOOLS,揣在書包裏,輾轉於各個機房,用飯票換上機時間,在單色顯示器前用行編輯器寫代碼,即便經常因爲超時被機房管理員呵斥,依然樂此不疲。

別了,Java 

我錯過Java的另一個原因,是我首次接觸Java時,正是Component(組件)和OO(面向對象)的天下,我沉迷在 PowerBuilder、C++Builder和Delphi的世界裏如魚得水,無暇他顧。Drag-and-Drop技術讓開發變得如此輕鬆,是我在大學通宵達旦寫C程序時不曾預料到的,而OO和麪向過程的巨大區別,讓我以往的經驗似乎派不上用場了,我正忙於改變自己,適應潮流。 

所以,第一個Java程序沒有給我留下太多的印象:字符界面、命令行以及用文本編輯器寫的代碼,這些都是已經被Windows隻手遮蓋的東西了;虛擬機似乎也沒什麼必要,Windows已經一統天下,再加上一個“中介”,不是多餘嗎?Java的類,和C++的類有本質區別嗎?好象還不如C++那麼完善。“Write   Once,Run   Anywhere”對我沒有任何意義,因爲我只寫Windows程序!Java,在我看來,只不過是編程語言芸芸衆生中毫不起眼的一個角色,沒有C的三頭六臂,沒有C++的大家風範,也沒有VB的善解人意,更比不上PowerBuilder的特立獨行,也許用不了多久,Java就會銷聲匿跡。 

我不曾預料到,這個看似平凡的Java,居然成爲影響世界的語言。後來Java之樹在服務器端生根發芽,枝葉逐漸蔓延到桌面應用,大有在如日中天的 Windows下撐出一片蔭涼之勢時,確實有點出乎我的意料。而當程序員招聘廣告上Java字樣越來越多,我才意識到Java的時代正在到來。而此時的我,只有一點“Hello,world!”的可憐經驗。毫無疑問,我已經在Java的世界裏掉隊,是不爭的事實了。 

是Borland公司改變了程序員的生活。著名的Turbo系列集成開發環境,終結了落後的命令行方式。全屏幕編輯、在線幫助、編譯錯誤定位以及單步調試等等,給程序員注入了新的活力。在一個漂亮、清晰、完善的集成開發環境裏編寫代碼、編譯、運行、調試,是所有程序員的夢想,Borland做到了。在 Turbo   C裏,一切操作都簡單到只需按一個功能鍵!因此,自從開始使用Toubo   C以後,我就再也不願意回到命令行了。這也解釋了爲什麼當Java的第一個例子以命令行方式運行完成後,我就束之高閣了。如果Java的最初版本是伴隨着一個IDE一起發佈的,或許我的Java經驗就會和Java的年齡一樣大了。

不懂Web的老程序員 

如果說Java我至少還寫過一個程序的話,那麼Web方面我真的是一文不名了。爲什麼會這樣?象我這樣一個自詡爲老程序員的人,居然會不是Web專家?就算不是Web專家也不要緊啊,難道竟然沒有寫過若干個大型的Web程序?退一萬步吧,大型的Web程序沒有寫過可以理解,一兩個實驗性質的網頁總編過吧?很不幸,我沒有。 

我確實是一個老程序員,程序可以爲我作證。我寫過很多程序,有些是大多數年輕的程序員甚至不曾聽說過的。比如Z80、MCS51、8086、彙編、寄存器、中斷等等,恐怕有些讀者不知道我在說什麼。彙編語言,最接近CPU的編程語言,年輕的程序員也許聽說過,但用過的就鳳毛麟角了。DOS下的 debug,彙編語言的調試軟件,曾經是我最愛用的工具,研究病毒和破解加密程序就是靠它。當然,彙編語言離業務邏輯太遠了,再加上莫爾定律下飛速發展的硬件能力,現在甚至連操作系統的核心代碼都不用匯編來寫了。 

之所以提到彙編語言,只是爲了說明我是老程序員。彙編語言的經驗在現在沒有任何用處了,即使是單片機,如今最次的也都C了。從彙編到C到C++,編程語言層出不窮,作爲程序員的我,始終追隨着編程語言的步伐,邊學邊用,不敢有絲毫的懈怠。唯獨在Web領域,我遠遠落在了時代的後面。 

程序員是一個活到老學到老的職業,3個月不擡頭看路,你的眼前就會冒出許多技術的新面孔。先是OO,我寫了很多C++的程序;然後是 Client/Server,我又寫了很多PowerBuilder的程序;後來到了Browser/Server,我還想寫很多Web程序,可是,我已經沒有寫程序的機會了。原因很簡單,當Web漸成程序員們的口頭禪時,我做“管理”了。 
 

程序人生的十字路口 

我走過的路,和很多程序員一樣。22歲,學生們帶着從老師那裏學來的若干理論,投身到程序員的行列,工作穩定,學習的機會又多,他們滿懷期待;25 歲,程序員變成了高級程序員,雖然辛苦,雖然有壓力,但薪水不菲,他們充滿感激;28歲,高級程序員晉升到資深程序員,登上作爲程序員的職業頂峯,見多識廣,在技術領域裏呼風喚雨,他們躊躇滿志。30歲,資深程序員還是資深程序員,雖然還是那樣德高望衆,雖然還是那樣受人尊敬,但他們來到了程序人生的十字路口,他們開始不知所措了。 

“做管理還是做技術,這是個問題”。一直做管理的人,他們不存在這個問題,管理可以從26歲做到62歲;先做技術後做管理的人,有問題但不嚴重,雖然他們的技術底子可以讓他們更專業,但管理經驗的不足,通常會成爲他們繼續晉升的障礙;一直做技術的人,他們的問題就大了,沒有人希望你繼續做技術,你自己也知道應該轉向管理,可是,如果你偏偏生就了一付不喜歡管理的脾氣,你該何去何從? 

繼續做技術吧,你的性價比不如年輕程序員,因爲你受僱的公司通常沒有核心技術,也不需要技術積累,或者,即便有核心技術,即便需要技術積累,你的成本還是高於重新培養一個新人。很低的價錢就能招到一個有潛力的程序員,籤個培訓協議,就能穩定三五年,隨時要求加班而毫無怨言。再說了,炒掉你並不需要付出很高的代價,事實上,根本就沒有代價,如果你得到了一筆遣散費,那是因爲同情。 

這是我的無奈,也是很多老程序員的無奈,更是中國軟件行業的無奈,而歸根結底,我不知道到底是誰的無奈。程序員被劃入吃青春飯一族,與舞女和模特同類,這多少有些中國特色。所以,當我30歲的時候,我把自己歸入了老程序員的行列。爲了能夠體面地生活,像我這樣的老程序員接受面試時,都知道必須爲自己爭取一個管理職位。我會告訴主考官我喜歡管理,我管理過某某項目,並大談軟件開發的過程、文檔、規範和質量。學而優則仕,難道是程序員的唯一出路?
 

魚與熊掌,不可得兼 

我見過很老的美國程序員,也和很老的印度程序員一起工作過,他們的程序就像他們的年齡一樣,讓人放心。當你向他們要一個程序時,他們會謹慎地告訴你,他們需要一些時間考慮一下,然後,他們會給你一個清單,列出他們認爲可能存在的問題。你接過來一看,很多問題確實是你沒有考慮到的。他們開始動手寫代碼的時間總是不如年輕程序員那麼早,但他們的代碼經歷的迴歸測試的次數也比年輕程序員少,最終你會發現他們的效率是最高的。他們慢,但他們驗證了那句名言:越早開始,越晚結束。 

關於老程序員的討論,是個憂傷的話題,就此打住吧。我想說的是,在我想寫程序,而且能寫程序的時候,我成了某某經理,成了某某主管,成了某某總。整天說一些言不由衷的話,做一些枯燥乏味的事,想一些沒有結論的問題。我的薪水增加了,超過了身邊最優秀的程序員,但我覺得很累,沒有成就感,而且最傷心的是,我錯過了Web。 

好在當C/S逐步向B/S過渡,Web漸成燎原之勢時,網上關於Web的技術討論風起雲涌。多虧了那些評論文章,讓我用有限的時間瞭解了關於Web的技術動態。ASP、PHP、JSP這些字眼不時在眼前出現,多少給了我一些Web編程的基本概念。我沒有寫過一行Web代碼,不過,憑着一個程序員的職業敏感,我還是找到了正確的方向,所以,若干年後,當我着手開發我的第一個Web程序時,我決定用JSP。
JBuilder引領我的JSP之旅 

那時我離開了令人厭煩的“管理”崗位,實際上,我決定自己創業,所以辭職不幹了。頗具戲劇性的是,我的第一個創業項目不是我所熟知的PowerBuiler或Delphi,而恰恰是我的軟肋,Java的Web編程。 

程序是用Jbuilder開發的,採用JSP技術,很簡單,但我花了長達3個月的時間。這三個月中,我真正寫程序的時間倒不多,大部分的時間裏,我都是在Google上搜索。沒有時間系統地學習Java的Web編程,我只能摸着石頭過河,好在Google上“石頭”
很多,所有問題都能找到答案,儘管可能不是最優的。 

開發的過程緊張而又快樂,我又像一個真正的程序員那樣,找到了自己的位置,找到了感覺。把全部的心血澆注到鍵盤上,眼看着代碼像豆芽一樣生長,我心滿意足。 

JSP讓我明白了很多Web術語,Servlet、請求、響應、會話、表單、提交、Bean等等,我徜徉在JSP的世界裏,感覺自己又恢復了青春的活力。 

值得一提的是Borland的Jbuilder,不愧爲一個優秀的集成開發環境。老程序員都會感激Borland公司,從Turbo   C開始,Borland公司爲程序員提供了業界最優秀的集成開發環境,不管是C還是Pascal還是Java,Borland公司的開發工具都是值得信賴的。簡單的配置、人性化的界面,強大的功能,優秀的幫助文檔,詳盡的例子以及始終如一的穩定表現,讓Borland成爲程序員公認的IDE大師。 

就像Turbo   C一樣,Jbuilder沒有讓我失望。下載、安裝、運行,在幫助文檔的指引下,我編寫了我的第一個JSP頁面,點擊運行按鈕,“Hello,world!”郝然出現在瀏覽器的窗口裏,那一刻,我有點呆了,不是因爲這一切都來了,而是因爲來得太快了。沒有任何配置,不需要添加什麼插件,Borland爲我準備了所有的東西。


Jbuilder老矣,尚能飯否? 

可惜,Borland畢竟老了,Jbuilder現在明顯不敵Eclipse了。在開源的時代,產品更新換代的速度不是以年計,而是以月計,以周計,甚至以天計。插件顯然比一個全新的版本來得快,也來得容易。這是Eclipse的聰明之處。Eclipse是個空骨架,可是無數的程序員在爲其添加血肉,使得Eclipse日漸豐滿起來。 

老實說,Eclipse給我的最初印象非常糟糕,僅僅插件的配置就花了我N天的時間。好不容易讓JSP在Eclipse中跑起來,一個低劣的插件就能讓Eclipse非正常死亡。這在Jbuilder中,你需要有中六合彩的運氣才做得到。非常懷念Borland的Jbuilder,其實 Jbuilder也有插件,稱爲OpenTool,可惜一直沒有流行起來,這應該是Borland公司宣傳策略上的失誤,要知道,“是金子總會發光”不錯,但沒有廣告,別人是看不到金子的光的。 

我用過的Jbuilder最高版本是Jbuilder   2006。和早期的Jbuilder版本例如7和9相比,Jbuilder   2006顯得過於臃腫了。Jbuilder   7甚至在我只有512M內存的PIII   600筆記本上也能跑起來,而Jbuilder   2006,如果沒有1G以上的內存,你就準備等到花兒都謝了吧(當然,和Sun的開發環境比起來,Jbuilder   2006就算不上內存殺手了,呵呵)。 

從Jbuilder7到Jbuilder   2006,如果從單純Java   IDE的角度去評判,Jbuilder給程序員們帶來的驚喜,遠遠不如它佔用的內存和硬盤空間那麼猛烈。到底是什麼讓Jbuilder   2006成爲了龐然大物呢?是Borland八爪魚般四處出擊的產品線規劃。統一建模語言、配置管理、協同工作環境等等,Borland巨人的觸角已經深入到軟件開發生命週期的幾乎所有環節,Jbuilder已經不是單純的IDE了。 

Borland從IDE發家,難道最後竟然要栽在IDE上麼?阿彌陀佛。


Java   Web裏的彙編、C和C++ 

用JSP技術開發Web程序,讓我聯想到Z80和MCS51上的彙編程序。低級語言和高級語言的區別,體現在語言是更靠近CPU還是更靠近業務。彙編語言是離CPU最近的語言,也是離業務最遠的語言,所以用彙編語言編程時,可能只有1%的時間是業務相關的,另外99%的時間你都是在寄存器上來來回回倒數據。高級語言如C++,則相當靠近業務了,基本上你不需要關心內存啊句柄啊之類的東西,集中精力寫你的業務邏輯就行了。介於彙編和C++之間的是C語言,它比彙編更靠近業務,比C++更靠近CPU。一方面,C語言讓你擺脫了內存地址和寄存器的糾纏;另一方面,如果願意,C也可以直接控制CPU,事實上,在C裏面是可以嵌入彙編代碼的。C之所以長盛不衰,成爲計算機專業的必修語言,和C強大的適應能力是分不開的。 

在Java的Web編程領域,也可以類似方法對諸多技術進行分類。如果把Servlet看成是Web編程的“彙編語言”,那麼,建立在Servlet 之上的JSP技術就相當於Web編程的“C語言”了。而引入了component模型和事件驅動模式的JSF則更貼近業務端,幾乎可以視同Web編程的 “C++語言”了。 

Servlet是Java動態網頁的鼻祖,爲Java   Web帶來了生成動態內容的能力。Servlet允許程序員干預服務器返回給瀏覽器的每一個字節,就像彙編語言允許程序員訪問CPU寄存器一樣。這給了程序員極大的權力,同時也帶來了沉重的負擔,程序員不但需要生成業務相關的信息,還要給這些信息加上諸如 <td> </td> 之類的HTML標籤,以使信息能以適當的方式顯示在用戶的瀏覽器上。在我看來,這種“一點技術含量都沒有”的事情,不應該浪費程序員寶貴的時間。 

JSP比Servlet向前邁進了一步,至少,程序員可以不用再爲靜態的HTML內容操心,那些難看的HTML標籤現在可以交給工具去處理了。程序員的工作,簡化爲根據業務邏輯生成動態信息,然後插入到JSP文件的適當位置。 

JSF又如何呢?構建在Servlet和JSP技術基礎之上的JSF,除了擁有二者的全部優點之外,更引入了組件模型和事件驅動模式,這給Java的Web編程帶來了巨大的變革,如同C++在C領域裏所帶來的震撼一樣。後面我們將看到這一點。


JSP繁瑣的Form處理 

顯然,顯示動態網頁遠非Web編程的全部,除了顯示信息,Web程序還需要從用戶那裏收集信息,這就是Form的作用。JSP在Form的處理方面,非常靈活,也正是因爲靈活,JSP的Form處理也異常繁瑣。在程序員的世界裏,靈活是一面雙刃劍。比如C,是我見過除彙編語言外最靈活的編程語言了,可是C也是我見過的最複雜的編程語言。有些C的初學者,對着教材發上幾個小時的呆,也不知C的“引用”和“指針”爲何物。 

JSP當然沒有複雜到C那個程度,但也足以令程序員頭痛了。例如JSP寫一個簡單的輸入界面,只有一個文本輸入框和一個按鈕,用戶在文本輸入框中輸入年齡,按按鈕提交。這個過程中,程序員要寫的代碼包括: 

        獲得JSP的Request對象; 
        由於Request對象攜帶的所有輸入都是String,程序員要將String轉爲正確的類型。此例是int; 
        由於用戶可能輸入非法字符,例如abc,程序員要處理類型轉換失敗的意外; 
        年齡不能是-1,也不能是900,程序員要做範圍檢查; 
        用戶輸入有誤,不能什麼也不說,程序員必須告訴用戶出了什麼錯; 
        即使用戶輸入了錯誤數據,程序員也不能簡單地清除,必須在重新顯示的輸入頁面中顯示出錯誤的輸入,以使用戶看到自己剛纔輸入了什麼,因此,程序員需要保存來自用戶的錯誤輸入,並回顯; 
        用戶終於輸入正確的數據了,程序員要把結果保存到後臺Bean或數據庫中; 
        保存數據時可能會出現意外,程序員應該通知用戶,例如,給用戶回饋一個錯誤頁面; 
        。。。。。。 

只是一個最簡單的Form處理,就包含了如此多的代碼片斷,JSP的繁瑣可見一斑。其實,代碼片斷本身並不特別,都是最常見的Java代碼,如何讓這些代碼片斷協同工作,纔是問題的核心。簡單的Form尚且如此,複雜的數據表格又將如何呢?我頭大了。 

Sun所宣稱的JSF優點 

由於JSP在Form處理上令人失望,所以,當我對JSP的認識還停留在似懂非懂的階段時,我就已經對JSP失去了信心,認爲JSP不值得花大力氣去學習。現在回過頭來看看,當時的想法實在是幼稚。後來,隨着我對JSP瞭解的加深,我漸漸意識到,JSP其實是Java   Web世界裏的C語言,是任何想在Java   Web的殿堂裏修行的程序員必須唸的一本經書。 

可惜,我那時沒有這麼高瞻遠矚的目光,也不知道應該向身邊的牛人們請教,自顧自從Sun的網站上下載了J2EE的Tutorial,希望Sun給我指點迷津。Sun這樣做了,在J2EE   Tutorial的第17章“Javaserver   Faces技術”中,Sun說道: 
精心設計的編程模式和標籤庫,能顯著地減輕帶有服務器端UI的Web應用的建立和維護工作。你能夠非常容易地: 

        將客戶端事件與服務器端應用代碼關聯在一起; 
        將頁面上的UI組件與服務端的數據綁定在一起; 
        利用可重用和可擴展的組件來構造用戶界面; 
        跨請求保存和恢復UI狀態; 

The   well-defined   programming   model   and   tag   libraries   significantly   ease   the   burden   of   building   and   maintaining   web   applications   with   server-side   UIs.   With   minimal   effort,   you   can 

        Wire   client-generated   events   to   server-side   application   code 
        Bind   UI   components   on   a   page   to   server-side   data 
        Construct   a   UI   with   reusable   and   extensible   components 
        Save   and   restore   UI   state   beyond   the   life   of   server   requests 

看完這幾行E文,我欣喜異常,這不正是我所需要的嗎?組件模式、事件驅動以及數據綁定,JSP的弱項在JSF中全部得到了加強!我對JSF非常滿意,而令我更滿意的是,Jbuilder竟然也支持JSF!於是,我馬上決定了,我的下一個技術目標就是JSF。  
5.   因爲無知,我選擇了JSF 

傻人的傻福 

記得華爲總裁任正非說過,華爲是因爲無知才走上通信產業之路的。我在2004年年中開始接觸JSF時,也是因爲無知。幾乎沒有Java經驗,Web更是一片空白,寫了一個半吊子的JSP程序後,我居然判了JSP的死刑,鐵下心來鑽研我的JSF去了。無知者無畏,說得一點也不錯。 

從JSP起步,第二級臺階,也許Struts是最合適的。沒有複雜的概念,沒有深奧的理論,容易理解,上手快,從JSP向Struts的過渡顯得特別自然。這是Struts流行的原因之一。如果當時請教過任何一個Java高手,我十有八九會以Struts作爲我的JSP替代技術,並且很有可能成爲 Struts的發燒友。可是,機緣巧合,我選擇了JSF。 

正應了那句俗語:“傻人有傻福。”採用JSF技術後,Web編程如有神助,一個月時間,我和一個剛畢業的程序員寫出了一個規模不小的Web程序:126張數據庫表,346個JSP頁面,458K   Java源程序,還包括84頁的《需求規格說明書》和189頁的《數據庫設計說明書》。即便是桌面應用,這樣規模的程序在一個月內完成,老闆也該偷着笑了。其實,效率的提高,完全是JSF的功勞。正如Sun在JSF的規範中所宣稱的那樣,JSF極大地簡化了Java的   Web編程。 

首先,在JSF中,頁面乾淨了許多。無需聲明Javabean,也不用嵌入Scriptlet,沒有多餘的符號,只是一些擴展標籤而已,看上去規範而不失優雅,讓人賞心悅目。程序員多半是完美主義者,眼睛裏容不得醜陋的代碼,我認識的一些程序員,平時不修邊幅,可以整個冬天都穿同一件夾克,袖口磨得油光發亮,但他們的程序卻整潔得讓人嫉妒。 

其次,JSP中趾高氣揚的Request和Response對象淡出了JSF。在典型的JSF應用中,程序員基本上沒有直接操作Request和 Response對象的必要,因爲框架隱藏了對這兩個對象的處理細節。不論是從Request中解碼參數,還是將數據編碼到Reponse中,都不需要程序員寫任何代碼,JSF知道該怎麼做。當然,如果非要訪問Request,JSF的隱含對象爲程序員提供了可能。 

JSF的UI組件 

UI組件是JSF最具特色的組成部分。與桌面程序的UI組件不同的是,JSF的UI組件是服務器端的,但是,在JSF框架的支撐下,這些服務器端的 UI組件,在程序員看來和桌面程序的UI組件沒什麼不同。我用的Jbuilder版本不支持JSF頁面設計的所見即所得,當我拖動一個UI組件到頁面上時,Jbuilder爲我生成的,是一段標籤文本,跟隨着我的鼠標,放在指定的位置。一個服務端UI組件就是這樣誕生的,其在頁面上的表現形式也隨之確定。 

沒有所見即所得當然有點遺憾,但對我來說,這已經足夠了,因爲把組件的Value和後臺Javabean的屬性進行簡單的綁定,我就得到了所有需要的程序行爲。頁面顯示和後臺數據的同步、用戶輸入的轉換、數據的有效性驗證、錯誤信息的提示以及UI組件狀態的保存和恢復,所有這一切不需要我寫任何代碼,JSF已經代勞了。 

JSF的另一個特色是它的數據組件。我曾經很長時間使用PowerBuilder開發程序,熟悉PowerBuilder的程序員都知道,PowerBuilder最引人注目的是它的所謂數據窗口。並不好看的界面,笨拙的IDE,PowerBuilder單單憑藉一個數據窗口,就吸引了大批程序員。PowerBuilder與數據庫是天生的一對,長期使用PowerBuilder的結果,我養成了以數據庫爲中心的設計習慣。

這個習慣一直保持到今天,幾乎成了我的嗜好,前面提到的126張表,就是最好的例子,換成別的程序員,也許30張表就夠了。 

所以,JSF的數據組件讓我一見鍾情。數據組件實際上包括兩個組件,一個是UIData,一個是UIColumn。JSF將數據表看成是由若干個列組成的一個表格,而行的數目取決於數據源中數據的條數。這與PowerBuilder的數據窗口殊途同歸。當然,數據組件不是直接從數據庫中取得數據(實際上,設計模式也不允許程序員這樣做),而是通過一個Javabean以resultSet的形式傳遞給數據組件。在JSP中,這樣的程序邏輯夠我折騰一陣的了,而在JSF中,這和生成一個文本輸入框一樣容易。 

JSF數據組件的用途並不限於顯示數據庫表的內容,實際上,所有實現了List接口的對象都可以成爲數據組件的數據源,這給Java的Web編程帶來了極大的便利。而且,如果你想直接編輯數據表中的數據,JSF也可以做到,只需以可讀可寫的方式,將UIColumn的value屬性和數據源中你想修改的屬性綁定在一起,用戶在網頁上所做的修改,就會自動保存到數據源中。這樣的功能,在JSP中,程序員都要深吸一口氣纔敢動手的。我的第一個JSF程序,之所以能在一個月的時間內完成346個頁面,數據組件功不可沒。 

JSF的事件和生命週期 

OO中的事件,是對象通信的一種機制,對象通過響應彼此的事件相互協調一致。JSP沒有事件,所以JSP的代碼需要程序員自己去協調,什麼時候執行什麼代碼,往往讓程序員大費周章。如果說JSP代碼是一羣孩子的話,那麼程序員就是這羣孩子可憐的父母,吃喝拉撒全要操心,哪裏能夠集中精力做點事情!所以,小孩要上學,學知識可能只是一個藉口,父母想找個老師代管,纔是背後真正的原因。 

JSF就是程序員們所要尋找的老師,把代碼片斷交給JSF去管理,程序員就可以集中精力編寫業務邏輯了。在JSF裏,有四類事件。值改變事件,當用戶在輸入框中輸入數據後發生;動作事件,當用戶提交Form時發生;數據模型事件,當數據表的某行被選中時發生;生命週期事件,當生命週期從一個階段進入另一個階段時發生。除了生命週期事件,其他事件都是桌面程序中大家所熟知的,而生命週期事件可以想象成窗口事件,例如窗口的生成、關閉、激活等等。 

談到JSF,就不能不談談JSF請求處理的生命週期。爲什麼很多人覺得JSF難學?都是生命週期惹的禍。JSP的生命週期只有一個階段,而JSF卻有 6個階段!爲什麼要這樣呢?其實,這是JSF框架所必需的。JSF只有細分生命週期階段,才能對Request和Response施加粒度足夠細的控制,因爲JSP那樣粗粒度的控制,不足以支撐UI組件模型和事件模式。 

在我初學JSF時,生命週期成了我最大的障礙。不管我如何咬文嚼字地推敲JSF規範中關於生命週期的描述,我都無法弄明白到底專家們在說什麼。甚至直到我完成了我的首個JSF程序的開發,我還是不懂。這讓我十分的惴惴不安,時時擔心自己誤入歧途。奇怪的是,不論是Sun的Tutorial,還是JSF 的官方規範都把生命週期放在“頭版頭條”的位置,一開篇就大肆推銷生命週期概念,生命週期真的那麼重要嗎? 

這絕對是一個錯誤!生命週期是JSF的核心,但不是程序員的必修課,初涉JSF的程序員,根本沒有必要浪費精力在生命週期晦澀的概念裏糾纏,不懂生命週期,照樣可以用JSF來編程。花很少的時間看看各個UI組件的功能和屬性,然後弄明白各類事件的含義以及應該如何響應這些事件,瞭解一下JSF可配置的頁面導航機制,再搞清楚Managed   Bean是什麼東西,馬上就可以動手編寫你的第一個JSF程序了! 

生命週期當然重要,不理解生命週期是難以在JSF中深入下去的。但是,如果有機會讓我來寫JSF的入門教程的話,我會把生命週期放在最後一章,等大家都有了JSF的實踐經驗,對JSF是如何簡化Java的Web編程有了感性的認識,再來深入剖析JSF的生命週期,才能水到渠成,一點就通。
6.   結束語:享受Java,享受程序人生
享受Java,享受程序人生 

這就是我的Java   Web之路。從“Hello,world!”開始,跨過JSP的山峯,進入JSF的領地。 

自從踏入程序員行列以來,我接觸的編程語言已經不下10種了。彙編的精準,Basic的平易,c的博大,C++的深奧,都給我留下了深刻的印象,它們伴隨着我,走過風風雨雨,歷經酸甜苦辣。世事變遷,人生無常,唯獨它們對我不捨不棄。它們是我最忠實的朋友,不管我是得意還是失意,也不管我是富裕還是貧窮,只要我用鍵盤呼喚它們,我總是可以從它們那裏得到的迴應。

在這麼多編程語言當中,Java是最特別的。十年前,Java還是埋在土裏的一顆種子,我與它失之交臂;十年後,當Java百花齊放時,我們才相見恨晚。從來沒有一種編程語言,像Java這樣多姿多彩,生機勃勃。這是Java獨特的個性,也是Java的魅力所在。老程序員可以在Java世界裏踏上熟悉的征程,而新程序員也可以在Java世界裏譜寫嶄新的篇章。不論你是身經百戰的老將,還是初出茅廬的新丁,Java一視同仁。 

比如說,我雖然是一個老程序員,但對於Java,我還是新手。與有着N年Java經驗的程序員相比,我的那點Java底子實在是難登大雅之堂。所以,多半時間,我都是虛心地端坐在電腦旁,拜讀牛人的大作,聆聽大師的教誨。他們自信的語言、精妙的見解、入木三分的評論以及信手拈來的術語,把程序員的風采表現得淋漓盡致。 

儘管知識淺薄,但Java仍然給我說話的權利。這是我喜歡Java的原因,它給所有Java程序員同等的待遇,不論新老。Java的核心很簡潔,類、屬性、方法、接口,小巧而精緻,但在這個核心之外,人人都可以構建自己的高樓大廈。Java的技術非常多,而且更多的技術層出不窮。你不必精通所有的 Java技術,也能在Java世界裏佔一席之地。掌握Java基礎,熟悉某項技術,你就可以在Java的舞臺上粉墨登場了。 

JSF就是我在Java舞臺上的行頭。我在探索Java   Web編程技術的道路上邂逅JSF,半信半疑地和JSF走在一起,漸漸發現JSF複雜外表下平易近人的內心世界,終於忍不住要把JSF推薦給你。或許你是 Struts的忠實愛好者,或許你更願意堅定地追隨Spring的步伐,或許WebWork纔是你最信賴的夥伴,又或許Tapestry已經讓你深深折服,沒關係,我發出了我的聲音,行使了我作爲Java程序員的權利,這就足夠了。 

享受Java,享受程序人生,希望在鼎沸的Java之聲中,看到你舉手,聽到你發言。 


---------------------------------------------------------------------------------------------- 

作者簡介 

麻地河,湖南人氏,碩士,投身投身軟件行業超過十年。最初在某貿易公司電腦部任程序員三年,後以系統分析員身份進入某軟件公司,參與了若干大型MIS 的需求分析、設計和編碼。又三年後,被某公司聘爲開發部經理,並先後擔任總工及副總等職務。此後職業規劃漸從技術轉向管理。曾在Nortel某 R&D中心任職,對外企的軟件開發管理模式感受頗深,後受聘于國內某大型軟件企業,負責項目管理。2004年辭職創業,現爲顧問。因不捨程序員身份,遂自詡爲IT自由撰稿人,希望藉此認識更多的程序員朋友,分享彼此的程序人生。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章