河南人民廣播電臺 映像網 黃星辰
1.利用Servlet階段,使用request和response對象接收和反饋客戶端的請求。它是開發Web應用程序的基石,在Web應用程序中,Servlet 是一個基本的Web 組件,開發Web 應用的許多技術,如JSP及一些Web層的框架都是建立在其基礎之上。Servlet的缺點是在Java 代碼中兼有業務和邏輯,不利于程序設計和界面開發。
2.JSP技術階段,JSP是在標記語言中以<%@…%>的形式嵌入Java代碼,使得頁面會話可以調用后臺Bean來處理事件,但是仍然沒有將表示層和業務層分割開來,往往是互相嵌套,這就要求美工人員要懂技術,技術人員要懂美工,不利于程序的維護。隨后JSP引入了標簽庫,來分離業務邏輯,經過SUN公司的標準化之后,就形成了JSTL(Java Standard TabLibrary)。JSTL 對于頁面顯示以及顯示邏輯的弱耦合已經實現,方便了Web 的開發。但隨著Web應用程序規模的不斷擴大,如今現有的JSTL技術已越來越無法滿足開發者的需求,復雜的業務流程和頁面之間的交互都需要程序員自己編寫代碼實現,加大了開發難度。
3.框架開發階段,所謂框架就是可重用的,半完成的應用程序,可以用來產生專門的定制程序。為了適應新的開發環境,一個中間件廠商開發出了像Struts、Spring、Hibernate以及后來出現的JSF 等框架。這些框架為Web 應用程序開發提供了模板,開發人員只要配置好相應的參數就可以完成對Web應用程序的開發。更重要的是,這些框架在不長的時間內相互融合,現在的Web應用程序開發都用到了一種或多種框架。
基于JCP制定的Web應用框架標準而開發的JSF框架技術,采用了模型—視圖—控制器(MVC)的設計模式,憑借良好定義的請求處理生命周期和豐富的組件層次結構,大大提高了基于Java的Web用戶界面開發的簡易性。MVC框架模型如圖1所示。

圖1 M VC 框架模型
JSF技術提供了一個表現和行為徹底隔離的能力,使得先前只有在客戶端UI 體系(DOM)下完成的細粒度隔離移到了服務器端,客戶端只需解釋標準的HTML語法,從而達到了完全瘦客戶端的目標。JSF另一個主要特點在于,JSF利用熟悉的UI組件和Web 級概念,并不把開發者局限在某種特定的腳本技術或標記語言。JSF提供了一個JSP標簽庫,實現與JSP的綁定,但開發者完全可以用另外的表現技術,因為它直接依賴于JavaServletAPI。以用戶界面組件為主的JSF與以頁面為中心的Struts框架不盡相同,它對應用程序的各個部分劃分得比較清晰。利用JSF實現的MVC結構如圖2所示。

圖2 利用JSF 實現的M VC 結構
由圖1,圖2可知,JSF的控制器部分,由FacesServlet、動作處理方法、動作監聽器方法和Faces 配置文件組成。JSF 的視圖部分基于用戶界面組件,組件構成組件樹,用戶界面組件具有快速應用程序開發工具的特征,優于Struts。此外,JSF具有事件粒度細化的新特性,每個用戶界面組件可以觸發事件,不像Struts 只有在提交頁面時才能觸發一個事件,JSF中事件的粒度細化為組件級別,而不是表單級別。JSF的核心部件如圖3所示。

圖3 JSF 核心部件
圖3中用戶界面組成組件樹,構成JSF視圖。用戶在與視圖上的組件相互交映時觸發了事件,事件通過事件監聽器處理,在處理事件的過程中訪問應用程序的模型對象,最后,導航系統根據這個邏輯結果來選擇下一個應該呈現的視圖,呈現視圖的任務可以由組件自身直接完成,也可委派給專門的呈現器來完成。但有時碰到的特殊情況,僅用上面的步驟是無法完成的。如在要求輸入字符串的文本框中輸入數字或日期,或者輸入的是字符串,卻是無效數據等,于是在JSF中引入了轉換和驗證機制,來協助用戶組件更好的完成任務。在數據類型轉換、驗證及處理事件的過程中一旦發生錯誤,便產生相應的消息,并顯示給用戶,提示用戶下一步的策略。
JSF的事件監聽器Listener是建立在JavaBean的事件處理機制上的,與JavaBean 的事件模型一樣,JSF 框架中有強類型的事件類和監聽器接口,應用程序可以通過類Listener 和Event 來處理UI組件生成的事件。當用戶與用戶界面組件交互時會觸發某種類型的事件,事件監聽器根據組件上的EL表達式的值來確定待處理的事件。
當一個對象A 依賴于B,則對象B 對A 有控制權,如若B 發生變化,對象A 也一定隨之發生變化。而控制反轉IOC 就是讓這種對象間的依賴關系發生轉移。它要求“程序不應依賴實現,而是依賴接口”。也有人把IOC 稱為依賴注入。為了達到控制反轉的目的,容器或者框架需要引入一個裝配者對象,在JSF中就是托管Bean的任務。對象依賴關系如圖4所示。

