JSF中的組件樹概念尤其重要。組件樹大量使用了組合設計模式,為開發者提供了大量的包括日歷,表格,樹,列表等標準Web組件。
同時JSF還提供了大量的組件支持類,例如轉換器(可以進行類型轉換),驗證器(進行數據驗證),繪制器(不僅僅可以使用HTML來繪制組件)。接下來我們分析一下用戶界面組件。
所有組件都要實現javax.faces.component.UIComponent接口。這個接口定義了瀏覽組件樹,和支持Bean交互,管理組件(包括數據驗證,數據轉換和組件繪制)等任務和方法。
JSF提供了一個組件基類:javax.faces.component.UICompoentBase。它實現了一些基本的默認的組件方法,給開發人員提供了方便,一般來說,你只需要重寫特定的方法即可。
JSF使用了適配器模式幫助你使用最少的代碼完成大部分工作。
如果你想創建組件,那么有三條路可以走:
直接實現UIComponent接口
繼承UIComponentBase類
繼承已經存在的UIComponent實現
已經存在的UIComponent組件類主要有如下:
● UIForm 表示一個輸入表單
● UICommand 表示一個可在激活時執行一個動作的命令組件
● UIOutput 表示一個可顯示值的組件
● UIGraphic 表示一個可顯示圖像的組件
● UIInput 表示一個可獲取和顯示用戶輸入的組件
● UIParameter 用于為父組件配置參數值
● UIPanel 表示一個面板(容器)組件
● UISelectItem 表示選擇組件中的一個選擇項
● UISelectItems表示選擇組件中的多個選擇項
● UISelectBoolean表示一個具有boolean值的組件
● UISelectOne 表示一個允許用戶在一系列值中選擇零個或一個值的組件
● UISelectMany表示一個允許用戶在一系列值中選擇零個或多個值的組件
事實上,一個JSF組件包括了三個部份:Tag、Component
與Renderer。
Tag就是之前使用的標簽,它的目的在于設定Component屬性,設定驗證器,設定方法綁定等。
Component請求時,每個Component會根據自己的ID值,從請求中取得相應的值,綁定到Bean。當請求來到應用程序時,需要通過解碼(decode)來
將HTTP中的內容轉變成JSF組件需要的值,相對的,當JSF組件將值轉變成HTTP字串資料送到客戶端,供客戶端顯示,就稱為編碼(encode)。
Component可以自己實現編碼,解碼,也可以委托Renderer來實現。
Renderer是一個可替換的組件,Component可以搭配不通的Renderer,而不用自定義編碼,解碼工作,這樣Component可以達到重用。
你也可以編寫自己的Renderer,如果你對前臺的顯示有自己獨特的要求的話。甚至可以讓你的系統在移動設備等不同的平臺上應用。
javax.faces.component.UIComponent
自訂Component所要繼承的父類別,但通常,您是繼承其子類別,例如UIInput、UIOutput等等。
javax.faces.webapp.UIComponentTag
自訂JSF標簽所要繼承的父類別,繼承它可以幫您省去許多JSF標簽處理的細節。
javax.faces.context.FacesContext
包括了JSF相關的請求資訊,您可以透過它取得請求物件或請求參數,或者是。
javax.faces.application.Application物件
包括了一個應用程式所共享的資訊,像是locale、驗證器、轉換器等等,您可以透過一些 工廠方法 取得相關的資訊。