Facelets專為JSF設(shè)計的視圖技術(shù)
由于最近在 Java™ 服務(wù)器外觀(JSF)項目上工作,我很有幸***次使用了 Facelets。關(guān)于 Facelets,我最喜歡的是它讓我可以創(chuàng)建可重用的復(fù)合組件。能夠拿出一個頁面(例如 JSP)并把它變成組件,對于我的 JSF 開發(fā)來說真是莫大的好處。我的結(jié)論是什么?如果不用 Facelets,那么就無法得到能從 JSF 獲得的***收獲。
JSF 和 Java 服務(wù)器頁面技術(shù)之間的不匹配,是 JSF 開發(fā)中的一個嚴重問題。問題是如何把 JSP 的動態(tài)內(nèi)容集成到 JSF 基于組件的模型中。JSP 非常重視生成動態(tài)內(nèi)容輸出,而 JSF 需要 JSP 來協(xié)調(diào)組件模型的構(gòu)建。因為這個任務(wù)超出了 JSP 原來的目的,所以產(chǎn)生了距離。
大多數(shù) JSF 開發(fā)人員只是學(xué)會了一事一議地解決這類問題,但是這就像在錘子上放一個枕頭,最終還會掉下來打傷腦袋。Facelets 是更加全面的解決方案:專為 JSF 組件模型度身定制的模板化語言。
Facelets 有以下吸引人的特性:
◆模板化(像 Tiles)
◆復(fù)合組件
◆定制的邏輯標(biāo)記
◆表達式語言
◆對設(shè)計師友好的頁面開發(fā)
◆創(chuàng)建組件庫
這些特性比我想像的要更相關(guān)和統(tǒng)一。在這篇文章中,我討論前兩個:模板化和復(fù)合組件。我使用的 Web 應(yīng)用程序基于為我的針對懷疑者的 JSF 系列開發(fā)的一個應(yīng)用程序,我把它更新成使用 Facelets 視圖而不是 Tiles。在進一步閱讀之前,應(yīng)當(dāng) 下載示例代碼。如果要隨著討論一起操作,還需要 安裝 Facelets。
Facelets 概述
對于 Facelets 可能會做的***一個錯誤假設(shè),就是它只是 Tiles 的替代品。Facelets 遠不止如此:它是思考 JSF 的新方式。
JSP 是種生成 servlet 的模板化語言。JSP 的主體與 servlet 的 doGet() 和 doPost() 方法等價(也就是說,成為 jspService() 方法)。JSF 定制標(biāo)記(例如 f:view 和 h:form)只是調(diào)用 JSF 組件來呈現(xiàn)它們自己的當(dāng)前狀態(tài)。JSF 組件模型的生命周期獨立于 JSP 生成的 servlet 的生命周期。這種獨立性就是混淆的來源。
與 JSP 不同,F(xiàn)acelets 這個模板化語言,從構(gòu)建之初,就考慮了 JSF 的組件生命周期。使用 Facelets,生成的模板會構(gòu)建組件樹,而不是 servlet。這就允許更好的重用,因為可以把組件組合成另一個組件。
Facelets 減少了編寫定制標(biāo)記才能使用 JSF 的需求。Facelets 本身就可以使用 JSF 定制組件。溝通 JSF 和 Facelets 只需要很少的特殊編碼:要做的全部工作就是在 Facelet 標(biāo)記庫文件中聲明 JSF 組件。在 Facelets 模板化語言中可以直接使用 JSF 組件,不用任何額外的開發(fā)。
Facelets 模板框架
在提供針對組件構(gòu)建設(shè)計的模板框架方面,F(xiàn)acelets 與 Tapestry (請參閱 參考資料)類似。但是,對于具有 JSP 背景的我們來說,F(xiàn)acelets 看起來比 Tapestry 友好得多。它允許使用熟悉的 JSTL 樣式的標(biāo)記和 JSTL/JSF/JSP 樣式的表達式語言。大大降低的學(xué)習(xí)曲線意味著可以更加迅速地開始開發(fā)。
Facelets 允許定義能夠直接包含進頁面或者容易地添加到 Facelet 標(biāo)記庫的組件集。實際上讓人高興的是在 Facelets 中定義定制標(biāo)記(復(fù)合組件和類似 JSP 定制標(biāo)記的標(biāo)記)的迅速。使用這些組件集,F(xiàn)acelets 還允許定義站點模板(和更小的模板)。這與使用 Tiles 很相似,但是少了定義文件。也可以在定制 JSF 組件內(nèi)部使用 Facelets,因為 Facelets API 提供了可以容易地與 JSF 組件集成的接口。
從 Tiles 到 Facelets
如前所述,在這里使用的示例 Web 應(yīng)用程序基于為我的 針對懷疑者的 JSF 系列創(chuàng)建的示例。它為一家在線 CD 店管理庫存,創(chuàng)建、讀取、更新和刪除(CRUD)清單。它包含一個表單,讓用戶向系統(tǒng)輸入新 CD,有一個單選按鈕列表,允許用戶選擇音樂分類。當(dāng)用戶選擇了一個分類時,就觸發(fā)某些 JavaScript 立即把表單提交回服務(wù)器。應(yīng)用程序還包含一個 CD 清單,用戶可以根據(jù)標(biāo)題或藝術(shù)家對清單中的 CD 排序。
在線 CD 商店示例的類圖
【編輯推薦】