自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

JSF應(yīng)用程序的生命周期

開發(fā) 后端
本文詳細(xì)介紹JSF應(yīng)用程序的生命周期,包括恢復(fù)視圖,應(yīng)用請求的值和更新模型值等。

與很多流行的觀點(diǎn)不同,我們無需了解技術(shù)工作原理的所有細(xì)節(jié),就可以編寫 JSF 應(yīng)用程序。您只需要給自己設(shè)置一個(gè)項(xiàng)目,并從頭到尾不斷修修補(bǔ)補(bǔ),這樣就可以學(xué)習(xí)到大量的知識。另一方面,理解必要的基礎(chǔ)知識可以使您的開發(fā)工作更加有效 —— 而且會(huì)節(jié)省很多時(shí)間。

在本系列 懷疑論者的 JSF 的第 2 篇文章中,我們將逐一介紹一下 JSF 請求處理生命周期的 5 個(gè)階段。我們將介紹在每個(gè)階段中會(huì)發(fā)生什么,以及這些階段是如何相互連接在一起的,然后使用一個(gè)示例程序來展示實(shí)際的生命周期。我們還將向您介紹如何在 JSF 開發(fā)中采用 Struts Tiles,以及如何組合使用 JSF 和 JavaScript 技術(shù)進(jìn)行即時(shí)事件的處理。

正如上一篇文章中介紹的一樣,示例程序的默認(rèn)編譯環(huán)境是 Maven。您可以通過點(diǎn)擊頁面頂部或底部的 Code 圖標(biāo)下載源代碼。為了簡單性起見,您會(huì)發(fā)現(xiàn)與上一篇文章中一樣的示例設(shè)置。

JSF應(yīng)用程序的生命周期:概述
JSF 程序生命周期的 5 個(gè)階段如下(注意每個(gè)階段的事件處理):
1. 恢復(fù)視圖
2. 應(yīng)用請求的值;處理驗(yàn)證
3. 更新模型值;處理事件
4. 調(diào)用程序;處理事件
5. 進(jìn)行響應(yīng);處理事件

這 5 個(gè)階段顯示了 JSF 通常處理 GUI 的順序。雖然這個(gè)清單列出了每個(gè)階段中事件處理的可能執(zhí)行順序,但是 JSF生命周期很難是固定一成不變的。您可以通過忽略某個(gè)階段或合并整個(gè)生命周期從而對執(zhí)行順序進(jìn)行修改。例如,如果一個(gè)無效的請求值被拷貝到一個(gè)組件中,那么當(dāng)前的視圖就會(huì)重新顯示,而有些階段就可能不會(huì)執(zhí)行。在這種情況中,您可以執(zhí)行一個(gè) FacesContext.responseComplete 方法調(diào)用,將用戶重定向到一個(gè)不同的頁面上,然后使用請求分發(fā)器(從 FacesContext 中的請求對象中獲得)將其轉(zhuǎn)發(fā)到一個(gè)適當(dāng)?shù)?Web 資源上。另外,您可以調(diào)用 FacesContext.renderResponse 重新顯示原來的視圖。(詳細(xì)信息請參看下面的示例程序。)

關(guān)鍵是讓生命周期構(gòu)成您的開發(fā)項(xiàng)目,而不完全依賴于生命周期。在需要時(shí),您可以修改生命周期,而不用擔(dān)心破壞您的程序。在大部分情況中,您會(huì)發(fā)現(xiàn) JSF生命周期是值得遵守的,因?yàn)樗倪壿嫹浅:?。表單必須在任何?yīng)用程序邏輯執(zhí)行之前進(jìn)行驗(yàn)證,并且在進(jìn)行驗(yàn)證之前,必須對域中的數(shù)據(jù)進(jìn)行轉(zhuǎn)換。遵守生命周期的規(guī)定,可以讓您更自由地考慮有關(guān)驗(yàn)證和轉(zhuǎn)換的問題,而不是請求處理本身的階段。有一點(diǎn)非常重要:其他 Web 框架也都具有類似的生命周期;它們只不過是沒有很好地進(jìn)行宣傳。

專注
有些使用 JSF 的開發(fā)者可能從來都不會(huì)編寫一個(gè)組件,也不會(huì)對框架進(jìn)行任何擴(kuò)展;而另外一些人則專注于這種任務(wù)的開發(fā)。盡管 JSF生命周期與大部分那其他項(xiàng)目都是相同的,但是根據(jù)在項(xiàng)目中的角色您可以采用不同的階段。如果您更專注于通用的應(yīng)用程序開發(fā),就可能會(huì)關(guān)注請求處理生命周期的中間階段:
◆應(yīng)用請求值
◆更新模型值
◆調(diào)用程序

