簡介
Facelets是用來建立JSF應用程式時的一個可供選擇的表現層技術。Facelets提供了一個強有力的模板化系統,讓你使用HTML樣式的模板來定義JSF的表現層,減少了組件整合進表現層時候冗餘的代碼,而不需要一個web容器。
模板框架
在提供針對組件構建設計的模板框架方面,Facelets 與 Tapestry 類似。但是,對於具有 JSP 背景的我們來說,Facelets 看起來比 Tapestry 友好得多。它允許使用熟悉的 JSTL 樣式的標記和 JSTL/JSF/JSP 樣式的表達式語言。大大降低的學習曲線意味著可以更加迅速地開始開發。
Facelets 和 TapestryFacelets 與 Tapestry 很相似,可以相互比較。實際上,Tapestry 剛出現的時候,大大領先於它的時代,而 Facelets 確實借鑑了它的一些想法。但是,如果只把 Facelets 當成 JSF 版本的 Tapestry,那就錯了。這兩項技術是不同的。要了解關於 Tapestry 的更多內容,請參閱 Brett McLaughlin 兩部分的系列 “In tune with Tapestry”。
Facelets 允許定義能夠直接包含進頁面或者容易地添加到 Facelet 標記庫的組件集。實際上讓人高興的是在 Facelets 中定義定製標記(複合組件和類似 JSP 定製標記的標記)的迅速。使用這些組件集,Facelets 還允許定義站點模板(和更小的模板)。這與使用 Tiles 很相似,但是少了定義檔案。也可以在定製 JSF 組件內部使用 Facelets,因為 Facelets API 提供了可以容易地與 JSF 組件集成的接口。
特性
模板化(像 Tiles) 複合組件 定製的邏輯標記 表達式語言 對設計師友好的頁面開發 創建組件庫
這些特性比我想像的要更相關和統一。在這篇文章中,我討論前兩個:模板化和複合組件。我使用的 Web 應用程式基於為我的針對懷疑者的 JSF 系列開發的一個應用程式,我把它更新成使用 Facelets 視圖而不是 Tiles。
Facelets 概述
對於 Facelets 可能會做的最大一個錯誤假設,就是它只是 Tiles 的替代品。Facelets 遠不止如此:它是思考 JSF 的新方式。
選擇標記雖然多數開發人員把 Facelets 用於 XHTML,實際上這個框架並不在意使用什麼標記:它與 XUL (XULFaces)兼容, Kito Mann 已經用它為 JSF 中心提供 RSS。
JSP 是種生成 servlet 的模板化語言。JSP 的主體與 servlet 的 doGet() 和 doPost() 方法等價(也就是說,成為 jspService() 方法)。JSF 定製標記(例如 f:view 和 h:form)只是調用 JSF 組件來呈現它們自己的當前狀態。JSF 組件模型的生命周期獨立於 JSP 生成的 servlet 的生命周期。這種獨立性就是混淆的來源。
與 JSP 不同,Facelets 這個模板化語言,從構建之初,就考慮了 JSF 的組件生命周期。使用 Facelets,生成的模板會構建組件樹,而不是 servlet。這就允許更好的重用,因為可以把組件組合成另一個組件。
Facelets 減少了編寫定製標記才能使用 JSF 的需求。Facelets 本身就可以使用 JSF 定製組件。溝通 JSF 和 Facelets 只需要很少的特殊編碼:要做的全部工作就是在 Facelet 標記庫檔案中聲明 JSF 組件。在 Facelets 模板化語言中可以直接使用 JSF 組件,不用任何額外的開發。
JSF 和 Java 伺服器頁面技術之間的不匹配,是 JSF 開發中的一個嚴重問題。問題是如何把 JSP 的動態內容集成到 JSF 基於組件的模型中。JSP 非常重視生成動態內容輸出,而 JSF 需要 JSP 來協調組件模型的構建。因為這個任務超出了 JSP 原來的目的,所以產生了距離。
大多數 JSF 開發人員只是學會了一事一議地解決這類問題,但是這就像在錘子上放一個枕頭,最終還會掉下來打傷腦袋。Facelets 是更加全面的解決方案:專為 JSF 組件模型度身定製的模板化語言。