| Oracle® Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド 11g リリース2 (11.1.2.4.0) B69399-03 |
|
![]() 前 |
![]() 次 |
この章では、コンテキスト・イベントを作成、公開およびサブスクライブして、Fusion Webアプリケーション内のリージョン間の通信を円滑化する方法について説明します。
この章の内容は次のとおりです。
ページまたはページ内のリージョンは、ページの他の場所からの情報または異なるリージョンからの情報を必要とすることがよくあります。情報を取得するためにパラメータを渡すことは可能ですが、それはパラメータが既知であり、EL式でページにアクセスできる入力である場合のみ意味を持ちます。また、パラメータ値が変化した場合にタスク・フローを再起動する必要があるときに、パラメータは便利です。
ただし、複数のページ・フラグメントを持つタスク・フローがあり、ページ・フラグメントには、フロー内のあるページへの入力として使用できる様々な興味深い値が含まれているとします。パラメータを使用して値を渡す場合、タスク・フローはすべてのフラグメントの興味深い各値を結合するための出力パラメータを公開する必要があります。そのかわり、必要な情報を含む各フラグメントに対し、ページを送信すると発生するコンテキスト・イベントを定義できます。情報を必要とするページまたはフラグメントは、様々なイベントをサブスクライブし、イベントを介して情報を取得できます。
StoreFrontモジュール内で、コンテキスト・イベントを顧客登録ページに使用して、適切な情報トピックを表示します。ユーザー登録ページregister.jspxには2つのリージョンがあります。1つのリージョンには顧客登録タスク・フローcustomer-registration-task-flow、もう1つのリージョンには情報トピック・タスク・フローhelp-task-flowが含まれます。コンテキスト・イベントは顧客登録リージョンから情報トピック・リージョンに渡され、情報トピック・タスク・フローは情報トピックを表示できるようになります。設計時、例34-1に示すとおり、イベント名、プロデューサ・リージョン、コンシューマ・リージョン、コンシューマ・ハンドラなどの情報がページ定義ファイルのイベント・マップ・セクションに保存されます。
例34-1 registerPageDef.xmlファイルのイベント・マップ
<eventMap xmlns="http://xmlns.oracle.com/adfm/contextualEvent">
<event name="queueHelpTopic">
<producer region="*">
<consumer region="helptaskflow1"
handler="helpPageDef.findHelpTextById">
<parameters>
<parameter name="helpTopicId" value="${payLoad}"/>
</parameters>
</consumer>
</producer>
</event>
</eventMap>
実行時に、顧客登録タスク・フローを入力するユーザーは、データを入力し、「次へ」ボタンを押すことで、「: 基本情報」から「住所」まで、その後支払いオプションまでの一連のアクティビティを進めます。ユーザーが「次へ」をクリックすると、payLoadパラメータに伴うコンテキスト・イベントが、顧客登録タスク・フローによりブロードキャストされます。その後、このイベントは情報タスク・フローとそのハンドラhelpPageDef.findHelpTextById()メソッドにより使用されます。このメソッドはpayLoadパラメータを使用して、表示する情報トピック・テキストを決定します。イベント・マップでは、EL式を指定して、入力パラメータをページの変数やパラメータにバインドできます。
イベントは、イベントを発生させるページまたはリージョン(作成者)のページ定義ファイルで構成されます。イベントに基づき処理を実行するコンシューマをプロデューサと関連付けるには、ページ定義にイベント・マップも作成します(リージョン間でイベントを使用するとき、このイベント・マップは、これらのリージョンの両方を保持しているページ定義ファイルに含められます)。使用ページが動的リージョン内にある場合、イベント・マップを使用ページのページ定義ファイル内に配置し、プロデューサの属性リージョンを"*"に設定する必要があります。属性リージョンを"*"に設定するのは、設計時、フレームワークはプロデューサへの相対パスを決定できないためです。
コンテキスト・イベントは、アクション・バインディング、メソッド・アクション・バインディング、値属性バインディング、またはレンジ・バインディング(表、ツリー、またはリスト・バインディング)に対して発生させることができます。また、条件付きでイベントを発生させ、EL式を使用して条件付きでイベントを処理することもできます。
アクション・バインディングとメソッド・アクション・バインディングの場合、アクションまたはメソッドの実行時にイベントは発生します。payLoadには、メソッドの戻り値が含まれます。また、ボタンのクリックやメニューからの選択などのADF Facesイベントからコンテキスト・イベントを発生させることもできます。イベントを定義するeventBindingがページ定義内に作成されます。
値属性バインディングの場合、イベントはバインディング・コンテナによってトリガーされ、属性が正常に設定された後に発生します。payLoadはDCBindingContainerValueChangeEventのインスタンスであり、新規の値、古い値、プロデューサ・イテレータ、バインディング・コンテナおよびソースへのアクセスを提供します。カスタム・データ・オブジェクトをポイントするようにpayLoadプロパティを変更すると、payLoad参照はかわりにオブジェクトを返します。例34-2は入力コンポーネントと関連付けられている属性値バインディング内部の値の変更イベントを示します。このページでユーザーがLAST_NAMEの値を変更すると、イベントvalueChangeEventがディスパッチされます。
例34-2 ページ定義ファイルの値属性イベント
<attributeValues IterBinding="DeptView1Iterator" id="Dname"
xmlns="http://xmlns.oracle.com/adfm/jcuimodel">
<events xmlns="http://xmlns.oracle.com/adfm/contextualEvent">
<event name="valueChangeEvent"/>
</events>
<AttrNames xmlns="http://xmlns.oracle.com/adfm/uimodel">
<Item Value="LAST_NAME"/>
</AttrNames>
</attributeValues>
</bindings>
<eventMap xmlns="http://xmlns.oracle.com/adfm/contextualEvent">
<event name="valueChangeEvent">
<producer region="LAST_NAME">
<consumer region="" handler="consumeEvent"/>
</producer>
</event>
</eventMap>
範囲バインディング(ツリー、表、リスト)の場合、イベントは現行の変更が正常に行われた後に発生します。payLoadはDCBindingContainerValueChangeEventのインスタンスであり、新規の値、古い値、プロデューサ・イテレータ、バインディング・コンテナおよびソースへのアクセスを提供します。
値属性バインディングおよび範囲バインディングのコンテキスト・イベントは、ナビゲーションの変化によってトリガーすることもできます。たとえば、ツリー表バインディングの内部にイベントを作成した場合、ユーザーがページでこのツリーの別ノードを選択したときに、このイベントがディスパッチされます。
プロパティ・インスペクタの「動作」セクションの「コンテキスト・イベント」セクションを使用して、コンテキスト・イベントを作成、公開、サブスクライブできます。図34-1に示すように、「コンテキスト・イベント」パネルは、ページから適切なコンポーネントまたはリージョンを選択した場合のみ表示されます。
コンテキスト・イベントのサブスクライブには、ページ定義ファイルの「コンテキスト・イベント」タブの「サブスクライバ」セクションにある概要エディタを使用することもできます(図34-2を参照)。
コンテキスト・イベントは、ADF Business Componentsが発生させるビジネス・イベントや、UIコンポーネントが発生させるイベントとは異なります。この種のイベントの詳細は、Oracle Fusion Middleware Oracle Application Development FrameworkのためのWebユーザー・インタフェース開発者ガイドを参照してください。ただし、コンテキスト・イベントは、UIイベントと関連付けて使用できます。その場合、UIイベントにより起動されるアクション・リスナーが、今度はイベントを発生させるメソッド・アクション・バインディングを起動できます。
コンテキスト・イベント・フレームワークは、ページ内のリージョン間の通信を可能にします。このフレームワークにより、ページ上の様々なリージョンによって生成および使用される各イベントを、ページ上でマップできます。JDeveloperを使用して、ページ定義ファイルによって宣言的にイベントを公開できます。同様に、ページ定義ファイルから、これらのイベントを宣言的にサブスクライブできます。パラメータをイベントとともに渡し、イベントに応答するハンドラを実装します。コンテキスト・イベントを作成するその他の方法には、マネージドBeanの使用、JavaScriptの使用などがあります。コンテキスト・イベントでは、リージョンがパラメータを受け取るために、リージョンをリフレッシュする必要はありません。
リージョンと親ページ間の通信パターンには、親対リージョン、リージョン対親、リージョン対リージョンの3種類があります。コンテキスト・イベント・フレームワークは、これら3つのシナリオすべてに対応する、非常に強力な通信実装です。コンテキスト・イベントでは、リージョンが入力パラメータを使用するために、リージョンをリフレッシュする必要はありません。
ADFリージョン間で通信を行うには、コンテキスト・イベントを使用する必要があります。ADFタスク・フロー・パラメータを使用してリージョン間の通信もできますが、この場合、リージョン間に直接的な依存性が生じてしまう可能性があります。静的なリージョンに対しては、ADFタスク・フロー・パラメータの使用が適切な場合もありますが、コンテキスト・イベントを使用すると、リージョン間の独立した通信を実装できます。
たとえば、従業員情報を入力するためのフォームを保持するリージョンがページに含まれるとします。ユーザーが従業員IDを更新し、送信ボタンを押すと、値変更コンテキスト・イベントが発生し、従業員ID値がpayLoadとして渡されます。同じページ上の別のリージョンがこのイベントをサブスクライブして使用することで、コンテキスト・イベントとともに渡されたpayLoadの情報に基づき、選択された従業員に対する部署情報を表示できます。
コンテキスト・イベントの処理を開始する前に、その他のADF機能を理解しておくと役に立ちます。次に、関連する他の機能へのリンクを示します。
ADFタスク・フロー・パラメータを使用して、ADFリージョン間で通信を行うこともできます。タスク・フローとリージョンの使用に関する詳細は、第21章「タスク・フローのリージョンとしての使用」を参照してください。
コンテキスト・イベントを作成するには、まず、メソッド・アクション、アクション、値属性、またはリスト・バインディングに基づいて、プロデューサにイベントを作成し、公開します。コンシューマで、このイベントをサブスクライブし、これを処理するためのハンドラを作成します。
通常、タスク・フローおよびビュー・アクティビティを含むリージョンを持つ親ページを作成します。リージョンの1つには、もう1つのリージョンのコンシューマ・イベント・ハンドラのために公開されるコンテキスト・イベントを作成します。タスク・フローとリージョンの使用に関する詳細は、第21章「タスク・フローのリージョンとしての使用」を参照してください。
|
注意: コードから(マネージドBeanの内部などから)アクション・コンテキスト・イベントを公開することもできます。 |
プロパティ・インスペクタを使用して、プロデューサのページ内にコンテキスト・イベントを作成します。
始める前に:
コンテキスト・イベントの作成時に使用可能な各オプションについて理解しておくと役立ちます。詳細は、34.2項「コンテキスト・イベントの宣言的な作成」を参照してください。
また、コンテキスト・イベントで使用可能な各機能についても理解しておくと役立ちます。詳細は、34.1.2項「コンテキスト・イベントの追加機能」を参照してください。
次のタスクを完了する必要があります。
コンテキスト・イベントを作成する手順:
「プロデューサ」ページで、「データ・コントロール」パネルからコンポーネントをドラッグし、イベントをトリガーするページにドロップします。
コンポーネントには、メソッド・アクション、アクション、値属性またはリスト・バインディングが必要です。StoreFrontモジュールでは、setHelpId()メソッドが「データ・コントロール」パネルからこのページに追加されました。
プロパティ・インスペクタで「動作」セクションを開きます。
「イベントの発行」セクションで「追加」アイコンをクリックします。
コンテキスト・イベントの公開ダイアログで:
「新規イベントの作成」を選択します。
イベントの名前を入力します。
表、ツリーまたはツリー表を使用している場合は、イベントを公開するノードを入力するための「ノード」フィールドが表示されます。
ペイロード・データをコンシューマに渡す場合は、「次からカスタム値を渡す」を選択します。
payloadデータを渡す場合は、ドロップダウン・リストからデータ型を選択します。
たとえば、プロデューサ・ページからコンシューマ・ページに属性を渡す場合、「ページ・データ」を選択し、ツリー構造から目的の属性を選択します。
「呼出し条件」タブにEL式を入力して、条件付きでイベントを発生させることができます。
たとえば、式${bindings.LAST_NAME.inputValue == 'KING'}を入力すると、顧客の姓が「KING」である場合のみ、イベントが発生します。
「OK」をクリックします。
イベントはこのページに作成されますが、コンポーネント・バインディングと関連付けるまで公開できません。
コンテキスト・イベントをサブスクライブするには、親ページのページ定義ファイルで概要エディタを使用します。
始める前に:
コンテキスト・イベントの作成時に使用可能な各オプションについて理解しておくと役立ちます。詳細は、34.2項「コンテキスト・イベントの宣言的な作成」を参照してください。
また、コンテキスト・イベントで使用可能な各機能についても理解しておくと役立ちます。詳細は、34.1.2項「コンテキスト・イベントの追加機能」を参照してください。
次のタスクを完了する必要があります。
イベントをサブスクライブし、使用する手順:
使用ページに、イベントに応答する可能性のあるコンポーネントを追加します。
StoreFrontモジュールでは、findHelpTextByIdメソッド・ハンドラの戻り値Stringが、このページにoutputTextコンポーネントとしてドロップされ、ヘルプ情報を表示します。
イベントとそのペイロード・データを処理するハンドラを作成します。
StoreFrontModuleの例では、findHelpTextByIdハンドラ・メソッドが、LookupServiceAMDataControlモジュールに作成されました。
コンシューマ・ページ定義の「バインディングと実行可能ファイル」タブの「バインディング」セクションの概要エディタで、「追加」アイコンをクリックします。
「項目の挿入」ダイアログで、methodActionを選択し、「OK」をクリックします。
「アクション・バインディングの作成」ダイアログで:
ハンドラを作成したデータ・コレクションを選択します。
「操作」ドロップダウン・リストから、目的のハンドラを選択します。
「OK」をクリックします。
コンシューマ・ページ定義の「バインディングと実行可能ファイル」タブの「バインディング」セクションの概要エディタで、「追加」アイコンをクリックします。
「項目の挿入」ダイアログで、attributeValueを選択し、「OK」をクリックします。
「属性バインディングの作成」ダイアログで:
「データ・ソース」ドロップダウン・リストから「変数」を選択します。
ハンドラの戻り値に「属性」を選択します。
「OK」をクリックします。
概要エディタの「コンテキスト・イベント」タブで「サブスクライバ」をクリックし、「イベント・サブスクライバ」セクションの「追加」アイコンをクリックします。
「コンテキスト・イベントのサブスクライブ」ダイアログで「検索」アイコンをクリックします。
「コンテキスト・イベントの選択」ダイアログで、サブスクライブするイベントをツリー構造から選択し、「OK」をクリックします。
「コンテキスト・イベントのサブスクライブ」ダイアログで:
「パブリッシャ」ドロップダウン・リストから目的のプロデューサ、または「<任意>」を選択します。1つのコンテキスト・イベントに対して複数のプロデューサが存在することがあります。
<Any>を選択すると、コンシューマは、選択したイベントを生成するあらゆるプロデューサをサブスクライブできます。ページ定義ファイルで、producer属性にはワイルドカード"*"が設定されます。プロデューサが動的リージョン内にある場合、サブスクライバがどのプロデューサからでも使用できるように、このフィールドを<Any>に設定する必要があります。
「範囲」フィールドの隣にある「ハンドラ」アイコンをクリックします。
「ハンドラの選択」ダイアログで、ツリー構造から目的のイベント・ハンドラを選択し、「OK」をクリックします。
ハンドラがパラメータを必要としている場合は、「パラメータ」タブを選択し、「追加」をクリックしてから、パラメータとして名前/値ペアを入力します。
条件付きでイベントを処理する場合、ハンドルタブを選択し、ハンドラがイベントを処理する条件を決定するEL式を入力します。
「OK」をクリックします。
|
注意: 構造ウィンドウでページ定義を右クリックし、「イベント・マップの編集」を選択し、イベント・マップを編集することができます。また、ページ定義ファイル、またはプロパティ・インスペクタでイベント属性を編集することもできます。 |
作成者のイベントを作成すると、JDeveloperはページ定義ファイルにevents要素を追加します。各イベント名が子として追加されます。例34-3に、StoreFrontモジュールのaccount_basicinformationPageDefページ定義ファイルに含まれるsetHelpIdctCatagoryメソッド・アクション・バインディングのイベントを示します。これは、顧客登録タスク・フローの「基本情報」ビューのページ定義です。
例34-3 プロデューサのイベント定義
<methodAction id="setHelpId"
InstanceName="LookupServiceAMDataControl.dataProvider"
DataControl="LookupServiceAMDataControl"
RequiresUpdateModel="true" Action="invokeMethod"
MethodName="setHelpId" IsViewObjectMethod="false"
ReturnName="LookupServiceAMDataControl.
methodResults.setHelpId_
LookupServiceAMDataControl_dataProvider_
setHelpId_result">
<NamedData NDName="usage" NDValue="CREATE_PROFILE"
NDType="java.lang.String"/>
<events xmlns="http://xmlns.oracle.com/adfm/contextualEvent">
<event name="queueHelpTopic"/>
</events>
メソッド・アクション・バインディングが呼び出されると、イベントがコンシューマにブロードキャストされます。
イベント・マップを構成すると、JDeveloperは対応するページ定義ファイルにイベント・マップのエントリを作成します。例34-4は、customerregistrationtaskflow1リージョンからhelptaskflow1リージョンへのqueueHelpTopicイベントをマップする、registerPageDefページ定義ファイルのイベント・マップを示します。また、helpPageDefページ定義ファイルで定義されているhelpPageDef.findHelpTextByIdハンドラ・メソッド・バインディングもマップします。コンシューマは、渡されたパラメータに基づいて、表示する情報テキストを決定するメソッドを呼び出します。registerPageDefページ定義はcustomerregistrationtaskflow1およびhelptaskflow1リージョンの両方の親コンテナであるため、マッピングはこのページ定義の中にあります。
例34-4 親ページ定義ファイルのイベント・マップ
<eventMap xmlns="http://xmlns.oracle.com/adfm/contextualEvent">
<event name="queueHelpTopic">
<producer region="*">
<consumer region="helptaskflow1"
handler="helpPageDef.findHelpTextById">
<parameters>
<parameter name="helpTopicId" value="${payLoad}"/>
</parameters>
</consumer>
</producer>
</event>
</eventMap>
アプリケーション・レベル、またはページ・レベルで、子リージョンへのコンテキスト・イベントのディスパッチを制御できます。
始める前に:
コンテキスト・イベントの作成時に使用可能な各オプションについて理解しておくと役立ちます。詳細は、34.2項「コンテキスト・イベントの宣言的な作成」を参照してください。
また、コンテキスト・イベントで使用可能な各機能についても理解しておくと役立ちます。詳細は、34.1.2項「コンテキスト・イベントの追加機能」を参照してください。
イベントのディスパッチを無効化するには:
アプリケーション・レベルでイベントのディスパッチを無効化するには、例34-5に示すように、adf-config.xmlファイルのdynamicEventSubscriptionsプロパティをfalseに設定します。
プロデューサがワイルドカードであるイベント・マップを持つリージョンへのイベントのディスパッチを無効化できます。
例34-5 adf-config.xmlを使用して、アプリケーション・レベルのコンテキスト・イベント・ディスパッチを無効化
<?xml version="1.0" encoding="windows-1252" ?>
<adf-config xmlns="http://xmlns.oracle.com/adf/config"
xmlns:cef="http://xmlns.oracle.com/adfm/contextualEvent">
<cef:DynamicRegionEventsConfig dynamicEventSubscriptions="false">
</cef:DynamicRegionEventsConfig>
</adf-config>
個々のページ・レベルでイベントのディスパッチを無効化するには、例34-6に示すように、関連付けられたページ定義ファイル内でdynamicEventSubscriptionsプロパティをfalseに設定します。
コンテキスト・イベントがこのページや、その子のいずれにも渡されることはありません。
イベント・プロデューサとコンシューマの両方が同じページ定義ファイルに定義されている場合、対応するページの呼び出しおよびバインディング・コンテナの作成後、次の場合にイベントが発生します。
対応するメソッドまたはアクション・バインディングが実行される
値バインディングが正常に設定される
レンジ・バインディングの現行性が正常に設定される
メソッド・バインディングの場合、メソッド実行の結果がイベントのペイロードを形成し、イベントがキューイングされます。JSFライフサイクルのアプリケーションの起動フェーズで、キューイングされたすべてのイベントがディスパッチされます。バインディング・コンテナに関連付けられたイベント・ディスパッチャは、そのイベントに関連するコンシューマをイベント・マップで確認し、イベントをコンシューマに渡します(イベント・マップは同じページ定義ファイルの一部であるため、バインディング・コンテナにも含まれます)。
プロデューサとコンシューマが異なるリージョンに存在する場合、イベントは最初に同じコンテナ内の任意のコンシューマにディスパッチされ、次にイベント伝播が親バインディング・コンテナに委任されます。この処理は、親または最上位のバインディング・コンテナに達するまで続きます。最上位バインディング・コンテナに達した後、プロデューサがワイルドカード(*)に設定されているページでリージョンを保持する子バインディング・コンテナに、イベントが再度ディスパッチされます。
コンテキスト・イベントの作成では、最初に作成者にイベントを作成します。続いてイベントのコンシューマを定義し、プロデューサとコンシューマをマッピングします。
始める前に:
コンテキスト・イベントの作成時に使用可能な各オプションについて理解しておくと役立ちます。詳細は、34.3項「コンテキスト・イベントの手動作成」を参照してください。
また、コンテキスト・イベントで使用可能な各機能についても理解しておくと役立ちます。詳細は、34.1.2項「コンテキスト・イベントの追加機能」を参照してください。
次のタスクを完了する必要があります。
コンテキスト・イベントを作成する手順:
アプリケーション・ナビゲータで、イベント・プロデューサのバインディングが含まれるページ定義ファイルを開きます。
作成者には、イベントの発行に使用される関連付けられたバインディングが必要です。たとえば、メソッドまたは操作が作成者になる場合、イベントは関連アクション・バインディングまたはメソッド・アクション・バインディングに含まれます。
構造ウィンドウで、プロデューサのバインディングを右クリックし、「バインディング名の中に挿入」→eventsまたは「バインディング名の中に挿入」→「コンテキスト・イベント」→eventsを選択します。
構造ウィンドウで、たった今作成されたevents要素を右クリックし、「eventsの中に挿入」→「event」を選択します。
「eventの挿入」ダイアログで、「名前」フィールドにイベント名を入力し、「終了」をクリックします。
これで、イベントが作成されます。デフォルトでは、関連するメソッドまたは操作の戻り値はすべて、イベントのペイロードとして取得され、ELでアクセス可能な変数${payLoad}に格納されます。次に、イベントをコンシューマにマッピングし、コンシューマに渡す必要があるペイロードを構成する必要があります。
使用者へのバインディングを含むページ定義を開きます。
このページが表すバインディング・コンテナは、含まれるバインディング・コンテナすべてを含む現在のスコープ(タスク・フロー・リージョンなど)からイベントへのアクセスを提供します。リージョンまたは他のネストされたコンテナがイベントを認識する必要がある場合、イベント・マップは使用リージョン内のページのページ定義に存在する必要があります。
構造ウィンドウで、ページ定義を表す最上位のノードを右クリックし、「イベント・マップの編集」を選択します。
|
注意: プロデューサ・イベントが埋込み動的リージョン内のページから発生する場合、イベント・マップ・エディタを使用してイベント・マップを編集できないことがあります。イベント・マップを手動で作成するには、ページ定義ファイルを編集するか、34.3項「コンテキスト・イベントの手動作成」で説明している「内部に挿入」の手順を使用します。 |
イベント・マップ・エディタで、「追加」アイコンをクリックして、イベント・エントリを追加します。
「新規EventMapエントリの追加」ダイアログ・ボックスで、次の操作を行います。
作成者ドロップダウン・メニューを使用して作成者を選択します。
「イベント名」ドロップダウン・メニューを使用してイベントを選択します。
使用者ドロップダウン・メニューを使用して使用者を選択します。これは、イベントを使用する実際のメソッドになります。
使用するメソッドまたは操作にパラメータが必要な場合は、「追加」アイコンをクリックします。
「パラメータ名」フィールドに、メソッドに必要なパラメータの名前を入力します。「パラメータ値」フィールドに値を入力します。これがイベントからのペイロードとなる場合、${payLoad}式を使用してこの値にアクセスできます。ペイロードに複数のパラメータが含まれ、それらすべてを必要とする場合以外は、省略記号ボタンを使用して「式ビルダー」ダイアログを開きます。このダイアログを使用して、「ペイロード」ノードの下の特定のパラメータを選択できます。
また、「パラメータ」省略記号ボタンをクリックして、選択ダイアログを開くこともできます。
「OK」をクリックします。
イベント・マップ・エディタで、「OK」をクリックします。
マネージドBeanの内部など、コードからアクション・コンテキスト・イベントを公開することができます。例34-7に示すように、プロデューサ・コンポーネントをマネージドBeanのメソッドに追加します。
この例では、プロデューサはアクション・バインディングを呼び出すコマンド・ボタン、コンシューマは文字列を表示するoutputTextコンポーネントです。これらは両方とも同じページにあります。
例34-7 JSFのイベント・プロデューサとイベント・コンシューマ
<af:form id="f1">
<af:commandButton value="eventProducerButton1" id="cb1"
action="#{MyBean.myActionPerformed}"
/>
<af:panelLabelAndMessage label="#{bindings.return.hints.label}"id="plam1">
<af:outputText value="#{bindings.return.inputValue}" id="ot1"/>
</af:panelLabelAndMessage>
</af:form>
例34-8に示すとおり、このページ定義ファイルには、プロデューサのメソッド・アクション・バインディング、コンシューマおよびイベント・マップが含まれます
例34-8 イベント・プロデューサ、イベント・コンシューマおよびイベント・マップを含むページ定義
<executables>
<variableIterator id="variables">
<variable Type="java.lang.String" Name="eventConsumer_return"
IsQueriable="false" IsUpdateable="0"
DefaultValue="${bindings.eventConsumer.result}"/>
</variableIterator>
</executables>
<bindings>
<methodAction id="eventProducer"
InstanceName="AppModuleDataControl.dataProvider"
DataControl="AppModuleDataControl" RequiresUpdateModel="true"
Action="invokeMethod" MethodName="eventProducer"
IsViewObjectMethod="false"
ReturnName="AppModuleDataControl.methodResults.eventProducer_
AppModuleDataControl_dataProvider_eventProducer_result">
<events xmlns="http://xmlns.oracle.com/adfm/contextualEvent">
<event name="myEvent"/>
</events>
</methodAction>
<methodAction id="eventConsumer" RequiresUpdateModel="true"
Action="invokeMethod" MethodName="eventConsumer"
IsViewObjectMethod="false" DataControl="AppModuleDataControl"
InstanceName="AppModuleDataControl.dataProvider"
ReturnName="AppModuleDataControl.methodResults.eventConsumer_
AppModuleDataControl_dataProvider_eventConsumer_result">
<NamedData NDName="str" NDValue="test" NDType="java.lang.String"/>
</methodAction>
<attributeValues IterBinding="variables" id="return">
<AttrNames>
<Item Value="eventConsumer_return"/>
</AttrNames>
</attributeValues>
</bindings>
<eventMap xmlns="http://xmlns.oracle.com/adfm/contextualEvent">
<event name="myEvent">
<producer region="eventProducer">
<consumer region="" handler="eventConsumer">
<parameters>
<parameter name="test" value="${payLoad}"/>
</parameters>
</consumer>
</producer>
</event>
</eventMap>
このボタンを押すと、myActionPerformedメソッドが呼び出され、コンテキスト・イベントを生成するために、payLoadを"myString"として次のメソッドがコールされます。
BindingContainer bc BindingContext.getCurrent().getCurrentBindingsEntry();
JUCtrlActionBinding actionBnd =
(JUCtrlActionBinding)bc.getControlBinding("eventProducer");
...
((DCBindingContainer)bc).getEventDispatcher().queueEvent(actionBnd.
getEventProducer(),"myString");
マネージドBeanからアクセスできるアクションとメソッド・バインディングはすべて、JavaScriptから呼び出すことができます。ADF Facesは、af:serverListener操作コンポーネントを提供します。これは、クライアント側JavaScriptからマネージドBeanメソッドを呼び出すために使用できます。参照されたマネージドBeanメソッドを使用してこのコンポーネントを呼び出すには、BindingContextオブジェクトを使用して、現在のBindingContainerを調べ、OperationBindingまたはJUEventBindingバインディングにアクセスします。また、af:serverListenerコンポーネントを使用して、ブラウザ・クライアントからマネージドBeanメソッドにメッセージpayloadを送信することもできます。
ほとんどの状況では、34.3項「コンテキスト・イベントの手動作成」の説明に従って、イベント・マップ・エディタを使用してイベント・マップを作成できます。しかし、プロデューサ・イベントが埋込み動的リージョン内のページから発生する場合などの状況では、設計時にイベント・マップ・エディタを使用してイベント・マップ作成に必要な情報を取得できません。
始める前に:
コンテキスト・イベントの作成時に使用可能な各オプションについて理解しておくと役立ちます。詳細は、34.6項「イベント・マップの手動作成」を参照してください。
また、コンテキスト・イベントで使用可能な各機能についても理解しておくと役立ちます。詳細は、34.1.2項「コンテキスト・イベントの追加機能」を参照してください。
イベント・マップを手動で作成する手順:
アプリケーション・ナビゲータで、コンシューマへのバインディングが含まれるページ定義を開きます。
構造ウィンドウで、ページ定義を表す最上位のノードを右クリックし、「pagedef名の中に挿入」→eventMapを選択します。
構造ウィンドウで、「eventMap」ノードを選択して右クリックし、「eventMapの中に挿入」→「event」を選択します。
「eventの挿入」ダイアログで、イベント名を入力して「OK」をクリックします。
手順3から4を繰り返して、さらにイベントを追加します。
「event」ノードを選択して右クリックし、「eventの中に挿入」→「プロデューサ」を選択します。
「プロデューサの挿入」ダイアログで、このイベントを生成するバインディングの名前を入力して、「OK」をクリックします。
イベント・プロデューサを持つリージョンの名前を入力することもできます。この場合、このタグの下に指定されたコンシューマはすべて、このイベントを使用できます。また、"*"を入力して、このタグの下のコンシューマすべてが使用できることを示すこともできます。
「プロデューサ」ノードを選択して右クリックし、「プロデューサの中に挿入」→「コンシューマ」を選択します。
「コンシューマの挿入」ダイアログで、このイベントを使用するハンドラの名前を入力して、「OK」をクリックします。
手順7から8を繰り返して、さらにコンシューマを追加します。
渡すパラメータがある場合は、パラメータ名および値を追加します。
「コンシューマ」ノードを選択して右クリックし、「コンシューマの中に挿入」→「parameters」を選択します。
「parameters」ノードを選択して右クリックし、「parametersの中に挿入」→「parameters」を選択します。
「パラメータの挿入」ダイアログで、パラメータ名およびパラメータ値を入力して、「OK」をクリックします。値はEL式でもかまいません。
さらにパラメータを追加するには、この手順を繰り返します。
デフォルトでは、コンテキスト・イベント・フレームワークはEventDispatcherImplを使用して、リージョンを横断するイベントをディスパッチします。デフォルトのイベント・ディスパッチャをオーバーライドするカスタム動作を提供して、カスタム・イベント・ディスパッチャを作成することができます。デフォルトのディスパッチャをオーバーライドするには、作成したカスタム・イベント・ディスパッチャをDatabindings.cpxファイルに登録する必要があります。
始める前に:
コンテキスト・イベントの作成時に使用可能な各オプションについて理解しておくと役立ちます。詳細は、34.7項「カスタム・ディスパッチャの登録」を参照してください。
また、コンテキスト・イベントで使用可能な各機能についても理解しておくと役立ちます。詳細は、34.1.2項「コンテキスト・イベントの追加機能」を参照してください。
カスタム・イベント・ディスパッチャを登録するには:
EventDispatcherクラスに基づいて、カスタム・イベント・ディスパッチャのJavaクラスを作成します。
次の形式の完全修飾名を使って、カスタム・イベント・ディスパッチャをDatabindings.cpxファイルに登録します。
EventDispatcher="package_name.CustomEventDispatcher_name"
例34-9は、パッケージNewPackageに作成されたNewCustomEventDispatcherというカスタム・イベント・ディスパッチャのコードを示します。
プロデューサのページ定義にイベントを作成します。詳細は、34.2項「コンテキスト・イベントの宣言的な作成」または34.3項「コンテキスト・イベントの手動作成」を参照してください。
コンシューマが動的リージョンにある場合は、コンシューマ・リージョンにイベント・マップを作成します。コンシューマが動的リージョンにはない場合でも、プロデューサ・リージョンとコンシューマ・リージョンの両方が入っている親ページにイベント・マップを指定できます。詳細は、34.6項「イベント・マップの手動作成」を参照してください。