ソース・アシスタントによる JSF コンポーネント・ツリーへのアクセス

EGL コードを使用して、JavaServer Faces (JSF) コントロールによって認識される Java™ 関数を呼び出すことができます。こうすることにより、これらのコントロールの外観および振る舞いを JSF ハンドラーから変更できます。 次の例には、JSF コントロールにアクセスするための EGL コードが含まれています。
package jsfhandlers;

import com.ibm.egl.jsf.*;

handler myPage type JSFHandler
   {view = "myPage.jsp",
    viewRootVar = myViewRoot}

    myViewRoot UIViewRoot;
    myInputVar string = "Hello";

  function changeColor()
    myInputField HtmlInputText;
    myInputField = myViewRoot.findComponent("form1:text1");
    myInputField.setStyle("color : red");
  end

end
この例では、myInputVar 変数にバインドされた text1 という名前の入力コントロールが JSP 上にあること、および changeColor 関数にバインドされたコマンド・ボタンが JSP 上にあることが前提となっています。
JSF ハンドラーから JSF コントロールにアクセスするには、以下のステップを実行します。
  1. ご使用の EGL Web プロジェクトに、JSF コンポーネント・インターフェースのサポートがあることを確認する。EGL Web プロジェクトへの JSF コンポーネント・インターフェース・サポートの追加を参照してください。
  2. Web ページを作成し、1 つ以上の JSF コントロールをそれに追加する。
  3. (オプション) 識別がしやすいように、JSF コントロールの ID 属性を変更する。ID 属性を変更するには、コントロールを選択し、「プロパティー」ビューの「ID」フィールドに、分かりやすいニーモニック (ページ内で固有のもの) を入力してください。
  4. ページの JSF ハンドラーに、次のコードを追加する。JSF コンポーネント・インターフェースのサポートをプロジェクトに追加した後に Faces JSP ファイルを作成すると、このコードが JSF ハンドラーのファイルに自動的に追加されます。
    • 以下の import 文を追加する。
      import com.ibm.egl.jsf.*

      この文でインポートされるパッケージには、JSF コントロール内の Java コードにアクセスするための、ExternalType パーツ・グループが含まれています。これらのパーツを編集する必要はありません。

    • ページの JSF ハンドラー内で、次の例のように UIViewRoot 型の変数を宣言する。
      myViewRoot UIViewRoot;
    • JSF ハンドラー・プロパティー viewRootVar で、UIViewRoot 変数の名前を指定する。
      handler myPage type JSFHandler
         {view = "myPage.jsp",
          viewRootVar = myViewRoot}
  5. JSF ハンドラーの関数内のブランク行で、Ctrl+Shift+Z を押す。ページ上の JSF コントロールを表示する「EGL ソース・アシスタント」ウィンドウが開きます。
  6. 「EGL ソース・アシスタント」ウィンドウで、アクセスしたい JSF コントロールを選択する。 ID またはコントロール・タイプを使用して、必要なコントロールを見つけることができます。あるいは、コントロールの上にマウスを移動してそのコントロールの属性を調べることができます。
  7. 「OK」をクリックします。
    EGL ソース・アシスタントが、2 行の EGL コードを JSF ハンドラーに追加します。
    • コードの第 1 行では、選択した JSF コントロールに一致する ExternalType パーツの EGL 変数が定義されます。 上の例の場合には、次のコードを使用して、HtmlInputText 型の変数を定義し、JSF 入力テキスト・コントロールにアクセスしています。
      myInputField HtmlInputText;
    • コードの第 2 行では、その変数が JSF コントロールに関連付けられます。 上の例の場合には、次のコードによって、form1 という書式内にある text1 という JSF 入力テキスト・コントロールに、変数が関連付けられています。
      myInputField = myViewRoot.findComponent("form1:text1");
  8. その変数を使用して JSF コントロールを変更する。 例えば、次のコードでは、setStyle 関数を使用して入力コントロールのテキストの色が赤に変更されます。
    myInputField.setStyle("color : red");
    このコードが実行されると、 入力コントロールのスタイルが変更されます。この例では、 ブラウザーに表示される HTML コードは次のようになります。
    <input id="form1:text1" type="text" name="form1:text1" style="color : red" />

    このセクションの関連トピックでは、このような方法で JSF コントロールで実行できる操作の例を、いくつか紹介しています。特定のコントロールで呼び出せる操作の完全なリストを見るためには、com.ibm.egl.jsf パッケージ内にある ExternalType パーツの関数を参照してください。