如果您專注于 JSF 組件的開發(fā),就可能會(huì)關(guān)注于整個(gè)生命周期中的第一個(gè)階段和最后一個(gè)階段:
◆恢復(fù)視圖
◆進(jìn)行響應(yīng)

在接下來的幾節(jié)中,我們將遍歷 JSF 請求處理生命周期的每個(gè)步驟,包括事件處理和驗(yàn)證。了解了每個(gè)步驟的基本知識之后,我們將簡要介紹一個(gè)示例程序,它可以展示這些步驟如何一起使用。在開始之前,首先來看一下圖 1,這是一個(gè)有關(guān) JSF生命周期的圖。

JSF 生命周期

圖1. JSF生命周期

階段 1:恢復(fù)視圖
在 JSF生命周期的第一個(gè)階段 ——恢復(fù)視圖 —— 中,會(huì)有一個(gè)來自 FacesServlet 控制器的請求。控制器會(huì)對請求進(jìn)行考查,并提取出視圖的 ID,這是由 JSP 頁面的名字來確定的。

JSF 框架控制器使用這個(gè)視圖 ID 來為當(dāng)前的視圖查找組件。如果這個(gè)視圖尚未存在,那么 JSF 控制器就會(huì)創(chuàng)建它。如果這個(gè)視圖早已存在,那么 JSF 控制器就會(huì)使用它。這個(gè)視圖包含了所有的 GUI 組件。

生命周期的這個(gè)階段表示為三個(gè)視圖實(shí)例:新視圖、原始視圖和后視圖,每個(gè)視圖的處理方式都不相同。在 新視圖 的情況中,JSF 會(huì)構(gòu)建 Faces 頁面的視圖,并將事件處理程序和驗(yàn)證程序綁定到組件上。這個(gè)視圖被保存在一個(gè) FacesContext 對象中。

FacesContext 對象包含了 JSF 用來管理當(dāng)前會(huì)話中當(dāng)前請求的 GUI 組件狀態(tài)所需要的所有狀態(tài)信息。FacesContext 將視圖保存在自己的 viewRoot 屬性中;viewRoot 包含了當(dāng)前視圖 ID 的所有 JSF 組件。

在 原始視圖 的情況中(第一次加載的是一個(gè)頁面),JSF 會(huì)創(chuàng)建一個(gè)空視圖。這個(gè)空視圖會(huì)在用戶事件產(chǎn)生時(shí)進(jìn)行填充。JSF 可以直接從原始視圖過渡到進(jìn)行響應(yīng)的階段。

在 后視圖(postback) 的情況中(用戶返回之前訪問過的頁面),包含頁面的視圖早已經(jīng)存在了,因此只需要進(jìn)行恢復(fù)就可以了。在這種情況中,JSF 就使用現(xiàn)有視圖的狀態(tài)信息來重構(gòu)狀態(tài)。后視圖的下一個(gè)階段是應(yīng)用請求值。

階段 2:應(yīng)用請求值
應(yīng)用請求值 階段的目的是讓每個(gè)組件檢索自己當(dāng)前的狀態(tài)信息。這些組件必須首先通過 FacesContext 對象進(jìn)行檢索或創(chuàng)建(使用其值)。雖然組件值也可以從 cookie 或頭文件中進(jìn)行檢索,但是它們通常是通過請求參數(shù)進(jìn)行檢索的。

如果一個(gè)組件的即時(shí)事件處理屬性 沒有 設(shè)置為 true,那么就會(huì)對這些值進(jìn)行轉(zhuǎn)換。因此,如果 域 被綁定到一個(gè) Integer 屬性上,那么該值就會(huì)被轉(zhuǎn)換為一個(gè) Integer 類型。如果值的轉(zhuǎn)換失敗了,那么就會(huì)生成一個(gè)錯(cuò)誤消息,并在 FacesContext 中進(jìn)行排隊(duì),在產(chǎn)生響應(yīng)的階段會(huì)顯示其中的消息,同時(shí)還會(huì)顯示所有的驗(yàn)證錯(cuò)誤。

如果一個(gè)組件的即時(shí)事件處理屬性 的確 被設(shè)置為 true,那么這些值就會(huì)被轉(zhuǎn)換為適當(dāng)?shù)念愋?,并進(jìn)行有效性驗(yàn)證。然后轉(zhuǎn)換后的值會(huì)被保存到組件中。如果值轉(zhuǎn)換或值的有效性驗(yàn)證失敗了,就會(huì)生成一個(gè)錯(cuò)誤消息,并在 FacesContext 中進(jìn)行排隊(duì),在產(chǎn)生響應(yīng)的階段會(huì)顯示其中的消息,同時(shí)還會(huì)顯示所有的驗(yàn)證錯(cuò)誤。

