20150506 Created By BaoXinjian
1. 頁面基礎
在瀏覽器層,OAF頁面和其它頁面一樣,是標準的HTML頁面。
在中間層,OAF頁面實際是由記憶體中的JAVABEAN結構來實現的,和傳統的JAVA客戶端介面相同。
每個頁面中的使用者介面(UI)元件(按鈕、標籤、圖片等)實際都對應一個或多個結構中的JAVABEAN。
當瀏覽器請求一個新頁面時,OAF讀取頁面中的宣告的後設資料來建立WEB BEAN的結構。
對每一個帶有UI控制器的BEAN,OAF呼叫你寫的程式碼來初始化頁面。
當頁面執行完畢,OAF將WEBBEAN結構交給UIX框架來處理,它能將之轉為HTML傳送到瀏覽器。
當瀏覽器提交一個FORM(如:使用者選擇了搜尋區的GO按鈕),如有必要,OAF重新建立WEBBEAN結構(BEAN結構在請求之間是快取了的,只有在意外的情況下需要重新建立),然後呼叫你在PAGEBEAN中寫的處理事件的程式碼。當頁面處理結束,HTML頁面重新建立併傳送到瀏覽器。
二、模型
1. 模型封裝了指定的應用中的資料和商業邏輯。它也提供了真實的商業物件和商務服務的抽象。
注意:要完全正確和一致,本圖需包括以下的實現
oracle.apps.fnd.framework.server.OADBTransactionImpl而不是oracle.apps.fnd.framework.OADBTransaction介面。
2. Application Modules
一個BC4J應用模型是管理和提供BC4J模型物件的基礎容器,在這個上下文中,同一任務的物件是由多方關聯的。例如:所有的BC4J物件都包含一個相同任務的事務。甚至使用者介面包括多個頁面。
所有的APPLICATION MODULE都是oracle.apps.fnd.framework.server.OAApplicationModuleImpl的子類。
每一個OAF頁面都有一個關聯到頂層REGION(pageLayout region)的ROOT application module。這個root application module提供了事務處理的上下文,封閉了資料庫的連線。
(1). 如果多個頁面在一個事務中,它們應該共享一個root application module。
(2). 如果一個頁面和其它頁面沒關係,它應該有自己的application module。
注意:一個root application module可能巢狀多個application module(也可以再巢狀多層)。
在這種情況下,root application module可以訪問它所巢狀的所有的資料、物件和所有的ROOT包含的參與同一個事務的子物件。你可以在你想建立重用的與資料庫互動的UI region時使用這個特點。
3. Entity Objects(和Association Objects)實體和關聯實體
BC4J實體封裝了關聯到資料錶行的商務規則(驗證、動作等)。如:OAFSample Library包括了FWK_TBX_SUPPLIERS表,用來儲存供應商的定義。
我們可以為這個表定義一個實體物件(SupplierEO),用來實現的所有的商業規則,新建、更新、刪除一個供應商。
注意:Entity Object也可以基於檢視、同義詞和快照。
OAF支援JAVA和PLSQL實體。
你建立的大多數實體都應該是oracle.apps.fnd.framework.server.OAEntityImpl的子類。
在資料庫和實體之間是一對一的關係,所有的ORACLE Applicaiotn 實體都應該包括它們關聯的表的所有列。
實體使用宣告來在它們的屬性和指定的資料列之間對映,來自動實現查詢、插入、更新和刪除。大多數情況下,你需要新增驗證邏輯。
實體可以被任何需要與表互動的程式使用(不僅是OAF),這樣一來,就必須考慮到所有的驗證規則以便客戶端就不用再關注這些了。
4. Association Objects(關聯實體)
如果你有一個複雜的實體(如三層採購定單,在頭、行、發運地之前是一對多的關係),你可以使用association object來定義實體間的關係,
你可以定義弱連線(一個定單引用了已經存在的供應商)和強連線(一個定單包括它的行,行不能獨立於頭存在)。
5. View Objects(and view Links)檢視物件和檢視連線
在簡單的情況下,一個BC4J檢視物件封裝了一個資料庫查詢。查詢執行後,一個檢視物件迴圈訪問結果集。結果集包含一個或多個檢視行,一個檢視行的不同屬性對應資料庫查詢的行。
所有的檢視物件都是oracle.apps.fnd.framework.server.OAViewObjectImpl的子類。
每個檢視物件都可以配置用以下的方法來查詢資料:
(1). 屬性對應SQL語句的列(通常用於較小、只讀的檢視物件)
(2). 屬性對應實體物件的屬性(用於插入、更新、刪除實體物件)
(3). 一些屬性對應到實體,一些屬性直接對應SQL(用來增強實體物件的不能從實體物件查詢的臨時資料,如顯示的計算值)。
在OAF中,在下面的情況下會用到檢視物件。
(1). 為詳細的使用者介面展示最優化的資料。如果使用者介面支援實體物件的插入、更新、刪除,你應該使用檢視物件來完成這些任務。
(2). 為建立下拉選單建立查詢,值列表和其它的介面元件。
(3). 為商業邏輯建立有效的“驗證查詢”。如:在採購定單頭實體物件中,你可能要使用一個驗證檢視物件來取得這個採購定單的最大行號,以便於它可以被快取而在新行插入時可以增加。
最後,你可能不只需要定義檢視物件,還可能要為它們編寫程式碼。典型情況下,程式碼應該實現複雜的查詢的資料繫結並執行查詢(所以檢視物件知道如何查詢它自己)。
6. View Link(檢視連線)
就像連線實體物件一樣,你也可以建立檢視物件的關聯,這叫做檢視連線。如:你在採購定單頭檢視物件和行檢視物件之間建立了一個檢視連線,這可以用來在訪問頭的時候自動查詢行。
7. OADBTransaction
如上圖所示:OADBTransaction在你的模型中的一箇中心角色,它封裝了JDBC的資料庫連線會話和root application module的關聯。
並且直接容納了你建立的所有實體物件(檢視物件由root application module容納,並在檢視行中引用了實體物件)。你將在你的模型中正常使用OADBTransaction,基於以下原因:
(1). 建立callable statement來執行PLSQL函式的過程。
(2). 訪問session級別的應用上下文,如使用者名稱、id、當前職責等。
(3). 如果需要執行NLS操作,如轉換伺服器時間格式為使用者時間格式,訪問oracle.apps.fnd.framework.OANLSServices物件
root application module可以訪問OADBTransaction。
3. 檢視
檢視用來為使用者格式化和顯示模型資料。
1. 定義頁面
在設計時,你可以使用宣告的方式來建立BEAN的結構。在oracle開發過程中,你將對XML檔案進行定義。當你部署到客戶站點時,OAF從資料庫中執行頁面定義。
為了簡單說明,Jdeveoper定義的頁面由REGION和ITEM組成。
(1). ITEM是一個簡單的元件,如按鈕、輸入框、圖下等不包括子元素的元件。
(2). REGION是包括ITEM的容器。如:header、表格或特定的佈局元件。
(3). 你定義的每個REGION和ITEM都有一個STYLE屬性,用來指明OAF在執行時使用哪個WEB EBAN物件來為它例項化(這會指明產生什麼要瓣HTML程式碼),
如:如果你定義了一個STYLE為table的REGION,OAF會用oracle.apps.fnd.framework.webui.beans.table.OATablebean來例項化。
(4). 所有的頁面必須包含一個頂層的REGION(叫做root region),它的STYLE是pageLayout,它是oracle.apps.fnd.framework.webui.beans.layout.OAPageLayoutBean的例項。
(5). 在Jdeveoper的頁面樹中的REGION和ITEM的順序指明瞭在執行時新增BEAN結構的位置。
下圖顯示了一個簡單頁面的WEB BEAN顯示效果,你看到的頁面的標籤指明瞭WEB BEAN的名字。
如:一個下拉選單是oracle.apps.fnd.framework.webui.beans.message.OAMessageChoiceBean的例項,一個提交按鈕是oracle.apps.fnd.framework.webui.beans.form.OASubmitButtonbean的例項。
注意:下面圖中的ITEM名稱沒有按照ORACLE應用命名標準來做,只是讓你明白WEB BEAN的結構。
2. Attribute Sets 屬性集
每個REGION和ITEM都可以使用屬性集來繼承一組屬性,一個屬性集是經過命名可重用的屬性的集合,它可以被任何UI物件使用,包括region\item和其它屬性集。
無論何時你建立一個使用屬性集的UI元件,你都可以覆蓋它的繼承的屬性(儘管這在OAF中是不推薦的)。
為了說明這一點,在應用開發中,每個表格必須為他的每一列關聯到屬性集,這些屬性集如提示標籤、顯示寬度等。
(1). 在OAF的ToolBox示例中,有一個採購定單表(FWK_TBX_PO_HEADERS),HEADER_ID是NUMBER型別的主鍵,也作為採購定單號顯示。
(2). 這個表格有一個關聯的屬性集:FwkTbxHeaders,是一個XML包檔案,裡面包括了所有的表列的屬性(每一列一個屬性)。其中一個屬性叫做HeaderId。
(3). HeaderId屬性設定Prompt為 Order Number,Display Length為15。
(4). 當我們建立一個頁面包括採購定單的order number 這個ITEM時,我們也應該指定屬性集為/oracle/apps/fnd/framework/toolbox/attributessets/FwkTbxheaders/Headerid
3. 元件重用
如果想組合頁面中的共享物件,你可以簡單的繼承它們
如:在OAF的ToolBox示例中,我們建立了一個通用的REGION(叫PoSummaryRN),所以這個元件可以被多個頁面包含而不用重寫程式碼。
要新增一個region到頁面,我們只要簡單的建立一個新的region,將Extends屬性設為:/oracle/apps/fnd/framework/toolbox/tutorial/webui/PoSummaryRN
注意:這個共享的REGION在引用它的頁面中是不能修改的,所以在Jdeveloper的Structure皮膚中的灰色的。
4. 資料來源繫結
對於有資料庫互動(插入、更新、刪除、查詢)的BEAN,你還要指定一個資料來源繫結到一個檢視例項和關聯的檢視屬性名稱。這個繫結非常重要,因為OAF用它來查詢資料、寫回使用者輸入的資料。
(1). View Instance Name指的是在application module中的檢視物件(所有的檢視物件都存活於application module中並通過它們的名稱來呼叫),
如:如果一個SuppliersVO檢視物件由頁面中的root application module通過“MySupVO”來呼叫,則在這裡你應該指定MySupVO這個名字。
(2). View Attribute Name 指的是對映到列的檢視屬性。
如:如果你的SuppliersVO有一個屬性“SupplierId”(對映到列SUPPLIER_ID),這裡你應該指定“SupplierId”這個名稱。
5. 定義選單
你應該使用oracle application選單和功能的表單中定義選單。
正像OAF將定義的UI佈局翻譯成執行時的BEAN結構,它也包含了選單定義的WEB BEAN。
6. 定義頁面流
處理多頁面事務流時,OAF提供了一個可定義的(可客戶化)給複雜的、硬編碼的控制邏輯。
7. 客戶化頁面
OAF也包括了一個可定義的客戶化架構,叫做:OA Personalization Framework。這是為了支援終端使用者所需的客戶化和產品傳輸鏈(區域化和垂直化(沒懂什麼意思)等)。
注意:如你在開發指南中的見的,建立REGION和item宣告比程式設計更可取。實際上,你應該只在不能用宣告的方式來建立的時候才採用程式設計的方式,這樣客戶就能客戶化你的頁面了。
4、控制器
1. 控制器是用來響應使用者的動作和定向應用的流向的。
控制器可以關聯到檢視的REGION級別,(很多情況下,任何的OAF web bean實現了oracle.apps.fnd.framework.webui.beans.OAWebBeanContainer介面,可以關聯到控制器)。
你建立的所有的控制器都應該為oracle.apps.fnd.framework.webui.OAControllerImpl的子類。
你可以在控制器中實現WEB BEAN的功能。
你可以編寫程式碼用來:
(1). 在執行時操作和初始化(包括可程式設計的你不能以宣告的方式建立的佈局)
(2). 擷取和處理使用者事件如按下按鈕
2. 處理請求
當瀏覽器為你的頁面釋出一個OA.jsp請求時:
(1). oracle.apps.fnd.framework.webui.OAPageBean(主要的OAF頁面處理類)使用頁面名稱來決定需要哪個root application module,然後從application module池中取出。
這個application module 也從連線池中取出JDBC連線,然後這個頁面的事務處理的上下文就確定了。
(2). 使用者的SESSION被驗證,如果無效,顯示登入的頁面。
(3). 如果使用者是有效的,OAPageBean評估請求引數來確定當做HTTP POST或GET來處理。
3. 處理GET請求
當瀏覽器向伺服器傳送一個GET頁面的請求時(或者你手工的FORWARD),OAF使用可宣告的UI定義來建立web bean結構
(1). OAPageBean呼叫頁面的頂層pageLayout的bean的processRequest()方法,整個WEB BEAN結構被遞迴的執行來初始化WEB BEAN(包括任何關聯的模型元件):
a. 每個web bean例項化它的控制器(如果有的話)並且呼叫控制器上的processRequest(OAPageContext,OAWebBean),
這是一個你用來建立、修改你的頁面佈局,設定web bean屬性和執行手工的資料初始化的方法(如當你開啟頁面時你可能要執行一個自動查詢)。
b. 一些複雜的web bean(如:oracle.apps.fnd.framework.webui.beans.table.OATableBean和oracle.apps.fnd.framework.webui.beans.layout.OAPageLayoutBean)執行post控制器執行prepareForRendering()方法。
c. 每個web bean都呼叫它的子類的processRequest()方法。
(2). oracle.apps.fnd.framework.webui.OAPageBean將web bean結構交給uix併傳送到瀏覽器。
4. 處理POST請求
當瀏覽器傳送一個POST請求到伺服器
(1). OAPageBean檢檢視web bean是否存在於記憶體中,如果沒有(可能因為資源被重新構造了,使用者按了後退按鈕,
或者POST是由一個對話方塊發出的),那就重新建立web bean的結構,像上面執行GET時一樣。
(2). OAPageBean在所有結構樹中的bean上呼叫processFormDate(OAPageContext,OAWebBean),將form中的資料寫入module(它呼叫pageLayout region上的processFormData,
所以每個web bean教遞迴的呼叫了它的子類的processFormData)。寫入form資料到model自動的呼叫了屬性級和實體級的驗證。如果你丟擲任何驗證異常,執行會停止並顯示錯誤資訊。
(3). 如果在執行processFormData()過程中沒有異常,OAPageBean呼叫所有的bean上的processFormRequest(OAPageContext,OAWebBean)方法,如上面所講。
這個過程讓你的控制器對使用者的動作作出響應。
(4). 如果沒有JSP FORWARD或者重定向,或者在processFormRequest()方法中沒有異常,則頁面被重新整理。
5. OAPageContext
當OAF接收到一個OA.jsp請求,OAPageBean建立一個oracle.apps.fnd.framework.webui.OAPageContext,這個類只在頁面處理過程中才存在。
上面所說的三個關鍵方法(processRequest(),processFormData()和processFormRequest())都有一個OAPageContext引數,你編寫的任何控制器總是要使用這個關鍵的類。
如上圖所示,OAPageContext同時引用了request和root applications mudule。
實際上OAPageContext被交給你的每個控制器的執行方法,在下面的任務中你將使用OAPageContext:
6. 訪問請求引數
可能最重要是,這是一個你用來通過getParameter(String)方法來讀取請資料的類(請求包括URL中的引數,如果是POST,任何的名稱值和事件都關聯到使用者的動作)。
提示:對於頁面中的不同的WEB BEAN(按鈕、輸入框等),傳到getParameter()的名稱值都通過你在頁面中定義的ID來分配。
如:如果使用者按了一個叫“GoButton”的按鈕,你可以在Jdeveloper在寫以下的控制器程式碼:
processFormRequest(OAPageContext pageContext, OAWebBean webBean) {
if (pageContext.getParameter("GoButton") != null)
{ // The user pressed the "Go" button, do something... }
}
7. 訪問root application module
OAPageContext快取了一個對root application module的引用,它提供了訪問它的檢視物件和事務。
如果需要訪問application mudule:
processFormRequest(OAPageContext pageContext, OAWebBean webBean) {
OAApplicationModule am = (OAApplicationModule)pageContext.getRootApplicationModule();
}
8. 導航介紹
你使用這個類的方法來告訴OAF執行一個JSP forward。如:
processFormRequest(OAPageContext pageContext, OAWebBean webBean){ if (pageContext.getParameter("CreateButton") != null) { // The user pressed the "Create Supplier" button, now perform a JSP forward to // the "Create Supplier" page. pageContext.setForwardURL("OA.jsp?page=/oracle/apps/dem/employee/webui/EmpDetailsPG",
null,
OAWebBeanConstants.KEEP_MENU_CONTEXT,
null, null,
true, // Retain AMOAWebBeanConstants.ADD_BREAD_CRUMB_YES, // Show breadcrumbsOAWebBeanConstants.IGNORE_MESSAGES); } }
9. 訪問應用上下文資訊
如同模型中的OADBTransaction,OAPageContext提供了訪問servlet session級別的oracle應用上下文資訊,如使用者名稱、id、當前職責等。如下面程式碼顯示如何取得使用者名稱;
processRequest(OAPageContext pageContext, OAWebBean webBean){
String userName = pageContext.getUserName(); }
5、 Web bean 架構
1. 所有的WEB BEAN繼承了UIX架構中的相應的bean。
如一個OATableBean繼承了oracle.cabo.ui.beans.table.TableBean。
每個OAF web bean也實現了一組介面,這些介面定義了OAF加到UIX bean中的行為。
(1). Oracle.apps.fnd.framework.webui.beans.OAWebBean
定義了所有的WEB BEAN的通用的核心的行為。
如:不同於其它行為,它定義了processRequest,processFormData和processFormRequest方法,這些方法都在不同的bean中有實現。
(2). Oracle.apps.fnd.framework.webui.OAWebBeanConstants:
在檢視和控制器中使用的一組常量。
(3). Oracle.apps.fnd.framework..webui.beans.OAWebBeanData:
定義了通用的客戶化定義和資料來源管理行為。
(4). Oracle.apps.fnd.framework.webui.beans.OAWebBeanContainer:
定義了所有的web bean的做為容器的特點。如:所有的佈局web bean都實現這個介面。只有實現了這個介面的bean才可以關聯到控制器。
(5). OAWebBean<Type>:
定義了在OAF上下文中的bean中固有的行為。
如:OATableBean實現了oracle.apps.fnd.framework.webui.beans.OAWebBeanTable介面。
2. 內部bean結構
每個web bean都維護它自己以下的資訊:
_indexedChildren 子web bean
_namedChildren UIX指定的子web bean
_attributes web bean的特性(描述性屬性),如下圖所示
3. 資料繫結值
作為不是上圖所示的情況,OAF web bean屬性實際作為資料繫結值來實現。
意思是值由特定的在執行時處理元件的資料來源提供。
4. 實現
當頁面實現時,UIX架構處理web bean結構來生成html。
對任何web bean屬性,當將它交給一個實現上下文(實現上下文是UIX需要處理繫結資料的所有的資訊)時,UIX調它的getAttributeValue()方法。
對於一個給定的屬性,如:實現上下文知道哪個檢視物件、檢視屬性和當前行是什麼。
資料繫結值使用實現上下文提供的這些資訊來詢問資料來源,並返回實際的值,所以它能夠生成相應的HTML。
6、oracle.apps.fnd.framework
1. oracle.apps.fnd.framework
包括從model和使用者介面或檢視程式碼中可以安全訪問的類和介面。
如:如果你在頁面中要訪問一個root application module,你要使用oracle.apps.fnd.framework.OAApplicationModule介面(你永遠不會訪問一個客戶端的實現)。
其實情況下,這個包也包括:
(1). 你可能要丟擲的所有的異常
(2).你用來國際化操作的類:OANLSServices
2. oracle.apps.fnd.framwwork.server
包括了在mvc架構中實現model的類的介面
這些類是用來被客戶端使用者介面(不只是OAF的html頁面)使用的,它不應該直接引用oracle.apps.fnd.framework.webui包和子包中的類和介面,或者任何應用指定的WEBUI包和子包。
當建立一個OAF應用模型時,你應該使用這個包中的類而不是它們的繼承的類。
警告:不要在控制器和檢視物件中呼叫這個包中的類。
3. oracle.apps.fnd.framework.webui
包括了建立和操作OAF html使用者介面的核心類。
一些常用的類和介面包括:
(1). OAController
(2). OAPageContext
(3). 以下子包中的在bean中的所有類
警告:不要在model程式碼中呼叫這個包中的類。
4. oracle.apps.fnd.framework.webui.beans
包括了不能適合多樣變化bean子包的使用者介面元件類(如:影像、靜態的文字、鍵彈性域、說明性彈性域)。
你應該在編寫使用者介面的需要程式設計的控制器的時候使用這些類。
這個包也包括了核心的被所有的WEB BEAN實現的OAF介面。
這個包中的類和它子包中的類對應到它們實現的uix元件,如下表。當建立OAF應用頁面時,你應該總是使用OAF類除非你想使用一個包括在UIX中而OAF不支援的新特性。
注意:OAF類總是為你在Jdeveloper中宣告的MDS例項化。
警告:不要在model程式碼中呼叫這個包中的類。
5. oracle.apps.fnd.framework.webui.beans.form
包括了html form的元件的web bean類,包括提交按鈕和輸入元件(多選框、單選框、文字框等)。
你應該在編寫一個使用者介面控制器的時候使用這些類。
注意:對於很多這個包中的web bean,有一些變數在oracle.apps.fnd.framework,webui.message包中(這些message web bean可以顯示錯誤、資訊、警告的圖示和說明資訊,而這個包中web bean不能)。
當你在Jdeveloper中建立頁面時,OAF自動的為這兩個包中的元件例項化message bean。你應該只在下面的情況中使用這個包中的類:
(1). 一個類沒有message bean(如:OASubmitButtonBean只在這個包中存在)
(2). 你不需要使用message bean
警告:不要在model程式碼中呼叫這個包中的類。
6. oracle.apps.fnd.framework.webui.include
包括OAF中使用者介面的擴充套件web bean(servlet\jsp\html)。
你應該在編寫使用者介面控制器時使用這些類。
警告:不要在model程式碼中呼叫這個包中的類。
7. oracle.apps.fnd.framework.webui.beans.layout
包括OAF頁面的佈局web bean。包括特定的佈局如hide/show,容器,列表,頭,標準的單列或雙列模板等。你應該在編寫使用者介面控制器時使用這些類。
警告:不要在model程式碼中呼叫這個包中的類。
8. oracle.apps.fnd.framework.webui.beans.message
包括可以顯示錯誤、警告或資訊的HTML FORM控制元件。如使用者在一個文字框中輸入了錯誤的值,一個錯誤圖示會顯示在它的標題下面。你應該在編寫使用者介面控制器時使用這些類。
注意:這個包中的很多類了包括在oracle.apps.fnd.framework.webui.beans.form包中,但沒有顯示圖示和資訊的功能。
警告:不要在model程式碼中呼叫這個包中的類。
9. oracle.apps.fnd.framework.webui.beans.nav
包括了使用者介面導航的元件(連線、樹、選單、快速連線等。)你應該在編寫使用者介面控制器時使用這些類。
警告:不要在model程式碼中呼叫這個包中的類。
10. oracle.apps.fnd.framework.webui.beans.table
包括了表格和樹表格的web bean。它可以以表格的形式顯示資料。你應該在編寫使用者介面控制器時使用這些類。
警告:不要在model程式碼中呼叫這個包中的類。
11. oracle.apps.fnd.framework.webui.laf
包括了可以控制HTML外觀(包括頁面風格)和上下文行為的工具。
Thanks and Regards
轉載: c1275671283 - http://shaofeng.blog.51cto.com/3392077/655665