ヘッダーをスキップ
Oracle® Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド
11g リリース2(11.1.2.3.0)
B69399-02
  目次へ移動
目次

前
 
次
 

23 アプリケーションでのダイアログの使用

この章では、ADF ControllerおよびADFタスク・フローを使用したダイアログの作成方法、およびその代替方法であるADFアプリケーションでのADF Facesダイアログ・フレームワークの使用方法を説明します。

この章の内容は次のとおりです。

23.1 アプリケーションでのダイアログの使用について

エンド・ユーザーの現在のページを表示するブラウザ・ウィンドウ外のセカンダリ・ブラウザ・ウィンドウにエンド・ユーザーへの情報を表示する場合は、ダイアログを使用します。たとえば、プライマリ・ブラウザ・ウィンドウ内のタスクに関するヘルプ情報を エンド・ユーザーに対して表示する場合や、エンド・ユーザーが値のリストから値を選択できるようにする場合です。このヘルプ情報の例は、モードレス・ダイアログが適しているユースケースです。モードレス・ダイアログを使用すると、エンド・ユーザーはプライマリ・ウィンドウとダイアログの両方で同時に作業できます。エンド・ユーザーに値を選択させるユースケースの場合は、モーダル・ダイアログの方が適しています。モーダル・ダイアログを使用した場合、ダイアログで要求されたアクション(例: 値の選択)を実行しないかぎり、エンド・ユーザーはそのダイアログを起動したページにアクセスできません。

エンド・ユーザーに対してモードレス・ダイアログを構成する場合は、ADF Facesダイアログ・フレームワークを使用します。エンド・ユーザーに対してモーダル・ダイアログを構成する予定の場合は、1つ以上のダイアログを起動するために、ADF Controllerのバインド・タスク・フローを構成します。

23.1.1 アプリケーションのユース・ケースと例でのダイアログの使用

23.2項「モーダル・ダイアログでのバインド・タスク・フローの実行」では、モーダル・ダイアログでバインド・タスク・フローを実行し、エンド・ユーザーから入力を取得できる方法と、取得した入力を使用してバインド・タスクを呼び出したビュー・アクティビティに戻ることができる方法を説明しています。アプリケーションでADFコントローラ・タスク・フローが使用されないか、モードレス・ダイアログの使用が必要な場合、23.3項「ADF Facesダイアログ・フレームワークの使用」で、ADF Facesダイアログ・フレームワークを使用してダイアログに1つまたは複数のページをレンダリングできる方法が説明されています。

23.1.2 アプリケーションでダイアログを使用するための追加機能

アプリケーションでダイアログを構成または使用する前に、他のADF機能を理解しておくことが有効な場合があります。また、構成するダイアログで実行可能な機能について読むことが必要な場合もあります。次に、関連する他の機能へのリンクを示します。

  • アプリケーションでADFコントローラのタスク・フローを使用する場合は、タスク・フローが提供する機能についてさらに理解しておくと役に立つ場合があります。詳細は、第18章「ADFタスク・フローの概説」を参照してください。

  • ADF Facesコンポーネントの詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Webユーザー・インタフェース開発者ガイド』を参照してください。

  • また、Oracle ADFが提供するAPIを使用してダイアログのカスタム・コードを記述できます。次の例のように、内部としてマークされていないパッケージをインポートしないようにカスタム・コードを記述していることを確認します。

    import oracle.adfinternal.controller.*;

    カスタム・コードの記述に使用できるAPIの詳細は、次のドキュメントを参照してください。

    • Oracle Fusion Middleware Oracle ADF Controller Java APIリファレンス

    • Oracle Fusion Middleware Java APIリファレンス for Oracle ADF Faces

23.2 モーダル・ダイアログ内でのバインド・タスク・フローの実行

モーダル・ダイアログ内で実行するバインド・タスク・フローを構成し、エンド・ユーザーの入力を取得し、取得した入力とともに、バインド・タスク・フローをコールしたビュー・アクティビティに戻ることができます。構成するバインド・タスク・フローでは、ページ・フラグメントではなく、ページが参照される必要があります。

図23-1は、必要な構成の例を示しています。adfc-config.xmlのタスク・フローには、ビュー・アクティビティ(launch_page)が含まれ、エンド・ユーザーは、モーダル・ダイアログをレンダリングするcallDialog.xmlタスク・フローをそのビュー・アクティビティから起動します。詳細は、23.2.1項「モーダル・ダイアログ内でのバインド・タスク・フローの実行方法」を参照してください。

エンド・ユーザーがダイアログを閉じると、制御およびすべての修正値は、adfc-config.xmlのコール元タスク・フローにある起動ページに戻ります。詳細は、23.2.2項「モーダル・ダイアログから値を戻す方法」を参照してください。

