ADF Facesでのダイアログに対する値の受渡しについて

ADF Facesコマンド・コンポーネントからのダイアログの起動について」に説明されているように、値をAdfFacesContext.returnFromDialog()メソッドに渡すことで、ダイアログまたはプロセスから値を取得できます。このトピックでは、LaunchEventおよびprocessScopeを使用して、親プロセスの値をオーバーライドせずに、ダイアログとの間で値を受け渡す方法について説明します。

ADF Facesでは、ダイアログまたはプロセスを起動しようとすると、LaunchEventがキューイングされます。ダイアログに渡すパラメータを追加するには、(ダイアログの起動に使用する)コマンド・コンポーネントにlaunchListenerを登録し、launchEventを処理するメソッドでgetDialogParameters()を使用してダイアログにパラメータのマップを渡します。この方法で追加されたパラメータは、ADF FacesのprocessScopeに自動的に表示されます。プロセスのJSFページでは、#{processScope.someKey}などのEL式を使用してprocessScopeオブジェクトを参照し、processScopeから値を取得できます。

プロセスでは、LaunchEventのすべてのダイアログ・パラメータに加え、起動ページのprocessScope内のすべての値のコピーを常に取得します。「ADF FacesのprocessScopeについて」に記述されているように、processScopeの値は、現在のプロセスまたはウィンドウ内でのみ参照できます。新しいウィンドウが開いてナビゲーションが開始すると、新しい一連のウィンドウには各自のプロセスが設定されます。各ウィンドウに格納された値は独立したままです。プロセスから戻ると、起動ページのprocessScopeは、プロセスが開始する前のように復元されます。プロセスから値を渡す必要がある場合は、AdfFacesContext.returnFromDialog()メソッド、sessionスコープまたはapplicationスコープを使用します。

たとえば、ダイアログを起動するJSFページは、次のようになります。

<af:commandButton text="Get Value"
                  action="dialog:getValue"
                  useWindow="true"
                  returnListener="#{backing.handleReturn}"
                  launchListener="#{backing.addParameter}".../>     

バッキングBeanでは、次のようになります。

...
public void addParameter(LaunchEvent event)
{ 
  // Pass the current value of the field into the dialog.
  Object value = getInput().getValue();
  event.getDialogParameters().put("inputValue", value);
}     

processScopeオブジェクトを参照するページでは、次のようになります。

<af:outputText value="Input value is: #{processScope.inputValue}"/>    

2つの入力フィールド(名前用とパスワード用の入力フィールド)、ログイン・コマンド・ボタンおよび新規ユーザー用コマンド・リンクがあるログイン・ページがあると仮定します。新規ユーザーが名前を入力して新規ユーザー用コマンド・リンクをクリックすると、ADF Facesは、新規アカウント用のダイアログ・ページ(たとえば、住所や電話番号などの詳細情報を入力できるページ)に移動します。新規アカウント用のダイアログ・ページにもユーザーの名前を表示します。その場合は、新規アカウント用のダイアログ・ページに(最初のログイン・ページで入力した)名前を渡す必要があります。

たとえば、ダイアログを起動するJSFページは、次のようになります。

<af:inputText label="First Name"
              id="inputText1"
              value="#{backing_login.username}"/>
...
<af:commandLink id="cmdLink"
                text="New user?"
                action="dialog:newAccount"
                useWindow="true"
                returnListener="#{backing.handleReturn}"
                launchListener="#{backing_login.handleLaunch}".../>     

バッキングBeanでは、次のようになります。

...
// Add parameters in the processScope that can be reached from the dialog

public void handleLaunch(LaunchEvent event)
{
  // Pass the current value of the field into the dialog.

  Object usr = username;
  event.getDialogParameters().put("firstname", usr);
}
...
...
public String username;

public String getUsername()
{
  return username;
}

public void setUsername(String username)
{
  this.username = username;
}
...    

新しいアカウント用ダイアログ・ページのprocessScopeオブジェクトは、次のようにして参照します。

<af:outputText value="Your first name is #{processScope.firstname}"/>


af:setActionListenerおよびprocessScopeについて
ADF Facesでのダイアログの起動