以下に、EGL コードで JSF コントロールにアクセスする場合の注意事項を示します。
  • EGL でアクセス可能な JSF 関数の完全なリストについては、 パッケージ com.ibm.egl.jsf 内のファイル FacesHtmlComponent.egl を開いてください。このファイルは、 JSF コンポーネント・インターフェースのサポートを追加すると、ご使用のプロジェクトに追加されます。この関数については、 このファイルのコメントに簡単な説明があります。詳細情報については、Faces コントロールの資料を参照してください。
  • これらの関数のいずれかにパラメーターを渡す場合は、必ず、 正しいデータ型を渡すようにしてください。これらの関数に渡されるパラメーターの多くは、HTML 属性に挿入されるため、パラメーターが数値またはブール値であることが関数名で示唆されている場合でも、EGL ストリング変数として渡す必要があります。

    例えば、setWidth 関数ではコントロールの幅がピクセルで設定されますが、パーセント (%) 記号が付加されている場合は、オリジナル・サイズのパーセンテージで設定されます。 このパラメーターは測定値であるため、パラメーターとして数値データ型を使用すると思われがちです。ところが、 この関数はストリングを受け取る必要があるのです。コントロールの幅を 300 ピクセルに設定するためには、「300」という値のストリング変数を渡さなければなりません。

  • 関数の多くは HTML 属性からの情報を設定するか、またはその情報を戻すため、 使用する関数に接続されている HTML 属性を認識しておく必要があります。ページが正常に機能するために必要な HTML 属性は、変更できます。例えば、『JSF コントロールのスタイル・クラスの変更』の説明に従って、コントロールのスタイル・クラスを変更する場合、そのコントロールの新規スタイル・クラスは、CSS ファイル内のページまたはスタイル・タグで使用できなければなりません。使用できない場合、そのコントロールが正常に表示されないことがあります。Web ページに変更を加えたら、必ずその変更内容をテストするようにしてください。FacesHtmlComponent.egl ファイル内のコメントに、HTML 属性を直接変更する関数についての注意が書かれています。
  • ほとんどの場合、JSF コントロールに加えた変更は、累積されません。例えば、コントロールのテキストをコード myComponent.setStyle("color: red"); で赤字にするように設定し、次に、同じコントロールのテキストを コード myComponent.setStyle("font-weight: bold"); で太字にするように設定すると、テキストは、太字にはなりますが赤字にはなりません。 これは、太字への変更によって赤字への変更が上書きされるためです。
    JSF コントロールに対して複数の変更を追加するためには、 そのコントロールの現在状態を取得して新規データを付加しますが、その際、 変更項目のリストがどのように区切られているかに注意してください。例えば、コントロールのテキストを 赤色の太字に変更する場合、そのコントロールのスタイルに対する以前の変更を上書きしないようにするには、 次のコードを使用します。
    myStyleString string;
    myStyleString = myComponent.getStyle() + "; color: red; font-weight: bold";
    myComponent.setStyle(myStyleString);
  • このハンドラー内の onConstructionFunction および onPreRenderFunction の各関数に含まれる JSF コントロール には、この方法でアクセスすることはできません。onPostRenderFunction プロパティーに指定されている関数は、JSF コンポーネント・ツリーにアクセスできます。 ただし、この関数は、ページがレンダリングされてブラウザーに送信された後に呼び出されるため、ページが最新表示されるまで、ページに対する変更はユーザーに表示されません。

JSF コントロールには、さまざまな変更を加えることができます。『関連タスク』にいくつかの例があるので、 参考にしてください。