處理驗(yàn)證
生命周期中的第一個(gè)事件處理發(fā)生在應(yīng)用請求值階段之后。在這個(gè)階段中,每個(gè)組件都有一些值需要根據(jù)應(yīng)用程序的驗(yàn)證規(guī)則進(jìn)行有效性驗(yàn)證。這些驗(yàn)證規(guī)則可以是預(yù)先進(jìn)行定義的(JSF 中提供的),也可以由開發(fā)者進(jìn)行定義。用戶所輸入的值會(huì)與這些驗(yàn)證規(guī)則進(jìn)行比較。如果說輸入的值無效,就會(huì)向 FacesContext 中添加一個(gè)錯(cuò)誤消息,并且該組件會(huì)被表示為無效的。如果一個(gè)組件被表示為無效的,那么 JSF 就會(huì)轉(zhuǎn)到產(chǎn)生響應(yīng)的階段,在這個(gè)階段中會(huì)顯示當(dāng)前的視圖,以及驗(yàn)證錯(cuò)誤消息。如果沒有有效性驗(yàn)證錯(cuò)誤,那么 JSF 就會(huì)轉(zhuǎn)到更新模型值的階段。

階段 3:更新模型值
JSF 應(yīng)用程序生命周期中的第三個(gè)階段 ——更新模型值 —— 負(fù)責(zé)更新服務(wù)器端模型的實(shí)際值,通常來講,這都是通過更新后臺 bean(稱為管理 bean)的屬性實(shí)現(xiàn)的。只有那些與組件值綁定在一起的 bean 屬性才會(huì)被更新。注意這個(gè)階段發(fā)生在有效性驗(yàn)證之后,因此可以確??截惖?bean 屬性的值都是有效的(至少在表單域一級都是有效的;在業(yè)務(wù)規(guī)則一級仍可能無效)。

階段 4:調(diào)用程序
在生命周期的第四個(gè)階段 ——調(diào)用程序 —— 中,JSF 控制程序會(huì)調(diào)用程序來處理 表單 的提交操作。組件值已經(jīng)經(jīng)過了類型轉(zhuǎn)換和有效性驗(yàn)證,并被應(yīng)用到模型對象中了,因此您現(xiàn)在可以使用它們來執(zhí)行應(yīng)用程序的業(yè)務(wù)邏輯了。

在這個(gè)階段,您還可以為一個(gè)給定的序列或很多可能的序列指定后面的邏輯視圖,這可以通過為一次成功的表單提交定義一個(gè)特定的結(jié)果并返回這個(gè)結(jié)果來實(shí)現(xiàn)。例如:在成功輸出時(shí),將用戶重定向到下一頁中。要讓這種導(dǎo)航工作能夠起作用,您需要在 faces-config.xml 文件中創(chuàng)建一個(gè)到 成功輸出 的映射作為一條導(dǎo)航規(guī)則。一旦導(dǎo)航發(fā)生之后,您就轉(zhuǎn)換到生命周期的最后一個(gè)階段了。

階段 5:進(jìn)行響應(yīng)
在生命周期的第五個(gè)階段 ——進(jìn)行響應(yīng) —— 中,您可以在視圖中顯示當(dāng)前狀態(tài)中的所有組件。

【編輯推薦】

  1. JSF標(biāo)記與JSTL標(biāo)記混合使用
  2. 升級JSF1.2的艱難之旅
  3. OSGi與JSF結(jié)合開發(fā)
  4. 使JSF支持帶有HTMLMessage
  5. JSF如何使用ExternalContext
責(zé)任編輯:佚名 來源: CSDN
相關(guān)推薦

2015-07-09 15:42:48

ios應(yīng)用生命周期

2013-07-31 14:50:32

Windows PhoWP應(yīng)用程序生命周期

2014-07-11 11:09:10

App應(yīng)用程序生命周期

2011-07-20 15:58:58

iPhone 應(yīng)用程序 生命周期

2009-06-11 11:28:35

JSF生命周期

2011-08-10 16:50:10

iPhone生命周期

2009-06-24 10:47:55

JSF生命周期

2013-09-26 11:20:34

Informatica

2012-05-28 15:37:20

WP程序生命周期

2014-02-24 10:50:32

DevOps云應(yīng)用

2014-09-28 11:28:02

Android應(yīng)用程序生命周期

2025-04-28 01:22:00

2023-12-21 08:00:00

ChatGPT人工智能大型語言模型

2010-08-01 15:29:04

AndroidDalvik

2012-08-16 09:38:38

ASP.NET

2010-04-02 09:02:02

ASP.NET MVC

2012-06-20 10:29:16

敏捷開發(fā)

2009-06-23 18:11:02

JSF的生命周期Ajax處理

2014-07-16 13:39:30

Windows Pho

2015-07-08 16:28:23

weak生命周期
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號