さらに、モーダル・ダイアログが制御を戻した場合は、アプリケーションを構成して、起動ページの一部をリフレッシュできます。詳細は、23.2.3項「モーダル・ダイアログが戻った後にページをリフレッシュする方法」を参照してください。

図23-1 モーダル・ダイアログを起動するためのタスク・フロー・アクティビティ

モーダル・ダイアログを起動するためのタスク・フロー・アクティビティ

23.2.1 モーダル・ダイアログ内でのバインド・タスク・フローの実行方法

既存のタスク・フローにビュー・アクティビティとタスク・フロー・コール・アクティビティを追加します。ビュー・アクティビティにより、エンド・ユーザーがアクションを起動できるページが起動され、その結果、モーダル・ダイアログに表示されるバインド・タスク・フローが起動します。

作業を始める前に、次のようにします。

構成する属性がモーダル・ダイアログ内のバインド・タスク・フローの機能に与える影響について理解しておくと役に立つ場合があります。詳細は、23.2項「モーダル・ダイアログ内でのバインド・タスク・フローの実行」を参照してください。

他のADF機能を使用して追加可能な機能を理解しておくと有効な場合があります。詳細は、23.1.2項「アプリケーションでダイアログを使用するための追加の機能」を参照してください。

バインド・タスク・フローをモーダル・ダイアログ・ボックス内で実行する手順:

  1. 既存のタスク・フローのダイアグラム・エディタでビュー・アクティビティをダブルクリックし、関連付けられているページを開きます。

  2. バインド・タスク・フローをモーダル・ダイアログ・ボックスとして起動するために、実行時にエンド・ユーザーがクリックするコマンド・コンポーネント(commandButtonコンポーネントなど)を選択します。

  3. プロパティ・インスペクタで「共通」セクションを開き、action属性をバインド・タスク・フローを起動するための制御フロー・ケースに設定します。

    たとえば、図23-1editです。

  4. ポップアップ・ダイアログ内でバインド・タスク・フローを起動するために、useWindow属性をtrueに設定します。

  5. 既存のタスク・フローのダイアグラム・エディタに戻り、タスク・フロー・コール・アクティビティを選択します。

  6. プロパティ・インスペクタで「動作」セクションを開き、バインド・タスク・フローをダイアログとして実行するためにrun-as-dialog属性をtrueに設定します。

    タスク・フロー・アクティビティがコールするバインド・タスク・フローはダイアログとして動作できます。このバインド・タスク・フローは、手順2から4で構成したコマンド・コンポーネントによって起動できるほか、23.2.2項「モーダル・ダイアログから値を戻す方法」の説明に従って、コマンド・コンポーネントをレンダリングするビュー・アクティビティに値を戻すことができます。これらの他の変更でモーダル・ダイアログのバインド・タスク・フローを実行させる必要があることに注意してください。run-as-dialog属性のtrueへの設定では不十分です。

  7. display-type属性については、外部ブラウザ・ウィンドウにダイアログをレンダリングする場合はexternal-window (デフォルト値)、同じブラウザ・ウィンドウにダイアログをレンダリングする場合はinline-popupを選択します。

23.2.2 モーダル・ダイアログから値を戻す方法

モーダル・ダイアログにレンダリングされるバインド・タスク・フローを構成して、エンド・ユーザーがモーダル・ダイアログを閉じたときに、バインド・タスク・フローを起動したビュー・アクティビティに値を戻すことができます。戻された値は、たとえば、ビュー・アクティビティに関連付けられているページ上の入力コンポーネントに表示できます。

入力パラメータを宣言し、値を戻すには、タスク・フロー・コール・アクティビティによってコールされるバインド・タスク・フローを構成する必要があります。詳細は、20.3項「バインド・タスク・フローへのパラメータ渡し」を参照してください。

コマンド・コンポーネント(例: commandButtonコンポーネント)のreturnListener属性の値として、1つの引数を持つメソッド(戻りイベント)に対するメソッド・バインディングを指定します。returnListener属性により、ビュー・アクティビティに関連付けられているページ上の入力コンポーネントで、この値が設定されます。入力コンポーネントのバッキングBeanを指定し、入力コンポーネントのpartialTrigger属性をコマンド・コンポーネントのIDに設定します。

さらに、次を指定する必要があります。

  • コール先バインド・タスク・フローに戻り値の定義を指定し、 コール先バインド・タスク・フローの終了時に戻り値を取得する場所を示します。

バッキングBean、入力コンポーネントおよびコマンド・コンポーネントの作成に関する詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Webユーザー・インタフェース開発者ガイド』の「入力コンポーネントの使用およびフォームの定義」を参照してください。

