study of javaserver faces lifecycle

JavaServer Faces應用程序的生命周期在客戶端為頁面發出HTTP請求時開始,并在服務器響應該頁面并轉換為HTML時結束。

  通常將JSF的生命周期分為兩個階段:

    #執行階段

    #渲染階段

1.執行階段

    JavaServer Faces應用程序生命周期執行階段包含以下子階段: 

    恢復視圖:在內存中恢復或創建代表客戶端用戶界面信息的服務器端組件樹(視圖)。

    應用請求值:用來自客戶端的最新數據更新這些服務器端組件。

    處理驗證:對新數據執行驗證和數據類型轉換。

    更新模型值:用新數據更新服務器端模型對象。

    調用應用程序:調用滿足請求所需要的應用程序邏輯,然后如果有需要,再導航到新頁面。

    渲染響應:把響應渲染給請求客戶端。

  JSF 請求—響應生命周期的步驟:

    

1.1恢復視圖階段

  當客戶端請求一個JavaServer Faces頁面時,JavaServer Faces實現開始恢復視圖階段。 在此階段,JSF將視圖中的組件構建為請求頁面,線性事件處理程序和驗證器的視圖,并將視圖保存在FacesContext實例中。

如果對該頁面的請求是回發,那么與該頁面相對應的視圖已經存在于FacesContext實例中。 在此階段,JavaServer Faces實現通過使用保存在客戶端或服務器上的狀態信息來還原視圖。

1.2應用請求值階段

  在此階段,在回發請求期間恢復組件樹。 組件樹是表單元素的集合。樹中的每個組件通過使用其decode(processDecodes())方法從請求參數中提取其新值。 之后,該值將本地存儲在每個組件上。

  如果任何解碼方法或事件偵聽器在當前FacesContext實例上調用了renderResponse方法,則JavaServer Faces實現將跳過“渲染響應”階段。?
  如果任何事件在此階段已排隊,則JavaServer Faces實現將事件廣播到有興趣的監聽器。?
  如果應用程序需要重定向到其他Web應用程序資源或生成不包含任何JavaServer Faces組件的響應,則可以調用FacesContext.responseComplete()方法。?
  如果當前請求被識別為部分請求,則從FacesContext檢索部分上下文,并應用部分處理方法。

1.3流程驗證階段

  在此階段,JavaServer Faces通過使用其validate()方法來處理在組件上注冊的所有驗證器。 它檢查指定驗證規則的組件屬性,并將這些規則與為組件存儲的本地值進行比較。 JavaServer Faces還完成了沒有將immediate屬性設置為true的輸入組件的轉換。

  如果任何驗證方法或事件偵聽器在當前FacesContext上調用了renderResponse方法,則JavaServer Faces實現將跳過“渲染響應”階段。?
  如果應用程序需要重定向到不同的Web應用程序資源或生成不包含任何JavaServer Faces組件的響應,則可以調用FacesContext.responseComplete方法。?
  如果事件在此階段已排隊,則JavaServer Faces實現將它們廣播給有興趣的監聽器。?
  如果當前請求被識別為部分請求,則從FacesContext檢索部分上下文,并應用部分處理方法。

1.4更新模型值階段

  確保數據有效后,它遍歷組件樹,并將相應的服務器端對象屬性設置為組件的本地值。 JavaServer Faces實現只更新輸入組件的value屬性指向bean屬性。 如果本地數據無法轉換為bean屬性指定的類型,生命周期將直接前進到“渲染響應”階段,以便重新呈現頁面并顯示錯誤。

  如果任何updateModels方法或任何監聽器在當前FacesContext實例上調用了renderResponse()方法,則JavaServer Faces實現將跳過“渲染響應”階段。?
  如果應用程序需要重定向到其他Web應用程序資源或生成不包含任何JavaServer Faces組件的響應,則可以調用FacesContext.responseComplete()方法。?
  如果任何事件在此階段已排隊,JavaServer Faces實現將它們廣播到有興趣的監聽器。?
  如果當前請求被識別為部分請求,則從FacesContext檢索部分上下文,并應用部分處理方法。

1.5調用應用階段

  在此階段,JSF處理應用程序級事件,例如提交表單或鏈接到另一個頁面。?
現在,如果應用程序需要重定向到其他Web應用程序資源或生成不包含任何JSF組件的響應,則可以調用FacesContext.responseComplete()方法。

之后,JavaServer Faces實現將控制轉移到“渲染響應”階段。

1.6渲染響應階段

  這是JSF生命周期的最后階段。 在此階段,JSF將構建視圖并將權限委托給相應的資源來呈現頁面。

  如果這是初始請求,則頁面上表示的組件將被添加到組件樹中。?
  如果這不是初始請求,組件已經添加到樹中,不需要再添加。?
  如果請求是回應,并且在應用請求值階段,過程驗證階段或更新模型值階段期間遇到錯誤,則在此階段將再次呈現原始頁面。?
  如果頁面包含h:message或h:messages標簽,頁面上會顯示任何排隊的錯誤消息。?
  在渲染視圖的內容之后,保存響應的狀態,以便后續請求可以訪問它。 恢復視圖階段可以使用保存的狀態。

2.渲染階段

在此階段,請求的視圖作為對客戶端瀏覽器的響應。 視圖渲染是以HTML或XHTML生成輸出的過程。 所以,用戶可以在瀏覽器看到它。

在渲染過程中采取以下步驟。

  當客戶端對index.xhtml網頁進行初始請求時,編譯應用程序。

  應用程序在編譯后執行,并為應用程序構建一個新的組件樹,并放置在FacesContext中。

  使用由EL表達式表示的組件和與其關聯受托管bean屬性填充組件樹。

  基于組件樹。 建立了新的視圖。

  該視圖作為響應呈現給請求客戶端。

  組件樹被自動銷毀。

  在后續請求中,重新構建組件樹,并應用已保存的狀態。

轉載于:https://www.cnblogs.com/jlp6057/p/9385077.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/451862.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/451862.shtml
英文地址,請注明出處:http://en.pswp.cn/news/451862.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從開源軟件開發中體會到的心得

Mitchell Hashimoto 是一名開源軟件工程師。由他托管到 GitHub 上的 開源項目 Vagrant,是一個用于創建和部署虛擬化開發環境的工具。近日,Mitchell撰文講述了在開發 Vagrant 的過程中學到的有關開源軟件開發的一些心得。 以下為原文文章: 把 …

學成在線--25.課程圖片管理(圖片查詢)

文章目錄一. 需求分析二. API三. 服務端開發1. Dao2. Service3. Controller四. 前端開發1. API方法2. 頁面一. 需求分析 課程圖片上傳成功,再次進入課程上傳頁面應該顯示出來已上傳的圖片。 二. API 在課程管理服務定義查詢方法 文件位置:xcEduServic…

redux源碼解讀

背景 因為就得去實習了。所以打算開始補補坑。比如自己閱讀源碼的計劃。所以今天來聊聊redux的源碼。后續會有redux-thunk和react-redux的源碼閱讀。搞定這些的話,就開始閱讀一個node的庫的源碼了,比如eventproxy和anywhere。 開始 總覽, redux的文件結構…

sql語句update中多個case/when的寫法

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 又如: update xxxx_xxxx set xxx_typeCASE WHEN xxx_type 0 THENYXLX-0WHEN xxx_type 1 THENYXLX-1WHEN xxx_type 2 THE…

Redis-ha(sentinel)搭建

服務器描述:本次搭建是用來測試,所以是在一臺服務器上搭建三個redis服務(一主兩從) 服務角色 端口 Redis.conf名稱 sentinel配置文件名稱 sentinel端口 redis日志路徑 sentinel路勁 主(master) 6379 redis.conf sentine…

學成在線--26.課程圖片管理(圖片刪除)

文章目錄一. 需求分析二. API三. 服務端開發1. Dao2. Service3. Controller四. 前端開發1. API方法2. 頁面1.before-remove鉤子方法2.handleRemove鉤子方法一. 需求分析 課程圖片上傳成功后,可以重新上傳,方法是先刪除現有圖片再上傳新圖片;…

警惕開源代碼庫中的安全隱患

