これまで、ICEfacesが提供するコンポーネントの種類、およびICEfacesの開発環境を紹介してきた。ここからは、ICEfacesコンポーネントがどのように作成されているかについて説明する。その後、「D2D(Direct-to-DOM)レンダリング」について解説し、その中でICEfacesコンポーネントがどのように振る舞うかについても説明する。

特に次のような場合には、以降の内容が大変役に立つだろう。

  • 各々のICEfacesコンポーネントの詳細をひも解きたい
  • オリジナルのD2Dレンダラを作成したい

JSFのカスタムコンポーネント

ICEfacesが提供するコンポーネントは、JSFのカスタムコンポーネントである。ICEfacesコンポーネントの説明に入る前に、JSFのカスタムコンポーネントを構成する要素について、簡単におさらいしよう。

JSFのカスタムコンポーネントを作成するのに必要となるクラスは、次の3種類である。

  • カスタムタグハンドラ
  • カスタムコンポーネント
  • カスタムレンダラ

これらクラスのほかに、タグ名や属性を定義するTLDファイル、これらのクラスの関連付けを設定するfaces-config.xmlファイルも必要となる。これら2つの設定ファイルは、以降でICEfacesの具体例を見ることにし、ここでは、これら3種類のクラスの役割について簡単に説明する。

図6は、JSFのカスタムコンポーネントを構成するクラスの関係を表したものである。なお、以下の説明において「デコード処理」とは入力値をコンポーネントに設定する処理であり、「エンコード処理」とはコンポーネントから取得した値をレンダリング(出力)する処理のことである。

図6 コンポーネントを構成するクラスの関連

たとえば、レスポンスのレンダリングフェーズ(初回)では、(コンパイルされた)JSPページの中で、これらのクラスは(大雑把には)図7に示されるような振る舞いをする。

図7 レスポンスのレンダリング

まず、カスタムタグハンドラが、コンポーネントタイプ名を元に、コンポーネントを生成(実際の生成はアプリケーションに委譲)し、JSPページ中のJSFタグの属性値をコンポーネントに設定(setProperties)する。その後、エンコード処理をカスタムコンポーネントに委譲(encodeBegin、encodeEnd)する。

次に、カスタムコンポーネントが、ファミリ名、レンダラタイプ名を元に、レンダラキットにレンダラの生成を委譲する。その後、エンコード処理を、レンダラに委譲する。 最後に、カスタムレンダラが、エンコード処理(encodeBegin、encodeEnd)を実行する。

2回目以降のレンダリングフェーズでは、ViewHandlerクラスから各カスタムコンポーネントクラスのencodeBegin()、encodeEnd()メソッドが呼ばれる点が異なるが、それ以外の振る舞いは、図7同様である。

コンポーネントを構成するクラスは、もちろん上記以外の役割も担っている。以下に、それぞれのクラスが実行する処理を説明しよう。

カスタムコンポーネント

  • リクエスト値の適用フェーズにおいて、デコード処理(decode)をレンダラに委譲する
  • モデル値の更新フェーズにおいて、Managed Beanなどに値を格納する
  • アプリケーションの起動フェーズにおいて、アクションリスナを起動し、アクションメソッドを実行する
  • コンポーネントツリーの保存方式がclientである場合に、コンポーネントツリーを保存(レスポンスのレンダリングフェーズ)、および復元(ビューの復元フェーズ)する

カスタムレンダラ

  • リクエスト値の適用フェーズにおいて、デコード処理(decode)を実行する
  • 入力値の検証フェーズにおいて、コンバータによる値の変換を実行する

ここからは、これらの基本的な構成と振る舞いを踏まえ、ICEfacesの提供するコンポーネントがどのように作成されているかについて見ていこう。