作業を始める前に、次のようにします。

モーダル・ダイアログで実行するためにバインド・タスク・フローを構成します。詳細は、23.2.1項「モーダル・ダイアログ内でのバインド・タスク・フローの実行方法」を参照してください。

構成する属性がモーダル・ダイアログ内のバインド・タスク・フローの機能に与える影響を理解しておくと役に立つ場合があります。詳細は、23.2項「モーダル・ダイアログ内でのバインド・タスク・フローの実行」を参照してください。

他のADF機能を使用して追加可能な機能を理解しておくと有効な場合があります。詳細は、23.1.2項「アプリケーションでダイアログを使用するための追加の機能」を参照してください。

戻り値を指定する手順:

  1. 既存のタスク・フローのダイアグラム・エディタで、タスク・フロー・コール・アクティビティを選択します。

  2. プロパティ・インスペクタの「動作」セクションを開き、run-as-dialog属性をtrueに設定します。

  3. dialog-return-valueを、ターゲット・バインド・タスク・フローに対して指定した戻り値の定義の名前に設定します。

    バインド・タスク・フローで戻り値の定義を指定する方法の詳細は、20.4項「バインド・タスク・フローからの戻り値の指定」を参照してください。

  4. 「アプリケーション・ナビゲータ」で、モーダル・ダイアログを起動するページをダブルクリックします。

  5. ページ上の入力コンポーネントを選択し、プロパティ・インスペクタの「動作」セクションを開いてpartialTriggers属性のEL式を指定します。

    指定したEL式によりコマンド・コンポーネントが識別され、そのコマンド・コンポーネントの戻り値が受け入れられて、バッキングBeanが指定されます。たとえば、次のような構文を使用してEL式を入力します。

    #{pageFlowScope.backingBean.gotoModalDialog}

    gotoModalDialogは、コマンド・コンポーネントを識別します。

  6. コマンド・コンポーネントを選択し、プロパティ・インスペクタの「動作」セクションを開きます。

  7. 「セカンダリ・ウィンドウ」で、returnListener属性の値として、ページのバッキングBeanの戻りリスナー・メソッドを参照するEL式を入力します。

    指定した戻りリスナー・メソッドにより、エンド・ユーザーがモーダル・ダイアログを閉じたときに生成される戻りイベントが処理されます。次のような構文を使用してEL式を入力します。

    #{pageBean.listenerMethod}

23.2.3 モーダル・ダイアログが戻った場合のページのリフレッシュ方法

エンド・ユーザーがモーダル・ダイアログを起動するページを構成すると、エンド・ユーザーがそのモーダル・ダイアログを終了した後にリフレッシュできます。モーダル・ダイアログが値を戻すか、エンド・ユーザーがモーダル・ダイアログの制御を使用してページ内の既存のデータを編集する場合は、この動作の構成が必要な場合があります。

この機能を実装するには、モーダル・ダイアログを起動するコマンド・コンポーネントを構成して、戻りイベントをリスニングします。戻りイベントを取得すると、ページ上で部分ページ・レンダリング・イベントを実行するバッキングBeanメソッドが起動されます。例23-1 は、モーダル・ダイアログを起動し、戻りイベントをリスニングするcommandButtonコンポーネントを示しています。

例23-1 バッキングBeanメソッドを参照するReturnListener属性

<af:commandButton text="Edit"
   binding="#{backingBeanScope.backing_launch_page.cb1}"
   id="cb1" action="edit" useWindow="true"
   returnListener="#{backingBeanScope.backing_launch_page.backFromPopup}"/>

commandButtonコンポーネントのreturnListener属性では、モーダル・ダイアログの起動により発生する戻りイベントがリスニングされます。戻りイベントを取得すると、次の例のようにバッキングBeanメソッドが起動されます。

例23-2 部分ページ・イベントを起動するバッキングBeanメソッド

public void backFromPopup(ReturnEvent returnEvent) {
        AdfFacesContext adfFacesContext;
        adfFacesContext = AdfFacesContext.getCurrentInstance();
        adfFacesContext.addPartialTarget(this.getF1());
}

バッキングBeanメソッド(backFromPopup)では、戻りイベントが引数として取得され、例では、ページ内のフォーム上で部分ページ・レンダリング・イベントが起動されます。

作業を始める前に、次のようにします。

タスク・フロー内のビュー・アクティビティと関連付けられたページから起動するモーダル・ダイアログの他のオプションの構成方法を理解しておくと役に立つ場合があります。詳細は、23.2項「モーダル・ダイアログ内でのバインド・タスク・フローの実行」を参照してください。

