j2ee高級開發技術課程第六周
一.jsf(java server faces)的運行原理(工作方式)
1.jsf應用是事件驅動的,當一個事件發生時(比如用戶單擊一個按鈕),事件通知通過HTTP發往服務器,服務器端使用叫做FacesServlet的特殊servlet處理該通知,web容器裏每一個jsf應用都有它自己的FacesServlet;
在後臺,每一個jsf請求都觸發了3件事情:
1)FacesServlet創建FacesContext(該對象中包含Web容器傳給FacesServlet的service方法的ServletContext,ServletRequest,ServletRespons對象,在處理過程中主要就是修改這個FacesContext)
2)FacesServlet把控制權交給Lifecycle
3)Lifecycle分6個階段處理FacesContext(也即jsf生命周期過程)
二.jsf生命周期過程
1. 重建視圖: 建立組件樹,如果是首次渲染,則組件樹被重置合適的狀態;如果不是首次渲染,則組件樹被創建跳到響應階段(JSF的組件樹結構和DOM是一樣的,只不過後者是client前者是server)。
2. 應用請求值: 樹中的每個組件都能從請求參數中提取到新的值,並把值存儲本地,之後處理所有與組件相關的事件進入隊列,如果某個組件的immediate屬性設置為true,那麽驗證,轉換,以及與組件關聯的事件在這個階段被處理.
3. 處理驗證: 組件值轉換成與之相對應的數據類型。如果轉換失敗,這一階段將繼續完成所有剩余的轉換器,驗證和運行所需的檢查,但在完成後,跳轉到生命周期的Render Response階段。如果驗證成功,則檢查組件上的required 的屬性。如果該屬性是必須的並且組件中輸入了值,那麽與之相關的驗證程序運行。如果required的屬性是必須但又沒有輸入值,這一階段完成(所有剩余驗證程序還會繼續執行),然後生命周期跳躍到Render Response階段。如果required 屬性標識為false,不管組件中有沒有輸入值,驗證過程都不會運行。
4. 更新模型: 驗證組件的本地值移動到模型中,同時本地副本被丟棄。
5. 調用應用程序: 執行應用級邏輯(如事件處理程序)。
6. 呈現響應: 呈現樹中的組件。後續請求和Restore View階段保存狀態信息。
二、Facelets
Facelets是一種輕量級的頁面聲明語言,用於使用HTML樣式構建JSF(JavaServer Faces)視圖。
它包括以下功能:
- 它使用XHTML創建網頁。
- 除了支持JavaServer Faces和JSTL標記庫之外,它還支持Facelets標簽庫。
- 它支持表達語言(EL)。
- 它是使用組件和頁面的模板。
優點
- 它通過模板和復合組件支持代碼可重用性。
- 它通過定制提供組件和其他服務器端對象的功能可擴展性。
- 編譯時間更快
- 它在編譯時驗證表達式語言。
- 高性能渲染能力。
JSF(JavaServer Faces)技術支持各種標簽庫,以將組件添加到網頁。 為了支持JavaServer Faces標簽庫機制,Facelets使用XML命名空間聲明。
下表顯示了Facelets支持的標簽庫。
標簽庫 | URI | 前綴 | 示例 | 內容 |
---|---|---|---|---|
JSF Facelets標簽庫 | http://xmlns.jcp.org/jsf/facelets | ui: |
ui:component ,ui:insert |
模板標簽 |
JSF HTML標簽庫 | http://xmlns.jcp.org/jsf/html | h: |
h:head ,h:body |
所有UI組件對象的JavaServer Faces組件標記 |
JSF核心標簽庫 | http://xmlns.jcp.org/jsf/core | f: |
f:actionListener , f:attribute |
JSF標簽獨立於任何特定渲染工具包的自定義操作 |
傳遞元素標簽庫 | http://xmlns.jcp.org/jsf | jsf: |
jsf:id |
支持HTML5友好標記的標簽 |
傳遞屬性標簽庫 | http://xmlns.jcp.org/jsf/passthrough | p: |
p:type |
支持HTML5友好標記的標簽 |
復合組件標簽庫 | http://xmlns.jcp.org/jsf/composite | cc: |
cc:interface |
支持復合組件的標簽 |
JSTL核心標簽庫 | http://xmlns.jcp.org/jsp/jstl/core | c: |
c:forEach , c:catch |
JSTL 1.2核心標簽 |
JSTL函數標簽庫 | http://xmlns.jcp.org/jsp/jstl/functions | fn: |
fn:toUpperCase , fn:toLowerCase |
JSTL 1.2函數標簽 |
Facelets應用程序的生命周期
JSF規範定義了JavaServer Faces應用程序的生命周期。以下步驟為基於 Facelets 的應用程序的過程描述。
-
生命周期是在客戶端使用
Facelets
創建的網頁發出新請求時啟動。 JSF創建一個新的組件樹或javax.faces.component.UIViewRoot
並放入FacesContex
。 -
如果可用的
UIViewRoot
應用於Facelets
, 視圖可以填充組件進行渲染。 -
新建的視圖作為對客戶端的響應而被渲染。
-
在渲染時,存儲此視圖的狀態用於下一個請求。 存儲輸入組件和表單數據的狀態。
-
客戶端可以與視圖交互,並從JSF應用程序請求另一個視圖。 此時,保存的視圖從存儲狀態恢復。
-
恢復視圖再次通過JSF生命周期,如果沒有驗證問題,並且沒有觸發任何操作,最終將生成新視圖或重新呈現當前視圖。
-
如果請求相同的視圖,則再次呈現存儲的視圖。
-
如果要求新視圖,則繼續執行【步驟2】。
-
將新視圖作為對客戶端的響應。
j2ee高級開發技術課程第六周