ホームページ >ウェブフロントエンド >htmlチュートリアル >EBS OAFページのテクニカル分析(2)_html/css_WEB-ITnose
(著作権声明、私のオリジナル記事または翻訳記事を転載する必要がある場合、個人的な研究のために転載する場合は、出典を示してください。そうでない場合は、私に連絡してください。違反者は起訴されます。)
原文はOAFからのものです開発ドキュメント
OADBTransaction
図 5: 基本モデル アーキテクチャ - OADBTransaction
注: 完全に正確で互換性を保つために、この図には実装クラス oracle.apps.fnd.framework が含まれている必要があります。 oracle .apps.fnd.framework.OADBTransaction インタフェースではなく、server.OADBTransactionImpl を使用しますが、このインタフェースはコード内でのみ使用するため、後で組み込むことにしました。
上の図に示すように、OADBTransaction は、ルート アプリケーション モジュールに関連付けられた JDBC 接続/データベース セッションをカプセル化し、作成するすべてのエンティティ オブジェクト (ルート アプリケーション モジュール) を直接所有するため、モデル コード内で中心的な役割を果たします。アプリケーション モジュールが所有するビュー オブジェクトは、そのビュー行にエンティティ オブジェクトへの参照を保持します)。また、モデル コードでは通常、次の一般的な動作のために OADBTransaction を使用します:
l PL/SQL メソッドまたはプロシージャを実行するための呼び出し可能な文を作成します。
l ユーザー名、ID、現在の責任など、セッションレベルのアプリケーションコンテキスト情報にアクセスします。
l サーバーの日付/時刻をユーザーの日付/時刻に変換するなどの NLS 操作を実行する必要がある場合は、oracle.apps.fnd.framework.OANLSServices オブジェクトにアクセスできます。
OADBTransaction へのアクセスは、ルート アプリケーション モジュールによって提供されます。
Interface View
Interface View は、モデル データをフォーマットしてユーザーに表示します。
以下の内容は、第 3 章の実装インターフェース ビューで詳しく紹介されています。
ページを定義する
開発中に、宣言型 JDeveloper ツールを使用して、各ページの Bean 階層を指定できます。JDeveloper は、「Hello, World」の構築で紹介されています。 Oracle E-Buisness Suite 開発では、ページ定義に (ソース管理) XML ファイルを使用します。製品が顧客のサイトに展開されると、OAF フレームワークはデータベース ストレージからこれらのページ定義を実行します。はじめに 要約すると、JDeveloper を使用してエリアと項目で構成されるページを定義できます。
l 項目は、子コントロールを含まないボタン、フィールド、イメージなどの単純なウィジェットです。
l エリアはコンテナ オブジェクトであり、アイテムやその他のエリアを含めることができます。エリアは、ヘッダー、テーブル、特殊なレイアウト コンポーネントの例です。
l 定義する各領域と項目には style 属性があり、実行時にこの Web Bean をインスタンス化する方法を OAF フレームワークに指示します (これは、この Bean に対してどの HTML を生成するかも示します)。たとえば、スタイル属性が「table」であるリージョンを定義すると、OAF は oracle.apps.fnd.framework.webui.beans.table.OATableBean オブジェクトをインスタンス化します。
l すべてのページには、スタイルが pageLayout であり、oracle.apps.fnd.framework.webui.beans.layout.OAPageLayoutBean オブジェクトとしてインスタンス化されるトップレベル領域 (一般に「ルート領域」と呼ばれる) が必要です。
l JDeveloperページ・ツリー(および対応するXMLファイル)内の領域と項目の順序により、これらのオブジェクトをランタイムBean組織階層のどこに追加するかがOAFフレームワークに指示されます。
以下の図 6 は、インスタンス化されたサンプル ページのさまざまな Web Bean の舞台裏を示しています。表示されているラベルは、その背後にある Web Bean の名前です。たとえば、ポップアップ・リストは oracle.apps.fnd.framework.webui.beans.message.OAMessageChoiceBean としてインスタンス化され、送信ボタンは oracle.apps.fnd.framework.webui.beans.form.OASubmitButtonBean としてインスタンス化されます。
図 7 は、対応するページ定義を示しています。
図 6: UI コンポーネント ページには、対応する Web Bean の名前が表示されます
注: 以下に示されている領域名と項目名は、Oracle EBS の命名標準に準拠していません。代わりに、名前をわかりやすくするために使用されています。対応する構造を対応する Web Bean に解釈します。
図 7: JDeveloper のページ構造
プロパティ セット
各領域または項目は、プロパティ セットを使用してプロパティ グループの設定を継承できます。プロパティ セットは、領域、項目、その他のプロパティ セットを含む、あらゆるタイプの UI オブジェクト プロパティを識別できる、名前付きの再利用可能なプロパティ コレクションです。プロパティ セットを使用する UI を構築するときはいつでも、継承されたプロパティをオーバーライドできます (ただし、これは OAF プログラミング標準では推奨されていません)。この概念を実証するには、アプリケーション開発において、各テーブルに表示列ごとに関連付けられた属性セットが必要です。これらのプロパティ セットには、ツールチップ、表示幅などが含まれます。
l OAF ToolBox サンプル ライブラリ/チュートリアルには、主キー列タイプが NUMBER で HEADER_ID という名前の発注書テーブル (FWK_TBX_PO_HEADERS) があり、これは発注書番号としてもユーザーに表示されます。
l このテーブルには、
FwkTbxPoHeaders と呼ばれる関連付けられたプロパティ セット XML パッケージ ファイルがあり、これにはテーブルに表示されているすべての列の属性セット (列ごとに 1 つの属性セット) が含まれています。属性セットの 1 つは HeaderId と呼ばれます。
l HeaderId属性セットには、注文番号に設定されたPrmpt属性があり、表示の長さは適切な15に設定されています。
l 発注書コード化アイテムを含むページを作成するときに、その属性を設定できます。 setattribute /oracle/apps/fnd/framework/toolbox/attributesets/FwkTbxPoheaders/Headerid という名前の完全に適切な属性セットの場合。
図 8: JDeveloper でのプロパティ セットの使用
コンポーネントの再利用
コンポーネントの再利用
共有オブジェクトをページに含める場合は、単にそれらを継承するだけです。
たとえば、OAFToolBox サンプル ライブラリ/チュートリアルでは、共通領域 (PosummaryRN という名前) を作成したため、コーディングなしで同じコンテンツを複数のページに含めることができます。共有領域をページに追加するには、新しい領域を作成し、その Extends プロパティを共有領域の完全修飾名 (/oracle/apps/fnd/framework/toolbox/tutorial/webui/ PosummaryRN) に設定するだけです
注:リファレンス・ページでは、共有領域は編集できないため、JDeveloperの構造パネルではその項目が灰色になっています。
図9: JDeveloperでのリージョンの拡張
データソースバインディング
データベースと対話する必要があるBean(クエリ、挿入、更新、削除)については、次のことも行います。ビュー・インスタンス名データ・ソースへのバインディングを指定し、ビュー属性名を関連付けます。このバインディングは、基になるビュー・オブジェクトから問合せデータを取得したり、ユーザーが入力したデータをビュー・オブジェクト・インスタンスに書き込むためにOAFフレームワークによって使用されるため、重要です。 。
l View Instance Name プロパティは、それに含まれるアプリケーション モジュールのコンテキスト内の基礎となるビュー オブジェクトを参照します (すべてのビュー オブジェクトはアプリケーション モジュール内に「存在」し、そのコンテナ内のインスタンス名によって識別されます)。たとえば、SupplierVO ビュー オブジェクトがページのルート アプリケーション モジュール内のインスタンス名「MySupVO」によって識別される場合、「MySupVO」が指定した名前になります。
l ビュー属性名は、列にマップされる基礎となるビュー オブジェクト内の属性を指します。たとえば、「SupplierId」属性 (基になる SUPPLIER_ID 列にマップされる) を持つ SupplierVO がある場合、ここで指定する名前は「SupplierId」です。
メニューを定義します
Oracle Browser Look and Feel (BLAF) UIガイドライン: タブ/ナビゲーションなどのすべての OAF アプリケーションにはメニューが含まれています。これらのメニュー構造は、Oracle EBS のメニューおよび関数定義フォームを使用して宣言的に定義できます。これについては、後ほど開発ドキュメントで詳しく説明します。OAF が宣言的な UI レイアウトをランタイム Bean 階層に変換するのと同じように、宣言的なメニュー定義の Web Bean も含まれます
ページ フローの定義
複数ページのトランザクション フローを処理する場合、OAF フレームワークは複雑なハードコーディングされたコントローラー ロジックに対する宣言型 (したがってカスタマイズ可能な) アプローチ。この機能の詳細については、第 4 章「ワークフローを使用した宣言的ページフロー」を参照してください。パーソナライゼーション ページ
OAF フレームワークには、OA パーソナライゼーション フレームワークと呼ばれる宣言型カスタマイズ インフラストラクチャも含まれています。これは、エンド ユーザーおよび製品リリース チェーン (ローカリゼーション、アレンジメントの変更など) に対するカスタマイズされた応答をサポートします。
注: 開発ドキュメントでわかるように、領域と項目はプログラムで作成するよりも宣言的に作成する方が優れています。実際、クライアントがあなたの作業をパーソナライズできるように、宣言的にコンポーネントを作成できない場合にのみ、コンポーネントをプログラム的に作成する必要があります。
コントローラーコントローラーはユーザーのアクションに応答し、アプリケーション フローをガイドします。
第 3 章の「コントローラーの実装」ドキュメントでは、次の内容について詳しく説明します。
コントローラは、リージョン・レベルでインタフェース・ビューに関連付けることができます(より一般的な観点から見ると、oracle.apps.fnd.framework.webui.beans.OAWebBeanContainerインタフェースを実装するすべてのOAF Web Beanをコントローラに関連付けることができます)。
以下の図 10 に示すように、作成するすべてのコントローラは oracle.apps.fnd.framework.webui.OAControllerImpl を継承します。
Controller クラスは、WebBean の動作方法を定義するクラスです。特に、次の目的でコントローラー コードを作成します。
l 実行時に UI を操作/初期化します (宣言的に実装できないプログラムによるレイアウトを含む)
l ボタンの押下などのユーザー イベントをインターセプトして処理します。
理リクエスト処理
ブラウザがページの OA.JSP リクエストを送信するとき:1. Oracle.Apps.fnd.framework.webui.oapageBean (メインの OAF ページ処理クラス) がページ名を使用する 必要なアプリケーション モジュールを決定する、そのため、アプリケーション モジュール プールからアプリケーション モジュール インスタンスをプルできます。アプリケーション モジュールは接続プールから JDBC 接続も取得し、ページのトランザクション コンテキストが確立されます。 2. ユーザー セッションを確認します。無効な場合は、ログイン ページが表示されます (これは簡略化のためであることに注意してください。詳細については、後の開発ドキュメントで説明します)。 3. ユーザーが有効であると仮定すると、OAPageBean はリクエスト パラメーターに基づいて HTTP POST リクエストを処理しているか GET リクエストを処理しているかを判断します。 GET リクエストの処理 ブラウザがサーバーに GET リクエストを発行してページをリクエストすると (または手動でリダイレクトすると)、OAF フレームワークは宣言された UI 定義を使用して Web Bean 階層を構築します: 1 。 OAPageBean は、ページのトップレベルの pageLayout Bean の processRequest() メソッドを呼び出し、Web Bean 階層全体が再帰的に処理されて、次のように Web Bean (関連するモデル コンポーネントを含む) が初期化されます。コントローラーがある場合は、コントローラー上で processRequest(OAPageContextpageContext, OAWebBean webBean) メソッドを呼び出します。このメソッドは、ページ レイアウトの構築/変更、WebBean プロパティの設定、および手動データ初期化 (たとえば、ページに移動するときに自動クエリを実行する必要がある場合) を行うために使用します。 2. 一部の複雑な WebBeans (oracle.apps.fnd.framework.webui.beans.table.OATableBean や oracle.apps.fnd.framework.webui.beans.layout.OAPageLayoutBean など) は、prepareForRendering() を呼び出して準備する必要があります。 ) ポストコントローラー処理を実行するメソッド (このメソッドの詳細は、対応する Bean Javadoc で説明されています)。 3. 各 Web Bean は、その子コントロールの processRequest() メソッドを呼び出します。 2. oracle.apps.fnd.framework.webui.OAPageBean は、Web Bean 階層を UIX に渡してページを生成し、ブラウザに送信します。 POST リクエストの処理 ブラウザがページのサーバーに POST リクエストを行うとき: OAF フレームワークが OA.jsp リクエストを受信すると、OAPageBean は oracle.apps.fnd.framework.webui.OAPageContext オブジェクトを作成します。このクラスは、ページの処理中にのみ存在します。上で説明した 3 つの重要なメソッド (processRequest()、processFormData()、および processFormRequest()) はそれぞれ、パラメーターとして OAPageContext を受け取り、作成するコントローラー コードはすべてこの重要なクラスを使用します。 図 10: OAPageContext クラスと他のキー クラスの関係 おそらく最も重要なことは、これがクラスであることです。単純なメソッド getParameter(Stringname) を呼び出してリクエスト パラメータ値を読み取るために使用します (リクエストにはすべての URL パラメータに加えて、POST リクエストの場合はすべてのフォーム フィールド値と、ユーザーが選択した名前とイベントが含まれていることを思い出してください)関連するアクション/コントロール部分)。 ヒント: ページ上の個々の Web Bean (ボタン、フィールドなど) の場合、getParameter() に渡される name の値は、ページの定義時に割り当てた対応する識別 ID です。したがって、たとえば、コントローラに次のコードを記述することができます。 Ahri は、JDeveloper で「GoButton」という名前のボタンをユーザーが押したかどうかを認識します OAPageContext缓存了根应用模块的引用,其可以提供对视图对象和事务的访问。如果你需要访问一个应用模块,可以像下面: 发出导航指令 你可以使用这个类的方法来告诉OAF框架来进行JSP转向或者一个客户端的重定向。比如(我们会在稍后的开发文档中对这个方法做更详细的介绍): 访问应用上下文信息 就像你的模型代码中的OADBTransaction,OAPageContext提供了对servlet会话层Oracle EBS上下文信息,比如用户名称,id,当前职责等等。比如,下面的代码片段演示了如何获取用户名称:
上の図が示すように、OAPageContext にはリクエスト モジュールとルート アプリケーション モジュールへの参照があります。これらの関係と、OAPageContext が各コントローラーの応答処理メソッドに渡されることで、以下に示す一般的なタスクで OAPageContext を使用する方法がわかります。 processFormRequest(OAPageContextpageContext, OAWebBean webBean){ if (pageContext.getParameter("GoButton") != null) { // The user pressed the "Go" button, do something... }}
processFormRequest(OAPageContext pageContext, OAWebBean webBean){ OAApplicationModule am = (OAApplicationModule)pageContext.getRootApplicationModule();}
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 AM OAWebBeanConstants.ADD_BREAD_CRUMB_YES, // Show breadcrumbs OAWebBeanConstants.IGNORE_MESSAGES); }}
processRequest(OAPageContext pageContext, OAWebBean webBean){ String userName = pageContext.getUserName();}