また、他のタスク・フローの機能およびダイアログ・フレームワークの機能を使用して追加可能な別の機能を理解しておくと役に立つ場合があります。詳細は、23.1.1項「アプリケーションのユース・ケースと例でのダイアログの使用」を参照してください。

モーダル・ダイアログが戻った後にページをリフレッシュする手順:

  1. 既存のタスク・フローのダイアグラム・エディタで、エンド・ユーザーがコマンド・コンポーネントを起動しモーダル・ダイアログを開始するページを参照するビュー・アクティビティをダブルクリックします。

  2. プロパティ・インスペクタ」で、コマンド・コンポーネントを選択し、「動作」セクションを開いて、「セカンダリ・ウィンドウ」ラベルの下にあるReturnListenerフィールドに、JDeveloperによる生成が必要なバッキングBeanメソッドの名前を入力します。

  3. 「アプリケーション・ナビゲータ」で、「アプリケーション・ソース」を開いた後に、手順2で入力した値を使用してJDeveloperによりメソッドが生成されたバッキングBeanクラスを含むパッケージを開きます。

  4. 例23-2のようにメソッド本体を記述して、ページ上で部分ページ・レンダリング・イベントを起動します。

23.2.4 タスク・フローを使用するアプリケーションのダイアログについて

Fusion Webアプリケーションがモードレス・ダイアログ(タスク・フロー以外の非モーダル・ダイアログ)をレンダリングし、タスク・フローなどのADFコントローラの機能も使用する場合は、faces-config.xmlファイルではなく、アプリケーションのadfc-config.xmlファイルの制御フロー・ルールにdialog:syntaxを指定します。使用するFusion WebアプリケーションでADFコントローラ機能を使用しない場合は、faces-config.xmlファイル内のナビゲーション・ルールにdialog:syntaxを指定します。

例23-3は、adfc-config.xmlファイルに指定できる内容の例を示します。

例23-3 dialog:syntaxを使用したadfc-config.xmlファイル

<?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.jspx</page> 
    </view>
    <view id="dialog"> 
       <page>/dialog/untitled1.jspx</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>

23.3 ADF Facesダイアログ・フレームワークの使用

ADF Facesダイアログ・フレームワークを使用すると、ADF Controllerおよびタスク・フローを使用しないアプリケーションで、モーダル・ダイアログおよびモードレス・ダイアログを作成できます。このダイアログ・フレームワークでは、1つまたは一連のページを現在のページとして同じウィンドウ内に(同じビューIDで)表示するのではなく、新しいブラウザ・ウィンドウに表示できます。状況によっては、一連のインライン・ダイアログ(親ページの一部でありながら独自のフローを持つ一方で、別個のビューIDを使用しないダイアログ)の使用が検討される可能性もあります。これは、ポップアップをサポートしないアプリケーション(クライアント・デバイス上で稼働するアプリケーションや第45章「アクティブ・データ・サービスの使用」で説明するアクティブ・データ・サービスを使用するアプリケーションなど)では重要です。通常、JavaScriptを使用してダイアログを開き、プロセスを管理する必要があります。ダイアログ・フレームワークを使用するADF Facesでは、JavaScriptを使用せずに簡単にダイアログやプロセスを管理したり、新しいブラウザ・ウィンドウを開くことができます。


注意:

使用するアプリケーションでADF ControllerとともにFusionテクノロジ・スタックを使用する場合は、タスク・フローを使用して別個のウィンドウ(つまり複数のダイアログ・プロセス)で起動するダイアログを作成する必要があります。詳細は、23.2項「モーダル・ダイアログ内でのバインド・タスク・フローの実行」を参照してください。


受注を確認しようとするユーザーにログインを要求する単純なアプリケーションについて考えてみます。図23-2は、5つのページ(login.jspxorders.jspxnew_account.jspxaccount_details.jspxおよびerror.jspx)からなるアプリケーションのページ・フローを示しています。

図23-2 外部ダイアログのサンプル・アプリケーションのページ・フロー

ポップアップ・ダイアログ・サンプル・アプリケーションのページ・フロー

既存のユーザーが正常にログインすると、アプリケーションにより「Orders」ページが表示され、ユーザーの注文が(存在していれば)表示されます。ユーザーが正常にログインできなかった場合は、図23-3のように、別個のポップアップ・ダイアログ・ウィンドウに「エラー」ページが表示されます。

図23-3 「エラー」ポップアップ・ページ

エラー・ポップアップ・ページ

「Error」ページには「Cancel」ボタンがあります。ユーザーが「取消」をクリックすると、ポップアップ・ダイアログが閉じ、アプリケーションは図23-4に示す「ログイン・ページ」および元のフローに戻ります。

図23-4 ログイン・ページ

ポップアップ・ダイアログ内のユーザー名とパスワードを入力するためのログイン画面