最近的一項研究發現, 在調查的31個流行庫(框架)的1261個版本中,超過三分之一存在已知的安全漏洞,大約四分之一的下載文件已經被污染。 該項研究由Aspect Security和Sonatype發起。Aspect Security是一家評估軟件安全漏…

jsp注釋

jsp注釋 <%--注釋內容--%> html注釋 <!--注釋內容-->

線程間的協作(3)——管道輸入/輸出流

2019獨角獸企業重金招聘Python工程師標準>>> 1.管道輸入/輸出流類 分為兩類&#xff0c;字節流管道類&#xff08;PipedInputStream/PipedOutputStream&#xff09;和字符流管道類&#xff08;PipedReader/ PipedWriter&#xff09;。這兩個IO流實現了可以在不同的任…

windows簡易版本 Redis 使用 demo樣例(ssm框架下)

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. 在網上下載 windows 版本 的Redis 。下載了直接解壓出來 &#xff1a; 2. 雙擊 redis-server.exe 啟動服務&#xff08;如下圖&#…

Redhat7.3安裝配置Telnet詳細教程

請參考&#xff1a;https://blog.csdn.net/weixin_39934520/article/details/84835949 謝謝樓主分享&#xff01;

程序員的半衰期只有15年?

曾在Google工作負責過技術工作的科技編輯 Matt Heusser總結了他在Google的生活經歷&#xff0c;得出結論&#xff1a; 作為程序員&#xff0c;你只有15年時間。Matt 寫道當我在Google工作時&#xff0c;發現Google大部分人都是20出頭的年輕人&#xff0c;他們經歷的很多事情都是…

EasyNVR、EasyDSS二次開發之:RTMP、HLS流在web頁面進行無插件播放示例Demo代碼

不管是基于EasyNVR還是EasyDSS&#xff0c;都是支持無插件直播&#xff0c;這也是未來視頻直播的一個趨勢。對于傳統的瀏覽器插件播放誰用誰知道&#xff1b; 以上是軟件自帶播放展示 背景需求 對于EasyNVR和EasyDSS的使用方式大概分為兩大類&#xff0c;一類是直接將軟件作為視…

jsp中%@ % 與% % 與%! %

<% %> 有個符號的&#xff0c;叫做指令用來提供整個JSP 網頁相關的信息&#xff0c;并且用來設定JSP網頁的相關屬性&#xff0c; 例如&#xff1a;網頁的編碼方式、語法、信息等。<% %>這個叫做小腳本&#xff0c;是寫java代碼的<%! %>這個是jsp中腳本聲明&a…

Hadoop的學習路線圖

目錄&#xff1a;.1.Hadoop家族產品2.Hadoop家族學習路線圖 Hadoop家族產品截止到2013年&#xff0c;根據cloudera的統計&#xff0c;Hadoop家族產品已經達到20個&#xff01;接下來&#xff0c;我把這20個產品&#xff0c;分成了2類。?第一類&#xff0c;是我已經掌握的?第二…

new TypeToken<List>>(){}.getType() 是什么意思

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. 項目中代碼&#xff1a; List<AppVersion> redisList new Gson().fromJson(json, new TypeToken<List<AppVersion>…

11--移除重復節點

編寫代碼&#xff0c;移除未排序鏈表中的重復節點。保留最開始出現的節點。 示例1: 輸入&#xff1a;[1, 2, 3, 3, 2, 1] 輸出&#xff1a;[1, 2, 3] 示例2: 輸入&#xff1a;[1, 1, 1, 1, 2] 輸出&#xff1a;[1, 2]

信息圖:程序員/開發人員實際在用哪些工具

BestVendor.com的工作人員在全球范圍內采訪了500名重要開發人員&#xff0c;在調查詢問他們實際使用的工具后&#xff0c;制作了一張信息圖&#xff0c;如下。 這張信息圖覆蓋10個方面的工具&#xff1a;Bug 追蹤、數據庫、開發框架、集成開發環境&#xff08;IDE&#xff09;、…

class特性

每個HTML元素都可以附帶一個class特性。有時候&#xff0c;你希望有一種方法可以指定多個元素并將這些元素和頁面上的其他元素區分出來&#xff0c;而不是單獨指定文檔中的某個元素。 <!DOCTYPE html> <!-- To change this license header, choose License Headers in…