本節書摘來異步社區《Java EE 7精粹》一書中的第2章,第2.1節,作者:【美】Arun Gupta,更多章節內容可以訪問云棲社區“異步社區”公眾號查看。
第3章 JSF
JSF是基于Java的Web應用程序開發的服務器端用戶界面(UI)框架。使用JSF可以實現:
- 使用遵循模型-視圖-控制器(MVC)設計模式的可重用的UI組件集合來創建網頁。
- 綁定組件到服務器端模型,允許UI與應用程序數據雙向移動。
- 處理UI事件響應和模型交互中的頁面導航。
- 管理跨服務器請求的UI組件狀態。
- 提供從客戶端生成的事件到服務器端應用程序代碼的簡單模型。
- 輕松地構建和重用自定義UI組件。
JSF應用程序包括:
- 置于UI組件的布局中的一組網頁。
- 一組托管的Bean,包括綁定組件到服務器端模型的Bean(通常是CDI Bean)和作為控制器的Bean(通常是EJB或CDI Bean)。
- 可選的部署描述符文件web.xml。
- 可選的配置文件faces -config.xml。
可選的一組自定義對象,包括應用程序開發人員創建的轉換器和監聽器。
3.1 Facelets
Facelets是JSF的視圖聲明語言(又名視圖處理器)。他是JSP的替代者,JSP現在只保留了向后兼容性。在JSF2規范中引入的新功能,如復合組件和Ajax,只會暴露給Facelets的使用者。Facelets的主要優點包括一個功能強大的模板系統,可重用和易于開發,更好的錯誤報告(包括行號),以及對設計人員友好。
Facelets頁面使用XHTML1.0和層疊樣式表(CSS)來編寫。XHTML1.0的文檔是遵循XML1.0規則書寫的HTML4文檔。頁面必須符合XHTML-1.0-Transitional DTD的要求。
使用XHTML定義的一個簡單的Facelets頁面如下:

在這段代碼中,XML聲明之后是文檔類型定義(DTD)。頁面的根元素是html,其中聲明了命名空間http://www.w3.org/1999/xhtml。聲明XML命名空間是為了在Web頁面中使用標簽庫,Facelets的html標簽(那些以h開頭的標簽)和普通的html標簽用于添加組件。
表3-1給出了Facelets支持的標準標簽庫集合。

按照慣例,使用XHTML創建的Web頁面使用.xhtml作為擴展名。
Facelets提供表達式語言(EL)集成,這使得后臺Bean可以和前臺UI之間實現雙向的數據綁定:

在這段代碼中,EL表達式#{name.value}代表請求作用域的CDI Bean的value字段的值:

重要的是要為這個CDI Bean添加@Named注解,以使其可以依賴注入到EL表達式中。
在JSF2.2中,@javax.faces.bean.ManagedBean注解是未來的版本中不建議使用的,所以強烈建議使用@Named來代替。
JSF2.2還引入了新的CDI作用域:javax.faces.view.ViewScoped。在一個Bean上指定該注解,可以將這個Bean與當前視圖綁定。javax.faces.bean.ViewScoped注解是未來的版本中不建議使用的,所以強烈建議使用新引入的作用域。
同樣地,一個EJB可以在EL表達式注入:

這是一個無狀態的會話Bean,包含一個返回客戶名稱列表的業務方法。@Named標記它可以依賴注入到EL表達式中,可以在Facelets的EL表達式中使用:

在這段代碼中,客戶名稱列表的返回值顯示在一個表格組件當中。請注意getCustomerNames方法是如何作為一個屬性用在EL表達式中的。
Facelets還提供了編譯期EL表達式驗證。
此外,Facelets提供了一個功能強大的模板系統,使我們可以在一個Web應用程序的多個頁面之間提供一致的界面外觀。基礎頁面稱為模板,是通過Facelets的模板標簽創建的。這個頁面為Web頁面定義了一個缺省頁面骨架,包括內容占位符,會在將來的頁面中使用模板來添肉。模板客戶端頁面使用這個模板,為模板骨架中定義的占位符提供具體的肉(實際的內容)。
表3-2列出了一些在模板和模板客戶端頁面中使用的通用標簽。

模板頁面的外觀示例如下:

在這段代碼中,在頁面中使用
模板客戶端頁面示例如下:

在這段代碼中,名為top和bottom的ui:insert沒有定義,那么這些部分使用模板頁面的ui:define元素的名稱匹配模板中的ui:insert元素,因此模板的這部分內容被替換。