新規ユーザーが「ログイン・ページ」で新規ユーザー・リンクをクリックすると、新しいウィンドウのポップアップ・ダイアログに新規アカウント・ページが表示されます(図23-5を参照)。

図23-5 別個のウィンドウの新規アカウント・ページ

ポップアップ・ダイアログ内の「New Account」ページ

ファースト・ネームやラスト・ネームなどの情報を入力した後、ユーザーが「Details」ボタンをクリックすると、同じポップアップ・ダイアログ内に「Account Details」ページが表示されます(図23-6)。ユーザーは「Account Details」ページでその他の情報を入力し、新しいログイン・アカウントのパスワードを確認入力します。「Account Details」ページには、2つのボタン(「Cancel」および「Done」)があります。

図23-6 ポップアップ・ダイアログ内の「Account Details」ページ

ポップアップ・ダイアログ内の「Account Details」ページ

この新規ユーザーが新規ログイン・アカウントの作成手順に進まずに「取消」をクリックした場合は、ポップアップ・ダイアログが閉じてアプリケーションは「ログイン・ページ」に戻ります。新規ユーザーが「終了」をクリックした場合は、ポップアップ・ダイアログが閉じ、アプリケーションはユーザー名」フィールドにユーザーの名が移入された「ログイン・ページ」(図23-7を参照)に戻ります。この段階で、新規ユーザーは新しいパスワードを入力し、正常にログインできるようになります。

図23-7 「ユーザー名」フィールドに名前が移入された「ログイン・ページ」

ユーザー名が定義されたログイン・ページ

注意:

ダイアログ・フレームワークを使用して、一度に複数のダイアログを開くことや、ベース・ページと存続期間が異なるダイアログを起動することはしないでください。


アプリケーションでのダイアログ・ページ・フローのサポートを容易にするために、ADF Facesにはアクション・コンポーネントのダイアログ機能(commandMenuItemおよびcommandButtonなど)が組み込まれています。アクション・コンポーネントからの新しいフローでページを開くかどうかをADF Facesに認識させるには、次の条件を満たす必要があります。


注意:

useWindow属性がfalseの場合、またはインラインでない別個のウィンドウとしてポップアップを構成する際にクライアント・デバイスでポップアップがサポートされていない場合、ADF Facesでは自動的に、ポップアップ・ウィンドウを使用せずに現在のウィンドウ内にページが表示されます(このアクションを実現するためにコードを変更する必要はありません)。


ダイアログに表示されるページは通常のJSFページですが、この章では外部ダイアログの実装方法を説明する目的で、ポップアップ・ダイアログに表示されるページをダイアログ・ページ、およびダイアログを起動するページを元のページと呼びます。ダイアログ・プロセスは、元のページによって(1つまたは一連のダイアログ・ページを含む)ダイアログが起動すると開始され、ユーザーがダイアログを閉じて元のページに戻ると終了します。

アプリケーションでダイアログ・ページ・フローをサポートするためのタスク:

  1. ダイアログを開くためのJSFナビゲーション・ルールを定義します。

  2. ダイアログの起動元のJSFページを作成します。

  3. ダイアログ・ページを作成し、ダイアログ値を返します。

  4. 値をダイアログに渡します(オプション)。

  5. 戻り値を処理します。

これらの操作は、任意の順序で実行できます。

23.3.1 ダイアログを開くためのJSFナビゲーション・ルールの定義方法

ダイアログ・フローのナビゲーションを管理するには、特殊なdialog:結果を持つ標準的なJSFナビゲーション・ルールを定義します。

ダイアログを開くためのゲーション・ルールを定義する手順:

  1. adfc-config.xmlファイルで、元のページおよびダイアログ・ページのページ・フローを作成します。手順の詳細は、18.4.1項「タスク・フローに制御フロー・ルールを追加する方法」を参照してください。

  2. ダイアログ・ページのナビゲーション・ルールを作成する場合、結果がdialog:で始まる必要があります。たとえば、図23-2のログイン・サンプル・アプリケーションの場合、「ログイン・ページ」から新規アカウント・ダイアログ・ページに渡される結果は、dialog:newAccountです。

実行時に、それぞれのダイアログ・ナビゲーション・ルールによって、指定したページが元のページ内に表示されるだけです。しかし、dialog:アクション結果を持つコマンド・コンポーネントを使用し、useWindow属性をtrueに設定した場合は、ADF Facesによりダイアログ内にページが開かれます。

23.3.2 ダイアログを開くJSFページの作成方法

元のページで、ダイアログを起動するコマンド・コンポーネントを使用する必要があります。コマンド・コンポーネントのアクション値は、起動されるダイアログに対する結果であることが必要です。

作業を始める前に、次のようにします。

構成する属性がADF Facesダイアログ・フレームワークの機能に与える影響を理解しておくと役に立つ場合があります。詳細は、23.1項「アプリケーションでのダイアログの使用について」を参照してください。

他のADF機能を使用して追加可能な機能を理解しておくと有効な場合があります。詳細は、23.1.2項「アプリケーションでダイアログを使用するための追加の機能」を参照してください。

ダイアログを開くJSFページの作成方法:

  1. JSFページを作成します。

    詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Webユーザー・インタフェース開発者ガイド』のビュー・ページの作成に関する項を参照してください。

  2. コマンド・コンポーネントをページに追加します。

    ページへのコマンド・コンポーネントの追加に関する詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Webユーザー・インタフェース開発者ガイド』のナビゲーションのボタンおよびリンクの使用に関する項を参照してください。

    コマンド・コンポーネントに属性を設定する場合の注意点は、次のとおりです。

    • Action: 23.3.1項「ダイアログを開くためのJSFナビゲーション・ルールの定義方法」で作成したように、ダイアログにナビゲートする結果にaction属性を設定します。


      ヒント:

      actionの値は、静的文字列またはマネージドBean上のメソッドの戻り値にすることができます。


      たとえば、「ログイン・ページ」のコマンド・コンポーネントのaction属性は、戻される結果に基づいて注文ページまたは「エラー」ダイアログ・ページのどちらにナビゲートするかを決定するメソッドにバインドされます。メソッドがdialog:errorを戻した場合は、「エラー」ダイアログが開きます。メソッドがsuccessを戻した場合、ユーザーは注文ページに移動します。

    • ActionListener: action属性の設定の代替として、actionListener属性を構成して、次のクラスのインスタンスからlaunchDialogメソッドを起動します。

      oracle.adf.view.rich.context.AdfFacesContext

      launchDialogメソッドおよびAdfFacesContextクラスの詳細は、Oracle Fusion Middleware Oracle ADF Faces Java APIリファレンスを参照してください。

    • UseWindow: ダイアログを開くためにtrueに設定します。


      ヒント:

      falseに設定した場合、ADF Facesは、現在のページのすべての状態を保存した後、現在のウィンドウ内にダイアログ・ページを表示します(この処理を実現するためにコードを記述する必要はありません)。


    • WindowHeightおよびWindowWidth: ダイアログ・ウィンドウの目的のサイズを設定します。これらの値により、ダイアログのポップアップ・コンポーネントのcontentWidthおよびcontentHeight属性が設定されます。


      ヒント:

      ユーザーは実行時にこれらの属性の値を変更できますが、アプリケーションが変更の永続性を使用するように構成されていないかぎり、ユーザーがページを終了した時点で、それらの値は保持されなくなります。変更の永続性の有効化および使用に関する詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Webユーザー・インタフェース開発者ガイド』の「JSFページでのユーザー・カスタマイズの許可」を参照してください。


    • PartialSubmit: trueに設定します。こうすることで、ポップアップ・ダイアログが表示されたときに元のページがリロードされることがありません(このため、一瞬表示されることもありません)。

    • WindowEmbedStyle: 元のページに属するポップアップでダイアログが開くことを確認する場合はinlineDocumentに設定します。次に表示されるダイアログを別個のブラウザで開く場合は、windowに設定します。

    • WindowModalityType: ダイアログをモーダルにする場合は、applicationModalに設定します。モーダル・ダイアログの場合、ダイアログを閉じるまで、ユーザーは元のページに戻れません。ユーザーが元のページとダイアログの間を行き来できるようにする場合は、modelessに設定します。

コマンド・コンポーネントはダイアログを開くとき、LaunchEventイベントを配信します。LaunchEventイベントは、ポップアップ・ダイアログを開くコンポーネントと、ダイアログ・プロセスの開始時に表示するコンポーネント・ツリーのルートに関する情報を格納しています。LaunchEventは、パラメータのマップをダイアログに渡すこともできます。詳細は、23.3.5項「ダイアログに値を渡す方法」を参照してください。

23.3.3 ダイアログ・ページを作成してダイアログ値を戻す方法

ダイアログ・ページは他の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ダイアログ・フレームワークの機能に与える影響を理解しておくと役に立つ場合があります。詳細は、23.1項「アプリケーションでのダイアログの使用について」を参照してください。

他のADF機能を使用して追加可能な機能を理解しておくと有効な場合があります。詳細は、23.1.2項「アプリケーションでダイアログを使用するための追加の機能」を参照してください。

ダイアログ・ウィンドウを閉じて任意で値を戻す手順:

  1. ダイアログ・ページにコマンド・コンポーネントを追加します。そのコンポーネントを使用してウィンドウを閉じる場合は、immediate属性をtrueに設定します。

    ボタンを使用してダイアログ・プロセスの別のページにナビゲートする場合は、そのボタンを標準のナビゲーションのように構成して、useWindow属性をfalseに設定します(これにより、次のページが同じダイアログ・ウィンドウに表示され、前のページの状態が保持されます)。

  2. 「コンポーネント・パレット」で、ダイアログ・プロセスを終了してダイアログを閉じる必要があるが、値を戻す必要はない場合は、「リスナー」グループの「操作」パネルから、「アクション・リスナーを返す」をドラッグし、コマンド・コンポーネントに対する子としてドロップします。

    returnActionListenerタグにより、AdfFacesContextオブジェクト上のreturnFromDialogメソッドがコールされます(バッキングBeanコードは不要です)。

    このaf:returnActionListenerタグでは属性は使用されません。af:commandButtonコンポーネントのimmediate属性はtrueに設定されており、これによって、ユーザーが必須フィールドの「パスワード」および「パスワードの確認」に値を入力せずに「取消」をクリックした場合は、アプリケーションの起動フェーズではなく、リクエスト値の適用フェーズでデフォルトのJSF ActionListenerが実行されるため、入力の検証はバイパスされます。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Webユーザー・インタフェース開発者ガイド』の「ADF FacesでのJSFライフサイクルの使用」を参照してください。

  3. ダイアログ・プロセスを終了して値を戻す必要がある場合は、actionイベントを処理し、AdfFacesContextの現在のインスタンスのreturnFromDialogメソッドを使用して必要な値を戻す、マネージドBean上のメソッドを作成します。


    注意:

    AdfFacesContext.returnFromDialog()メソッドはnullを返します。バッキングBean内で「Cancel」アクション・イベントを処理するのに必要な値はこれだけです。


    たとえば、ユーザーが「Account Details」ページの「Done」をクリックした場合、プロセスは終了し、ユーザーの入力値が返されます。例23-4は、「終了」ボタンがバインドされているイベント・ハンドラ・メソッドのコードを示しています。このメソッドは顧客情報を取得し、その後、不正なパスワードに対するFacesメッセージを作成するか、新しい顧客オブジェクトに値を設定してそのオブジェクトを戻します。

例23-4 マネージドBean内の「終了」ボタンに対するアクション・リスナー・メソッド

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);
  }
}

23.3.4 実行時に行われる処理: ダイアログからの戻りイベントの呼出し

ダイアログが閉じると、ADF Facesは戻りイベント(ReturnEvent)を生成します。AdfFacesContext.returnFromDialog()メソッドは、戻り値を戻りイベントのプロパティとして送信します。この戻りイベントは、ダイアログを開いたコマンド・コンポーネント(たとえば、「ログイン・ページ」の新規ユーザー commandLink)に登録されている戻りリスナー(ReturnListener)に配信されます。戻り値を処理する方法は、23.3.7項「戻り値の処理方法」を参照してください。

23.3.5 ダイアログに値を渡す方法

ダイアログに値を渡すには、LaunchEventのハンドラ・メソッドにバインドされているLaunchListenerリスナーを使用します。getDialogParameters()メソッドを使用すると、キーと値のペアを使用してパラメータをMapに追加できます。

作業を始める前に、次のようにします。

構成する属性がADF Facesダイアログ・フレームワークの機能に与える影響を理解しておくと役に立つ場合があります。詳細は、23.1項「アプリケーションでのダイアログの使用について」を参照してください。

他のADF機能を使用して追加可能な機能を理解しておくと有効な場合があります。詳細は、23.1.2項「アプリケーションでダイアログを使用するための追加の機能」を参照してください。

ダイアログに値を渡す手順:

  1. getDialogParametersメソッドを使用してダイアログからパラメータを取得するLaunchEventに対して、ハンドラ・メソッドを作成します。

    たとえば、サンプル・アプリケーションでは、新規ユーザーが「ログイン・ページ」の「ユーザー名」フィールドに名前を入力して、新規ユーザー・リンクをクリックできます。ポップアップ・ダイアログ内に「New Account」ダイアログ・ページが表示されると、「First Name」入力フィールドには、「Login」ページで入力された名前が自動的に移入されます。これを実現するには、例23-5のように、getDialogParametersメソッドを使用してダイアログに「ユーザー名」フィールドの値を入力するハンドラを作成します。

    例23-5 バッキングBean内の「New User」コマンド・リンクに対するlaunchEventリスナー・メソッド

    public void handleLaunch(LaunchEvent event)
    {
      //Pass the current value of the field into the dialog
      Object usr = username;
      event.getDialogParameters().put("firstname", getUsername());
    }
    // Use by inputText value binding 
    private String username;
    public String getUsername()
    {
      return username;
    }
    public void setUsername(String username)
    {
      this.username = username;
    }
    
  2. 次のページへのナビゲートに使用するコマンド・コンポーネントのlaunchListener属性を、手順1で作成したハンドラ・メソッドにバインドします。

    例23-6は、launchListener属性がハンドラ・メソッドにバインドされているcommandLinkコンポーネントのコードを示しています。

    例23-6 「Login」ページの入力フィールドと「New user」コマンド・リンク

    <af:inputText label="Username" value="#{backing_login.username}"/>
    <af:commandLink id="cmdLink" text="New User?"
                    action="dialog:newAccount"
                    useWindow="true" partialSubmit="true"
                    launchListener="#{backing_login.handleLaunch}"
                    returnListener="#{backing_login.handleReturn}"
                    windowHeight="200" windowWidth="500" />
    
  3. 生成されるページで、pageFlowScopeオブジェクトを使用して#{pageFlowScope.someKey}という形式の特殊なEL式を介してキーと値を取得します(例23-7を参照)。

    例23-7 「New Account」ページの入力フィールド

    <af:inputText label="First name" value="#{pageFlowScope.firstname}"/>
    

23.3.6 実行時に行われる処理: LaunchEventの処理

ADF Facesでは、プロセスは常に、ダイアログが起動されたページのpageFlowScope内に存在するすべての値のコピーを取得します。getDialogParameters()メソッドがパラメータをMapに追加すると、これらのパラメータもpageFlowScope内で使用可能になり、ダイアログ・プロセス内のすべてのページは、EL式を介してpageFlowScopeオブジェクトを参照することによりpageFlowScopeから値を取得できます。


注意:

sessionScopeとは異なり、pageFlowScopeの値を表示できるのは、現在のページ・フローまたはプロセス内のみです。ユーザーが新しいウィンドウを開いて移動を開始した場合、一連のウィンドウには独自のプロセスが設定され、各ウィンドウに格納されている値の独立性は維持されます。ブラウザの「戻る」ボタンをクリックすると、pageFlowScopeは元の状態に自動的にリセットされます。プロセスから戻ると、pageFlowScopeはプロセスの開始前の状態に戻ります。プロセスの外へ値を渡すには、AdfFacesContext.returnFromDialog()sessionScopeまたはapplicationScopeを使用します。


23.3.7 戻り値の処理方法

ダイアログが閉じたときに戻り値を処理するには、ダイアログを起動したコマンド・コンポーネントで戻りリスナーを定義します。たとえば、サンプル・アプリケーションでは、新規ユーザーが情報を入力した場合、その情報をダイアログ・プロセスの完了時に処理する必要があります。

作業を始める前に、次のようにします。

構成する属性がADF Facesダイアログ・フレームワークの機能に与える影響を理解しておくと役に立つ場合があります。詳細は、23.1項「アプリケーションでのダイアログの使用について」を参照してください。

他のADF機能を使用して追加可能な機能を理解しておくと有効な場合があります。詳細は、23.1.2項「アプリケーションでダイアログを使用するための追加の機能」を参照してください。

戻り値を処理する手順:

  1. returnEventのハンドラ・メソッドを作成します。getReturnValue()メソッドを使用して戻り値を取得します。戻り値は自動的にReturnEventのプロパティとして追加されるためです。

    例23-8に、戻り値を処理する戻りリスナー・メソッドのコードを示します。

    例23-8 バッキングBean内の「New user」リンクに対する戻りリスナー・メソッド

    public void handleReturn(ReturnEvent event)
    {
      if (event.getReturnValue() != null)
      {
        Customer cst;
        String name;
        String psw;
        cst = (Customer)event.getReturnValue();
        name = cst.getFirstName();
        psw = cst.getPassword();
        CustomerList.getCustomers().add(cst);
        inputText1.setSubmittedValue(null);
        inputText1.setValue(name);
        inputText2.setSubmittedValue(null);
        inputText2.setValue(psw);
      }
    }
    
  2. ダイアログを起動したコマンド・コンポーネントのreturnListener属性を、手順1で作成したreturnEventハンドラ・メソッドにバインドします。

23.3.8 実行時に行われる処理: 起動元コンポーネントのReturnEventの処理

サンプル・アプリケーションの実行時には、commandLinkコンポーネントに登録されているReturnListenerにADF FacesがReturnEventを配信すると、handleReturn()メソッドがコールされ、それに応じて戻り値が処理されます。新規ユーザーは顧客リストに追加され、そのユーザーの利便性のために、「ログイン・ページ」で前に送信された値はすべて消去され、入力フィールドに新しい情報が移入されます。