C01.JSF(JavaServer Faces)

A Web Framework !

JSF 為有狀態的 UI 組件模型

JSF(JavaServer Faces) 為 JEE 所提供以使用者介面(User Interface, UI)組件型態的 Web 框架, 主要功能在於:
  1. 簡化使用者介面(UI)上的開發, 減少開發與維護時間.
  2. 易於制作頁面與頁間的流程關係(可視化 IDE 開發支持)
  3. UI 封裝了 JS 框架UI 與 AJAX
  4. 視圖描述语言(JavaServer Faces View Declaration Language,簡稱 Facelets)
    1. Facelets 通常是使用 XHTML 標記語言所編寫, 因此 Facelets 是可跨不同開發平台
  5. 事件驅動 UI 組件

JSR 標準規範




RIA 與 JSF


標準的 JavaServer Faces(JSF)的框架的擴展,旨在去除方程中的 JavaScript 從而簡化程序員的工作流程。換句話說,JSF 通過 Java 應用介面為你處理了所有的JavaScript / Ajax。通過刪除這些自定義 JavaScript 函數的複雜引入,大大簡化了創建富網絡應用的任務。
如果你的團隊主要成員是 Java 開發人員,或者如果你的網絡應用程序不需要其它 JSF 沒有的複雜組件,又或者如果你的網絡應用程序是事件驅動 的, 那麼使用ICEfaces是很好的選擇。




JSF 2.0 改變



始於 2008年 JSR 314 草案
  1. 引入 Java 5.0 Annotation, 以允許簡化 XML 配置
    1. Web 應用程序的 XML 配置始終是個麻煩問題 — 它非常冗長並且容易出現錯誤,因此最好將 XML 配置委託給一個框架,比如通過註釋、約定或特定於領域的語言。作為開發人員,我們應該能夠集中精力實現一些操作,而不是將浪費時間在冗長的 XML 方面。
    2. 通過使用 Annotation 和 Default values 來減少 XML。
  2. .JSP -> .XHTML
    1. 使用基於 Facelets 的視圖技術代替 JSP。
    2. 盡可能不要混用 JSP / JSTL 在 JSF 2+
    3. 以JSF為中心的Facelets是JSP的一個替代方案,被JSF開發者廣泛使用,它通過復合組件來支持模板,這在一定程度上改進了JSF。
  3. /resources
    1. 提供一種標準化的資源處理機制:很多組件都需要諸如JavaScript文件、圖片或者是CSS元素等內容來正確地進行渲染。JSF 1.x 無法方便地處理這些內容,所以組件開發者不得不開發自己的處理機制。
    2. <h:outputScript name="wisdomfish.js" library="scripts" />
    3. 可重新定位的資源:我們可以指定在哪裡渲染資源,這個渲染位置可能與視圖中的資源標籤位置不同。這使得我們可以定製組件和JSF頁面以在恰當的地方渲染引用的資源,這樣即使組件被包含在body中,我們也可以在中引用CSS文件。
  4. 擴展JSF 1.2中引入的AJAX支持。
  5. JSF Templates engine.
    1. 這種方式需要創建一個包含模板標記和組件的XHTML頁面,然後將這些頁面作為組件在其它頁面中使用。任何有效的Facelet XHTML頁面都可以作為組件使用,與JSF 1.x中使用Facelets不同,JSF 2中的復合組件都是真正的UIComponents,這樣它們就會支持驗證器、轉換器及監聽器(可以監聽行為和值的變化)。

系統事件:發佈/訂閱的事件模型所支持的事件不再特定於一個具體的應用,而是起源於JSF應用執行過程中的特定時間點。UI組件和應用對象(這是一個單例)都能收到系統事件。
增加的scopes:增加了視圖scope和組件scope。對對話scope的支持預計會通過Web Beans API增加。
「project stage」參數的標準化:Project stage提供一種方式來影響JSF的行為,這以一組預先定義好的階段枚舉為基礎,而這些階段可以通過上下文參數或者JNDI進行設置。比如說,產品化開 發和檢查期間可以在瀏覽器中顯示更多的調試資訊。已定義的階段有產品化、開發、單元測試、系統測試及產品化擴展階段,並將產品化擴展作為默認值。你可以在 運行時通過調用Application.getProjectStage()來查詢應用對象以獲得相應的值。



Requires libs


JSTL 1.2

UEL

JSF 2.0 requires java 1.5 or later, JSP 2.1, JSTL 1.2 and a Java Servlet 2.5 implementation.


References
Configuration


WEB-INF/
  • web.xml
    • url-pattern-mapping: *.jsf -> *.xhtml
  • faces-config.xml
    • navigation-rule
    • ManagedBean Scope

YouTube Video




Facelets


WebContent/

Following ...

a.jsf (Mapping)

a.xhtml
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html">
...
<h:commandButton value="Sign Me Up!" 
                   action="#{healthPlanBean.signup}"/>

Checked faces-config.xml

  <navigation-rule>

    <from-view-id>/health-plan-signup-2.xhtml</from-view-id>

    <navigation-case> ...




action="#{healthPlanBean.signup}" 
==> src/.../HealthPlanBean.java
Member ---> method: singnup( ) 
return Value to <navigation-case>



ManagedBean


import java.faces.bean.*

@ManagedBean
@RequestScope
public class HealthPlanBean{
    public String signup(){
        // implement content
        return ...;
    }
}

JPA 2.0


// TODO implements content

Subpages (23): View All
Comments