Oracle® Fusion Middleware Oracle Application Development FrameworkによるFusion Webアプリケーションの開発 12c (12.2.1) E70030-02 |
|
![]() 前 |
![]() 次 |
この章の内容は次のとおりです。
エンド・ユーザーの現在のページを表示するブラウザ・ウィンドウ外のセカンダリ・ブラウザ・ウィンドウにエンド・ユーザーへの情報を表示する場合は、ダイアログを使用します。たとえば、プライマリ・ブラウザ・ウィンドウ内のタスクに関するヘルプ情報をエンド・ユーザーに対して表示する場合や、エンド・ユーザーが値のリストから値を選択できるようにする場合です。このヘルプ情報の例は、モードレス・ダイアログが適しているユースケースです。モードレス・ダイアログを使用すると、エンド・ユーザーはプライマリ・ウィンドウとダイアログの両方で同時に作業できます。エンド・ユーザーによる値の選択が必要なユースケースの場合、モーダル・ダイアログがより適切です。モーダル・ダイアログを使用した場合、ダイアログで要求されたアクション(例: 値の選択)を実行しないかぎり、エンド・ユーザーはそのダイアログを起動したページにアクセスできません。
エンド・ユーザーに対してモードレス・ダイアログを構成する場合は、ADF Facesダイアログ・フレームワークを使用します。エンド・ユーザーに対してモーダル・ダイアログを構成する予定の場合は、1つ以上のダイアログを起動するために、ADF Controllerのバインド・タスク・フローを構成します。JSFページまたはページ・フラグメント・ファイル(.jsff
)のいずれかを参照するビュー・アクティビティを定義して、ダイアログを起動できます。
「モーダル・ダイアログでのバインド・タスク・フローの実行」では、モーダル・ダイアログでバインド・タスク・フローを実行し、エンド・ユーザーから入力を取得できる方法と、取得した入力を使用してバインド・タスクをコールしたビュー・アクティビティに戻ることができる方法を説明しています。アプリケーションでADFコントローラ・タスク・フローが使用されないか、モードレス・ダイアログの使用が必要な場合、「バインド・タスク・フローのかわりとしてのADF Facesダイアログ・フレームワークの使用」で、ADF Facesダイアログ・フレームワークを使用してダイアログに1つ以上のページをレンダリングできる方法が説明されています。
アプリケーションでダイアログを構成または使用する前に、他のOracle ADF機能を理解しておくことが有効な場合があります。また、構成するダイアログで実行可能な機能について読むことが必要な場合もあります。次に、関連する他の機能へのリンクを示します。
アプリケーションでADFコントローラのタスク・フローを使用する場合は、タスク・フローが提供する機能についてさらに理解しておくと役に立つ場合があります。詳細は、「ADFタスク・フローのスタート・ガイド」を参照してください。
ADF Facesコンポーネントの詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』を参照してください。
また、Oracle ADFが提供するAPIを使用してダイアログのカスタム・コードを記述できます。カスタム・コードを記述する際は、次の例のように、内部としてマークされているパッケージをインポートしないようにしてください。
import oracle.adfinternal.controller.*;
カスタム・コードの記述に使用できるAPIの詳細は、次のドキュメントを参照してください。
Oracle ADF ControllerのJava APIリファレンス
Oracle ADF FacesのJava APIリファレンス
モーダル・ダイアログ内で実行するバインド・タスク・フローを構成し、エンド・ユーザーの入力を取得し、取得した入力とともに、バインド・タスク・フローをコールしたビュー・アクティビティに戻ることができます。構成するバインド・タスク・フローでは、ページ・フラグメントではなく、ページが参照される必要があります。
図28-1に、ADFタスク・フローのSummitサンプル・アプリケーションから必要とされる構成の例を示します。create-edit-orders-task-flow-definition
のタスク・フローには、ビュー・アクティビティ(Orders)が含まれ、エンド・ユーザーは、モーダル・ダイアログをレンダリングするorders-select-many-items.xml
タスク・フローをそのビュー・アクティビティから起動します。詳細は、「モーダル・ダイアログ内でのバインド・タスク・フローの実行方法」を参照してください。
エンド・ユーザーがダイアログを閉じると、制御およびすべての修正値は、create-edit-orders-task-flow-definition
のコール元タスク・フローにある起動ページに戻ります。詳細は、「モーダル・ダイアログから値を戻す方法」を参照してください。
さらに、モーダル・ダイアログが制御を戻した場合は、アプリケーションを構成して、起動ページの一部をリフレッシュできます。詳細は、「モーダル・ダイアログが戻った場合のページのリフレッシュ方法」を参照してください。
図28-1 Summit ADFサンプル・アプリケーションでモーダル・ダイアログを起動するためのタスク・フロー・アクティビティ
既存のタスク・フローにビュー・アクティビティとタスク・フロー・コール・アクティビティを追加します。ビュー・アクティビティにより、エンド・ユーザーがアクションを起動できるページが起動され、その結果、モーダル・ダイアログに表示されるバインド・タスク・フローが起動します。
始める前に:
構成する属性がモーダル・ダイアログ内のバインド・タスク・フローの機能に与える影響について理解しておくと役に立つ場合があります。詳細は、「モーダル・ダイアログ内でのバインド・タスク・フローの実行」を参照してください。
他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「アプリケーションでダイアログを使用するための追加機能」を参照してください。
バインド・タスク・フローをモーダル・ダイアログ・ボックス内で実行するには:
モーダル・ダイアログにレンダリングされるバインド・タスク・フローを構成して、エンド・ユーザーがモーダル・ダイアログを閉じたときに、バインド・タスク・フローを起動したビュー・アクティビティに値を戻すことができます。戻された値は、たとえば、ビュー・アクティビティに関連付けられているページ上の入力コンポーネントに表示できます。
入力パラメータを宣言し、値を戻すには、タスク・フロー・コール・アクティビティによってコールされるバインド・タスク・フローを構成する必要があります。詳細は、「バインド・タスク・フローへのパラメータ渡し」を参照してください。
コマンド・コンポーネント(例: button
コンポーネント)のreturnListener
属性の値として、1つの引数を持つメソッド(戻りイベント)に対するメソッド・バインディングを指定します。returnListener
属性により、ビュー・アクティビティに関連付けられているページ上の入力コンポーネントで、この値が設定されます。入力コンポーネントのバッキングBeanを指定し、入力コンポーネントのpartialTrigger
属性をコマンド・コンポーネントのIDに設定します。
さらに、次を指定する必要があります。
コール先バインド・タスク・フローに戻り値の定義を指定し、 コール先バインド・タスク・フローの終了時に戻り値を取得する場所を示します。
既存のタスク・フローのタスク・フロー・アクティビティに戻り値を指定し、 既存のタスク・フローが戻り値を検出できる場所を示します。
詳細は、「バインド・タスク・フローの戻り値の構成」を参照してください。
バッキングBean、入力コンポーネントおよびコマンド・コンポーネントの詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』の「入力コンポーネントの使用およびフォームの定義」を参照してください。
始める前に:
構成する属性がモーダル・ダイアログ内のバインド・タスク・フローの機能に与える影響を理解しておくと役に立つ場合があります。詳細は、「モーダル・ダイアログ内でのバインド・タスク・フローの実行」を参照してください。
他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「アプリケーションでダイアログを使用するための追加機能」を参照してください。
次のタスクを完了する必要があります。
戻り値を指定するには:
エンド・ユーザーがモーダル・ダイアログを起動するページを構成すると、エンド・ユーザーがそのモーダル・ダイアログを終了した後にリフレッシュできます。モーダル・ダイアログが値を戻すか、エンド・ユーザーがモーダル・ダイアログの制御を使用してページ内の既存のデータを編集する場合は、この動作の構成が必要な場合があります。
この機能を実装するには、モーダル・ダイアログを起動するコマンド・コンポーネントを構成して、戻りイベントをリスニングします。戻りイベントを取得すると、ページ上で部分ページ・レンダリング・イベントを実行するバッキングBeanメソッドが起動されます。次の例は、モーダル・ダイアログを起動し、戻りイベントをリスニングするbutton
コンポーネントを示しています。
<af:button text="Edit" id="b1" binding="#{backingBeanScope.backing_launch_page.b1}" action="edit" useWindow="true" returnListener="#{backingBeanScope.backing_launch_page.backFromPopup}"/>
button
コンポーネントのreturnListener
属性では、モーダル・ダイアログの起動により発生する戻りイベントがリスニングされます。戻りイベントを取得すると、次の例のようにバッキングBeanメソッドが起動されます。
public void backFromPopup(ReturnEvent returnEvent) {
AdfFacesContext adfFacesContext;
adfFacesContext = AdfFacesContext.getCurrentInstance();
adfFacesContext.addPartialTarget(this.getF1());
}
バッキングBeanメソッド(backFromPopup
)では、戻りイベントが引数として取得され、例では、ページ内のフォーム上で部分ページ・レンダリング・イベントが起動されます。
始める前に:
タスク・フロー内のビュー・アクティビティと関連付けられたページから起動するモーダル・ダイアログの他のオプションの構成方法を理解しておくと役に立つ場合があります。詳細は、「モーダル・ダイアログ内でのバインド・タスク・フローの実行」を参照してください。
また、他のタスク・フローの機能およびダイアログ・フレームワークの機能を使用して追加可能な別の機能を理解しておくと役に立つ場合があります。詳細は、「アプリケーションのユースケースと例でのダイアログの使用」を参照してください。
モーダル・ダイアログが戻った後にページをリフレッシュするには:
Fusion Webアプリケーションがモードレス・ダイアログ(タスク・フロー以外の非モーダル・ダイアログ)をレンダリングし、タスク・フローなどのADFコントローラの機能も使用する場合は、faces-config.xml
ファイルではなく、アプリケーションのadfc-config.xml
ファイルの制御フロー・ルールにdialog:syntax
を指定します。「バインド・タスク・フローのかわりとしてのADF Facesダイアログ・フレームワークの使用」で説明するように、使用するFusion WebアプリケーションでADFコントローラ機能を使用しない場合は、faces-config.xml
ファイル内のナビゲーション・ルールにdialog:syntax
を指定します。
次の例は、adfc-config.xml
ファイルで指定できる内容を示しています。この例ではJSPページを参照していますが、ビュー・アクティビティを定義してJSFページまたはページ・フラグメント・ファイルのどちらでも起動できます。
<?xml version="1.0" encoding="windows-1252" ?> <adfc-config xmlns="http://xmlns.oracle.com/adf/controller" version="1.2" id="__1"> <view id="view1" <page>/view1.jsf</page> </view> <view id="dialog"> <page>/dialog/untitled1.jsf</page> </view> <control-flow-rule> <from-activity-id>test</from-activity-id> <control-flow-case> <from-outcome>dialog:test</from-outcome <to-activity-id>dialog</to-activity-id> </control-flow-case> </adfc-config>
ADF Facesダイアログ・フレームワークを使用すると、ADF Controllerおよびタスク・フローを使用しないアプリケーションで、モーダル・ダイアログおよびモードレス・ダイアログを作成できます。このダイアログ・フレームワークでは、1つまたは一連のページを現在のページとして同じウィンドウ内に(同じビューIDで)表示するのではなく、新しいブラウザ・ウィンドウに表示できます。状況によっては、一連のインライン・ダイアログ(親ページの一部でありながら独自のフローを持つ一方で、別個のビューIDを使用しないダイアログ)の使用が検討される可能性もあります。これは、ポップアップをサポートしないアプリケーション(クライアント・デバイス上で稼働するアプリケーションや「アクティブ・データ・サービスの使用」で説明するアクティブ・データ・サービスを使用するアプリケーションなど)では重要です。通常、JavaScriptを使用してダイアログを開き、プロセスを管理する必要があります。ダイアログ・フレームワークを使用するADF Facesでは、JavaScriptを使用せずに簡単にダイアログやプロセスを管理したり、新しいブラウザ・ウィンドウを開くことができます。
注意:
使用するアプリケーションでADF ControllerとともにFusionテクノロジ・スタックを使用する場合は、タスク・フローを使用して別個のウィンドウ(つまり複数のダイアログ・プロセス)で起動するダイアログを作成する必要があります。詳細は、「モーダル・ダイアログ内でのバインド・タスク・フローの実行」を参照してください。
受注を確認しようとするユーザーにログインを要求する単純なアプリケーションについて考えてみます。図28-2は、5つのページ(login.jspx
、orders.jspx
、new_account.jspx
、account_details.jspx
およびerror.jspx
)で構成されるアプリケーションのページ・フローを示しています。
図28-2 外部ダイアログのサンプル・アプリケーションのページ・フロー
既存のユーザーが正常にログインすると、アプリケーションにより「Orders」ページが表示され、ユーザーの注文が(存在していれば)表示されます。ユーザーが正常にログインできなかった場合は、図28-3 のように、別個のポップアップ・ダイアログ・ウィンドウに「エラー」ページが表示されます。
図28-3 「エラー」ポップアップ・ページ
「Error」ページには「Cancel」ボタンがあります。ユーザーが「取消」をクリックすると、ポップアップ・ダイアログが閉じ、アプリケーションは図28-4 に示す「ログイン・ページ」および元のフローに戻ります。
図28-4 ログイン・ページ
新規ユーザーが「ログイン・ページ」で新規ユーザー・リンクをクリックすると、新しいウィンドウのポップアップ・ダイアログに新規アカウント・ページが表示されます(図28-5 を参照)。
図28-5 別個のウィンドウの新規アカウント・ページ
ファースト・ネームやラスト・ネームなどの情報を入力した後、ユーザーが「Details」ボタンをクリックすると、同じポップアップ・ダイアログ内に「Account Details」ページが表示されます(図28-6 )。ユーザーは「Account Details」ページでその他の情報を入力し、新しいログイン・アカウントのパスワードを確認入力します。「Account Details」ページには、2つのボタン(「Cancel」および「Done」)があります。
図28-6 ポップアップ・ダイアログ内の「Account Details」ページ
この新規ユーザーが新規ログイン・アカウントの作成手順に進まずに「取消」をクリックした場合は、ポップアップ・ダイアログが閉じてアプリケーションは「ログイン・ページ」に戻ります。新規ユーザーが「終了」をクリックした場合は、ポップアップ・ダイアログが閉じ、アプリケーションはユーザー名」フィールドにユーザーの名が移入された「ログイン・ページ」(図28-7 を参照)に戻ります。この段階で、新規ユーザーは新しいパスワードを入力し、正常にログインできるようになります。
図28-7 「ユーザー名」フィールドに名前が移入された「ログイン・ページ」
注意:
ダイアログ・フレームワークを使用して、一度に複数のダイアログを開くことや、ベース・ページと存続期間が異なるダイアログを起動することはしないでください。
アプリケーションでのダイアログ・ページ・フローのサポートを容易にするために、ADF Facesにはアクション・コンポーネントのダイアログ機能(commandMenuItem
およびbutton
など)が組み込まれています。アクション・コンポーネントからの新しいフローでページを開くかどうかをADF Facesに認識させるには、次の条件を満たす必要があります。
dialog:
で始まる結果を持つJSFナビゲーション・ルールが存在していること
コマンド・コンポーネントのアクション結果がdialog:
で始まっていること
コマンド・コンポーネントのuseWindow
属性がtrue
であること
注意:
useWindow
属性がfalse
の場合、またはインラインでない別個のウィンドウとしてポップアップを構成する際にクライアント・デバイスでポップアップがサポートされていない場合、ADF Facesでは自動的に、ポップアップ・ウィンドウを使用せずに現在のウィンドウ内にページが表示されます(このアクションを実現するためにコードを変更する必要はありません)。
ダイアログに表示されるページは通常のJSFページですが、この章では外部ダイアログの実装方法を説明する目的で、ポップアップ・ダイアログに表示されるページをダイアログ・ページおよびダイアログを起動するページを元のページと呼びます。ダイアログ・プロセスは、元のページによって(1つまたは一連のダイアログ・ページを含む)ダイアログが起動すると開始され、ユーザーがダイアログを閉じて元のページに戻ると終了します。
アプリケーションでダイアログ・ページ・フローを作成するには:
ダイアログを開くためのJSFナビゲーション・ルールを定義します。
ダイアログの起動元のJSFページを作成します。
ダイアログ・ページを作成し、ダイアログ値を返します。
値をダイアログに渡します(オプション)。
戻り値を処理します。
これらの操作は、任意の順序で実行できます。
ダイアログ・フローのナビゲーションを管理するには、特殊なdialog:
結果を持つ標準的なJSFナビゲーション・ルールを定義します。
ダイアログを開くためのゲーション・ルールを定義するには:
実行時に、それぞれのダイアログ・ナビゲーション・ルールによって、指定したページが元のページ内に表示されるだけです。しかし、dialog:
アクション結果を持つコマンド・コンポーネントを使用し、useWindow
属性をtrue
に設定した場合は、ADF Facesによりダイアログ内にページが開かれます。
元のページで、ダイアログを起動するコマンド・コンポーネントを使用する必要があります。コマンド・コンポーネントのアクション値は、起動されるダイアログに対する結果であることが必要です。
始める前に:
構成する属性がADF Facesダイアログ・フレームワークの機能に与える影響を理解しておくと役に立つ場合があります。詳細は、「アプリケーションでのダイアログの使用について」を参照してください。
他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「アプリケーションでダイアログを使用するための追加機能」を参照してください。
次のタスクを完了する必要があります。
ダイアログを開くJSFページを作成するには:
コマンド・コンポーネントはダイアログを開くとき、LaunchEvent
イベントを配信します。LaunchEvent
イベントは、ポップアップ・ダイアログを開くコンポーネントと、ダイアログ・プロセスの開始時に表示するコンポーネント・ツリーのルートに関する情報を格納しています。LaunchEvent
は、パラメータのマップをダイアログに渡すこともできます。詳細は、「ダイアログに値を渡す方法」を参照してください。
ダイアログ・ページは他のJSFページとほとんど同じですが、1つのみ例外があります。ダイアログ・ページでは、ダイアログ・プロセスが終了したとき(つまり、ユーザーがダイアログまたは一連のダイアログを閉じたとき)にADF Facesに通知する方法を指定する必要があります。
たとえば、新規アカウント・ページとアカウントの詳細ページは、同じダイアログ・プロセスに属しています。ダイアログ・プロセスには必要な数だけページを含めることができ、ダイアログ・プロセスが終了したことをフレームワークに通知するのは1回のみでかまいません。
これは、ダイアログを閉じるためのコマンド・コンポーネントに対する子としてreturnActionListener
タグを使用して、宣言的に行います。ただし、戻り値または他のアクション・イベント処理を提供する必要がある場合は、コマンド・コンポーネントのactionListener
属性をAdfFacesContext.returnFromDialog()
メソッドをコールするメソッドにバインドできます。このメソッドにより、パラメータのjava.lang.Object
またはjava.util.Map
の形式で戻り値を返すことができます。値の戻し先を把握しておく必要はありません(ADF Facesで自動的に処理されます)。
実行時、AdfFacesContext.returnFromDialog()
メソッドは、ユーザーがダイアログを閉じるとADF Facesに通知します。このメソッドは、ダイアログ・ページがポップアップ・ダイアログに表示されているかメイン・ウィンドウに表示されているかに関係なく、コールできます。ポップアップ・ダイアログが使用されている場合、ADF Facesにより自動的にそのポップアップ・ダイアログが閉じられます。
始める前に:
構成する属性がADF Facesダイアログ・フレームワークの機能に与える影響を理解しておくと役に立つ場合があります。詳細は、「アプリケーションでのダイアログの使用について」を参照してください。
他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「アプリケーションでダイアログを使用するための追加機能」を参照してください。
ダイアログ・ウィンドウを閉じて任意で値を戻すには:
public void done(ActionEvent e)
{
AdfFacesContext afContext = AdfFacesContext.getCurrentInstance();
String firstname = afContext.getPageFlowScope().get("firstname").toString();
String lastname = afContext.getPageFlowScope().get("lastname").toString();
String street = afContext.getPageFlowScope().get("street").toString();
String zipCode = afContext.getPageFlowScope().get("zipCode").toString();
String country = afContext.getPageFlowScope().get("country").toString();
String password = afContext.getPageFlowScope().get("password").toString();
String confirmPassword =
afContext.getPageFlowScope().get("confirmPassword").toString();
if (!password.equals(confirmPassword))
{
FacesMessage fm = new FacesMessage();
fm.setSummary("Confirm Password");
fm.setDetail("You've entered an incorrect password. Please verify that you've
entered a correct password!");
FacesContext.getCurrentInstance().addMessage(null, fm);
}
else
{
//Get the return value
Customer cst = new Customer();
cst.setFirstName(firstname);
cst.setLastName(lastname);
cst.setStreet(street);
cst.setPostalCode(zipCode);
cst.setCountry(country);
cst.setPassword(password);
// And return it
afContext.getCurrentInstance().returnFromDialog(cst, null);
}
}
ダイアログが閉じると、ADF Facesは戻りイベント(ReturnEvent
)を生成します。AdfFacesContext.returnFromDialog()
メソッドは、戻り値を戻りイベントのプロパティとして送信します。この戻りイベントは、ダイアログを開いたコマンド・コンポーネント(たとえば、「ログイン」ページの「新規ユーザー」リンク)に登録されている戻りリスナー(ReturnListener
)に配信されます。戻り値を処理する方法は、「戻り値の処理方法」を参照してください。
ダイアログに値を渡すには、LaunchEvent
のハンドラ・メソッドにバインドされているLaunchListener
リスナーを使用します。getDialogParameters()
メソッドを使用すると、キーと値のペアを使用してパラメータをMap
に追加できます。
始める前に:
構成する属性がADF Facesダイアログ・フレームワークの機能に与える影響を理解しておくと役に立つ場合があります。詳細は、「アプリケーションでのダイアログの使用について」を参照してください。
他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「アプリケーションでダイアログを使用するための追加機能」を参照してください。
ダイアログに値を渡すには:
ADF Facesでは、プロセスは常に、ダイアログが起動されたページのpageFlowScope
内に存在するすべての値のコピーを取得します。getDialogParameters()
メソッドがパラメータをMap
に追加すると、これらのパラメータもpageFlowScope
内で使用可能になり、ダイアログ・プロセス内のすべてのページは、EL式を介してpageFlowScope
オブジェクトを参照することによりpageFlowScope
から値を取得できます。
注意:
sessionScope
とは異なり、pageFlowScope
の値を表示できるのは、現在のページ・フローまたはプロセス内のみです。ユーザーが新しいウィンドウを開いて移動を開始した場合、一連のウィンドウには独自のプロセスが設定され、各ウィンドウに格納されている値の独立性は維持されます。ブラウザの「戻る」ボタンをクリックすると、pageFlowScope
は元の状態に自動的にリセットされます。プロセスから戻ると、pageFlowScope
はプロセスの開始前の状態に戻ります。プロセスの外へ値を渡すには、AdfFacesContext.returnFromDialog()
、sessionScope
またはapplicationScope
を使用します。
ダイアログが閉じたときに戻り値を処理するには、ダイアログを起動したコマンド・コンポーネントで戻りリスナーを定義します。たとえば、サンプル・アプリケーションでは、新規ユーザーが情報を入力した場合、その情報をダイアログ・プロセスの完了時に処理する必要があります。
始める前に:
構成する属性がADF Facesダイアログ・フレームワークの機能に与える影響を理解しておくと役に立つ場合があります。詳細は、「アプリケーションでのダイアログの使用について」を参照してください。
他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「アプリケーションでダイアログを使用するための追加機能」を参照してください。
戻り値を処理するには: