在Oracle ADF開發(fā)中,一個請求發(fā)生后,經(jīng)過ADF處理后,我們可以很快得到響應頁面,但在請求過程中ADF框架在背后究竟做了什么東西呢?今天讓我們一起來了解下,ADF、JSF是基于組件模型的,不同于請求響應,它的每個組件具有生命周期的概念,在不同的階段處理、完成不同的任務,理解了這個東西對于日常開發(fā)是很有幫助的,我們會清楚地知道代碼會在哪個階段執(zhí)行,還有當發(fā)生異常時,我們可以根據(jù)異??焖俣ㄎ坏酱蟾攀悄男┨幚黼A段發(fā)生問題,從而有針對性地排查處理,不扯那么多了,進入正題。
首先給出JSF和Oracle ADF頁面請求處理的生命周期的序列圖:
以下對序列圖進行說明:
1、 一個http://yourserver/yourapp/faces/some.jsp到達;
2、 ADF的過濾器ADFBindingFilter會找到當前session的綁定容器(BindingContext),如果是用戶第一次訪問則會進行創(chuàng)建:
在BindingContext初始化中,ADF會獲取web.xml文件<context-param>的 CpxFileName值,加上.cpx后綴作為綁定上下文數(shù)據(jù)文件,默認參數(shù)是:DataBindings;
讀取DataBindings.cpx文件以發(fā)現(xiàn)數(shù)據(jù)控制定義,用于在運行時實例化綁定容器的頁面定義文件名以及將JSP頁面與其頁面定義文件相關聯(lián)的頁面映射;
構造每個數(shù)據(jù)控件的一個實例,并引用每個BindingContainer(頁面級別),每個綁定容器的內容在第一次被頁面使用時被懶惰地加載。
BindingContext:In Brief, Data Bindings file contains the page Map, Page Definition references , References to Data Controls.
3、 接著ADFBindingFilter在參與請求的每個數(shù)據(jù)控件上調用beginRequest()方法(不同的階段會有不同的調用方法,生命周期決定的),這樣就可以在每個請求開始時通知每個數(shù)據(jù)控件,從而可以執(zhí)行必要的設置。
4、 從AM池中獲取AM實例;
5、 在JSF的各個標準處理階段(Lifecycle類,由FacesServlet負責創(chuàng)建),除了完成自己的工作外,順便通知ADF(ADFPhaseListener類),以便ADF在不同的階段增加自己的處理內容,畢竟ADF是繼承自JSF,肯定需要有自己特色的一些東西的,具體如圖所示: