天天看點

一個請求中,ADF、JSF究竟做了哪些工作

       在ADF開發中,一個請求發生後,經過ADF處理後,我們可以很快得到響應頁面,但在請求過程中ADF架構在背後究竟做了什麼東西呢?今天讓我們一起來了解下,ADF、JSF是基于元件模型的,不同于請求響應,它的每個元件具有生命周期的概念,在不同的階段處理、完成不同的任務,了解了這個東西對于日常開發是很有幫助的,我們會清楚地知道代碼會在哪個階段執行,還有當發生異常時,我們可以根據異常快速定位到大概是哪些處理階段發生問題,進而有針對性地排查處理,不扯那麼多了,進入正題。

       首先給出JSF和Oracle ADF頁面請求處理的生命周期的序列圖:

一個請求中,ADF、JSF究竟做了哪些工作

以下對序列圖進行說明:

1、一個http://yourserver/yourapp/faces/some.jsp到達;

2、ADF的過濾器ADFBindingFilter會找到目前session的綁定容器(BindingContext),如果是使用者第一次通路則會進行建立:

在BindingContext初始化中,ADF會擷取web.xml檔案<context-param>的 CpxFileName值,加上.cpx字尾作為綁定上下文資料檔案,預設參數是:DataBindings;

讀取DataBindings.cpx檔案以發現資料控制定義,用于在運作時執行個體化綁定容器的頁面定義檔案名以及将JSP頁面與其頁面定義檔案相關聯的頁面映射;

構造每個資料控件的一個執行個體,并引用每個BindingContainer(頁面級别),每個綁定容器的内容在第一次被頁面使用時被懶惰地加載。

BindingContext:In Brief, Data Bindings file contains the page Map, Page Definition references , References to Data Controls.

3、接着ADFBindingFilter在參與請求的每個資料控件上調用beginRequest()方法(不同的階段會有不同的調用方法,生命周期決定的),這樣就可以在每個請求開始時通知每個資料控件,進而可以執行必要的設定。

4、從AM池中擷取AM執行個體;

5、在JSF的各個标準處理階段(Lifecycle類,由FacesServlet負責建立),除了完成自己的工作外,順便通知ADF(ADFPhaseListener類),以便ADF在不同的階段增加自己的處理内容,畢竟ADF是繼承自JSF,肯定需要有自己特色的一些東西的,具體如圖所示:

一個請求中,ADF、JSF究竟做了哪些工作

6、ADFPhaseListener建立一個ADF PageLifecycle對象來處理每個請求,并将不同階段的處理委托給ADF PageLifecycle類中的相應方法,此過程會建立BindingContainer對象;

7、JSF轉發到響應的頁面;

8、頁面上的UI元件通路頁面的綁定容器中的值綁定和疊代器綁定,并在浏覽器中輸出;

9、ADFBindingFilter在參與請求的每個資料控件上調用endRequest()方法(各司其職),這樣可以在每個請求結束時通知每個資料控件,進而可以執行必要的資源清理工作;

10、将應用程式子產品的執行個體釋放回應用程式子產品池

11、使用者在浏覽器看到響應頁面。

更多文章請見我的個人部落格:http://www.acanblog.com