JSF 組件:它們是什麼以及誰需要它們
JSF 框架的優勢之一是它基於組件的構架。組件是使用 JSF 技術構建任何 Web 應用軟體的構建板塊:它們會實現下面所有任務:
JSF 的規範以及它的實現提供了大量您(作為一個應用軟體開發者)可以立即使用的基礎組件:若干輸入組件(比如 inputText),若干輸出組件(比如 outputText),一個數據表格,一對布局面板(比如 panelGrid),一個按鈕,一個鏈接,以及圖像。
使用核心 JSF 實現所提供的這些組件構建一個功能性的 Web 應用軟體是可能的。然而, 對於這個組件設置卻有一定的限制。當您設計最新 Web 應用軟體時,您要盡量為您的用戶提供豐富的經驗,而且這些經驗與 JSF 規範相比提供了更多複雜的組件。您需要的組件有這些,比如菜單,豐富的文本編輯器,文件上載,以及日曆:這些正是用戶所期望的功能。
值得慶幸的是,JSF 構架非常靈活,並且除了 JSF 應用軟體所提供的那些之外,它還允許您創建您自己的組件。因此,開發者創建了 JSF 組件庫來滿足其它應用軟體開發者的需求。在當今市場上已經有幾種重要且普遍使用的組件庫,包括以下這些:
然而,雖然這些組件庫十分龐大,卻沒有一個能滿足所有開發人員需求的組件庫。您可能需要一個在您選擇組件庫中沒有的特殊 JSF 組件。
如果是這樣的話,您可能要自己反思反思,“我應該自己來構建這個組件嗎?”
很多情況下,答案是“是的”。構建一個自定義 JSF 組件通常是正需要做的事情。一個自定義組件可以讓您在一個 JSF 標籤中容納許多功能。那麼您就可以在許多頁面和應用軟體中重新使用這個標籤,並可以在您的組織中與其他開發人員共享。它還簡化了維護工作,因為這個功能保存在一個位置,而不是散布在您組織中的許多頁面中。
例如,假想您的應用軟體需要搜集關於一個用戶地址的信息。您很可能需要不止一次的操作:您可能對其他用戶的家庭地址,辦公地址,運輸地址,以及上演地址感興趣。您會查看所有的常見組件庫,但是沒有一個擁有處理地址的組件。因此您就要使用標準的 JSF 組件,並從各種輸入和輸出域中快速構建一個地址(圖 1)。
因為您不止一個頁面上需要這樣的地址組,您要在各個頁面上重複操作,還有可能在不同的應用軟體上重複此操作。您的頁面都能夠正常地運作嗎?是的。是不是有大量類似的編碼被重複了一次又一次呢?的確是這樣。這難道就是維護的噩夢嗎?完全正確。如果一周后您需要重新排列這些域或者添加其它國家的域怎麼辦?您需要在創建這個地址組的每個頁面進行變更!
如果用您自己創建的包含這個組的組件來替代,然後使用單個的標籤,比如很普遍的 <my:inputAddress value="#{address}" /> 就會容易多了。您的 JSP 源代碼應給更精悍更清晰,如果您曾需要變更這個地址組,您就只需要在一個位置進行變更。您還可以與您的同事或者在線社區共享您的 inputAddress 組件,這樣每個需要這樣組件的人都可以從您的工作中獲益。
到目前為止可以很清楚地看到,創建一個自定義組件是一件有益的事情,但是最佳創建方法是什麼呢?雖然 JSF 規範可以創建新的組件,但是它不能使其簡化。如果您想創建一個組件,您需要創建三個 Java 類:
除了那些類,還應該在 faces-config.xml 文件以及 標籤庫 文件中提供關於這個新組件的信息。這是一項乏味且容易出錯的工作。
這就是為什麼 Rational Application Developer V7.5 要有一個能夠幫助 JSF 開發人員快速且簡便地創建自定義組件的新特徵。作為一名組件創造者,您可以使用熟悉的 Rational Application Developer 工具(比如從面板中拖放,WYSIWYG 編輯器, Properties, 以及 PageData 視圖),並且 Rational Application Developer 能夠自動為您創建所有所需的 Java 類和配置文件。
當然,如果您是一名高級用戶,您仍然可以自己調節生成的 Java 類來實現更大的動力和靈活性。然而,您不需要了解內部 JSF 構架的用來在 Rational Application Developer 中創建組件的相關知識。
要論證這個新特徵,您要為每個常用案例,比如附有標籤的輸入域,來創建一個簡單的自定義 JSF 組件,如列表 1所示。
<h:outputText value=”Name:” / > <h:inputText value=”#{person.name}” /> |
這樣的對幾乎在每個 JSF 應用軟體中都能找到。即使這個地址組先前顯示在 圖 1 中也能找到三次。您需要將這兩個標籤置於一個單個的可用組件中,如列表 2所示。
<my:inputLabel value=”#{person.name}” label=”Name:” /> |
創建一個自定義 JSF 組件
JSF 組件很少獨立存在。相反,它們多數是一個組件庫的組成部分,組件庫就是組件的集合,您可以將它們拖入到任何應用程序中,可以重複使用,以及共享。組件庫通常是一個單獨的 Java™ archive (JAR) 文件,它包括大量的組件,並且組件庫可以使用所有的配置文件。IBM 的 JWL, MyFaces 的 Tomahawk, 以及 JBOSS 的 RichFaces 都是組件庫的例子。
因此,要創建一個自定義組件,您首先要創建一個組件庫。
創建一個組件庫
要創建一個組件庫:
New Faces Component Library 會打開。注意它看起來與您用來創建新 Web Project 的嚮導十分相似。唯一的區別是,Configuration 域設置為 Faces Component Library,如圖 2 所示。Rational Application Developer 中的整個自定義 JSF 組件的設計與您所熟悉的標準 Web 和 JSF 工具十分相似,這樣您的學習曲線就可以降到最低。
創建一個組件
一個 New Custom Component 嚮導會被打開。再次注意,這個嚮導與您曾打算創建的常規 Web 頁面幾乎一模一樣。唯一的不同是,您選擇用來將頁面定義為 Custom Faces Component 的特殊模板,如圖 4 所示。
當您點擊 Finish之後, Rational Application Developer 將創建一個 JSP 文件,可以讓您設計這個組件並在這個編輯器中打開。注意這只是一個常規的 JSP 文件,當您用它工作時,所有您熟悉的 Rational Application Developer 工具您都可以使用:
然而,與常規 JSF 頁面不同的是,自定義組件並沒有 <BODY> 或者 <f:view> 標籤。相反,它使用了一個特殊的 <jsfc:component> 標籤,可以包含將組成您的自定義組件的其它 JSF 標籤。
檢查 Enterprise Explorer 視圖中您的存儲庫項目。注意您剛才創建的組件 JSP 文件之外,Rational Application Developer 還在這個存儲庫中生成了大量其它的文件,如圖 5 所示。
生成的文件包含以下內容:
無論何時您對包含這個組件定義(在這個案例中是 inputLabel.jsp) 的 JSP 文件進行變更時,Rational Application Developer 就會自定重新生成所有其它功能組件存儲庫所需的文件。它然後會將它們打包到一個單獨的 JAR 文件中。這個 JAR 文件能夠有效地變成您自己的組件庫,您可以在以後項目中使用這個組件庫並與其他人一起分享。Rational Application Developer 還會生成一個測試頁面,使您能夠看到這個自定義組件被分配到這個伺服器時是如何操作的。
配置一個 Component
既然您現在已經創建了一個新組件,該配置它的屬性和屬性了。
您現在可以使用 Properties 視圖來配置這個新組件,如圖 6 所示。
對於您的 inputLabel 組件,將它配置成得像一個 Input 組件一樣進行操作,並添加兩個屬性:標籤和值。
一旦配置,這個 inputLabel 組件的 Properties 視圖看起來就應該如圖 8 所示。
注意,因為您使這個組件像一個 Input 組件一樣操作,因而 Rational Application Developer 會自動添加 最接近的, 需要的,以及典型的 Input 組件的 valueChangeListener 屬性。
創建組件內容
現在該是定義這個 inputLabel 組件實際內容的時候了。正如您所記住的那樣,您想要它成為一個顯示標籤的 outputText,緊跟著的是顯示一個值的 inputText。
注意您在 Properties 視圖中配置的自定義組件屬性也列在 Faces 組件 類別下的 PageData 視圖中。
當您將一個組件屬性捆綁到另一個組件上時,一個特殊的 JSF 表達就會產生來訪問這個屬性的運行時: #{component.attribute},如圖 10 所示。
這意味著,如果您將如這個案例一樣來使用這個組件, <my:inputLabel value=”#{person.name}” label=”Name:” />,那麼 outputText 的值將會變成 “Name:” ,同時 inputText 的值將會變成 #{person.name}。
這就是您在定義一個新組件內容所要做的一切。一旦您保存了這個頁面,Rational Application Developer 將會自動更新所有所需的構件,而且這個組件庫也可以隨時被使用。
測試這個組件
現在您已經創建了一個新組件,那麼在將它應用到實際應用軟體上或者將它與其它人共享之前,您可能要測試它是如何在伺服器上運行的。為了達到這個目的,Rational Application Developer 已經創建了一個測試頁面: testInputLabel.jsp。這個測試頁面是一個常規的 JSP,它包含這個新組件標籤,因此您要將它部署到一個伺服器上,從而可以查看這個新組件的行為。
一旦這個瀏覽器打開,您將看到一個標籤后緊跟著的是一個輸入域,兩者都顯示了這個新組件屬性所制定的值(圖 12)。
您現在已經使用 Rational Application Developer 工具創建了一個完整的功能性新 JSF 組件。
使用 Web 應用軟體中的自定義組件
您現在已經擁有一個全新的 JSF 組件庫,您可以在您的 Web 應用軟體中使用,也可以與其他同事分享。
Rational Application Developer 自動將屬於您的組件庫所有構件打包到一個單獨的 JAR 文件中,您可以自己使用也可以分配給其他人。然而,要充分使用 Rational Application Developer 的工具特性,您需要為您的存儲庫創建一個 存儲庫定義。為了簡短描述 Rational Application Developer 的支持,請看 參考資料 部分。
創建一個存儲庫定義
要為剛才創建的存儲庫創建一個存儲庫定義:
當 Rational Application Developer 完成了您存儲庫的處理過程后,編輯器就會打開。在編輯器中,您可以自定義您的新存儲庫和組件工具支持的所有方面:
既然 Library Definition 已經創建,您可以開始在常規 Web 項目中使用這個新存儲庫,或者您可以與其他人共享這個 Library Definition 項目 (MyLibrary)。
在 Web 應用軟體中使用這個自定義組件
當這個頁面在這個編輯器中打開時,您將看到您所創建的新組件存儲庫和新組件在 Palette 上都是可利用的,緊鄰所有常規 Rational Application Developer 面板抽屜,如圖 14 所示。
有了更早期的測試頁面,您將看到一個 <m:inputLabel> 標籤被添加到這個 Web 頁面的源中。這個標籤像一對 outputText 和 inputText 組件,較為形象化地顯示在 Design 視圖中,如先前的 圖 11 所示。這個標籤在 Properties 視圖中是可利用的,Value Changed 事件在 QuickEdit 視圖中也可以被使用。
您在 Web 項目中已經成功地使用了您自己自定義的 JSF 組件。(責任編輯:A6)
[火星人 ] 在 IBM Rational Application Developer V7.5 中創建自定義 Java已經有703次圍觀