圖4 對象依賴關系
Backing Bean 不再依賴業務服務的具體實現對象,而是被托管Bean所依賴,此時托管Bean還依賴于具體的業務實現。將Backing Bean和具體的業務服務實現配置在faces文件中供托管Bean使用,無須對托管Bean代碼做更改,Backing Bean具體的業務服務的實現無須再改動其代碼了,而是更改相應的配置文件,大大降低了程序的耦合度。依賴注入分為接口注入、設值注入和構造子注入3種類型。實際應用中,后兩種出現較多。
1.UI 組件。JSF 的UI 組件是真正意義上的UI 組件,能極大地簡化程序員的工作,如,在頁面上放置一個文本輸入框,這個輸入框立即具備了數據填充、界面更新、事件偵聽、動作觸發、有效性檢查和類型轉換的功能。更為重要的是,程序員只需根據業務邏輯編寫核心業務代碼,JSF會保證代碼在合適的時候被執行,完全不用考慮代碼與代碼之間該如何來配合。
2.事件驅動模式。事件是面向對象方法的重要組成部分,對象之間通過事件進行溝通和交流,使得一個或多個對象能夠對另一個對象的行為作出響應,共同合作去完成一項業務邏輯。通常,編寫Web 程序時,程序員要為對象之間的溝通設計機制,編寫代碼。雖然溝通的內容屬于業務邏輯,但溝通的機制顯然與業務沒有太大關系,程序員因此為業務邏輯之外的功能浪費了時間。JSF改變了這種狀況。JSF的事件和偵聽模式與大家熟悉的Javabean 的事件模式類似,有Java 基礎的程序員并不需要學習任何新的東西。JSF的UI組件可以產生事件,如,當頁面上一個文本輸入框的內容被修改時,會發出一個“值改變事件”。另一個對象如果對“值改變事件”感興趣,只需注冊為該對象的偵聽者,并編寫處理例程,即可命令JSF在事件發生時自動調用處理例程。JSF做了所有該做的事,留給程序員的只有業務邏輯代碼的編寫。
3.用戶界面到業務邏輯的直接映射。如,表單提交是Web編程最常見的任務,也是最復雜的任務之一。當用戶在網頁上點擊“確定”按鈕時,瀏覽器將生成一個HTTP請求,發往服務器端的某個Servlet,執行該Servlet 的service 方法。在service 方法中,HTTP請求需要經歷解碼、類型轉換、有效性驗證、狀態保存、數據更新等環節,處理這些環節的所有細節,對程序員來說是沉重的負擔。在JSF下,這些工作的很大一部分都由框架承擔了,在程序員看來,這個過程是透明的,用戶界面端的HTTP請求可以直接映射到后端的一個事件處理例程,JSF起到了承前啟后的作用。
4.程序員和網頁設計人員的分工。在JSP中,程序員和網頁設計人員的工作有時是互相交織、無法區分的。這是因為JSP頁面中摻入了網頁設計人員所不熟悉的一些JSP標簽,甚至是晦澀的Java代碼。要求網頁設計人員理解這些標簽和代碼是不現實的,不符合分工合作的原則。在JSF中,框架為網頁設計人員提供了一套標準的UI組件,在工具的支持下,可以通過拖放簡單地添加到網頁上,然后設置某些顯示屬性來滿足視覺要求。網頁設計人員不需要知道UI組件背后的復雜代碼,而程序員也不需要再處理任何與視覺相關的細節,程序員所做的只是給UI組件綁定類的屬性或方法。雖然程序員和網頁設計人員需要修改同一份文件,但他們各司其職,各得其所,互不干擾。程序員和網頁設計人員工作的明確劃分,是JSF在易用性方面邁出的一大步。
5.請求處理生命周期的多階段劃分。雖然都是建立在Servlet基礎之上,但JSF的生命周期要比JSP復雜得多。JSP的生命周期非常簡單,頁面被執行時,HTML標記立即被生成了,生命周期隨即結束。而一個完整的JSF請求—處理生命周期被精心規劃為6個階段,典型的JSF請求需要經歷所有階段,某些特殊的請求也可以跳過一些階段。階段的細分,顯然引入了更多的處理,但JSF框架會管理這一切,所以,程序員在獲得更多控制能力的同時,工作量并沒有增加。
6.全面的用戶自定義支持。JSF為程序員提供了很多默認的組件和類,通常情況下,JSF 的這些默認組件和類足以滿足Web開發的需要。但是,考慮到在某些應用場合,框架的默認行為也許不符合業務的要求,JSF特別允許程序員編寫自己的組件和類,來滿足客戶的特殊需求。例如,程序員可以編寫自己的UI組件,甚至可以創建自己的EL解釋器,來支持非標準的EL表達語言。
JSF 技術是基于MVC 模式的開發框架,它提供了豐富的用戶組件UI,較完美地將JSP,Servlet,JavaBeans 結合起來,提高了開發效率。并且JSF實現了一個開放的架構,允許開發人員創建自己的組件,或者在現有的組件上繼承,開發功能更強大的組件,體現了JSF的靈活性和可延展性。相信隨著JSF技術的不斷完善,基于JSF 框架的Web 應用將會越來越多,JSF 的運用范圍也會更加廣泛。