D2Dレンダリングの詳細

D2Dレンダリングのイメージがつかめたところで、もう少し詳細について説明しよう。

図12は、D2Dレンダリングの主役となるクラスと、それらの関係を示したものである(一部、依存線を省略している)。

図12 D2Dレンダリングの主要クラス

ViewHandlerクラス、およびResponseWriterクラスは、JSFのレンダリングフェーズで中心的な役割を果たすクラスである。また、FacesContextクラス、ExternalContextクラスは、JSFのコンテキストを表すクラスである。ICEfacesでは、これらのクラスを継承することで、その機能を拡張している。

ICEfacesで拡張されたクラスは、W3C DOMのクラスを用い、サーバサイドのDOMツリーを作成、保持、編集する。DOMツリーは、DOMSerializerインタフェース(の実装クラス)によりHTMLの文字列へと書き出される(シリアライズされる)。

それでは、これらのクラスがどのように振る舞うのかについて説明しよう。D2Dレンダリングは、D2DViewHandlerクラスが中心となって実行される。図13は、ICEfacesにおける(2回目以降の)レンダリングフェーズのシーケンスの概要である(初回のレンダリングにおいては、図13のstartDocumentの前に、JSPページを解析する点が異なる)。

図13 D2Dレンダリングのシーケンス

まず、D2DViewHandlerは、BridgeFacesContextから、コンポーネントツリーおよび、DOMResponseWriterのインスタンスを取得する。その後、再帰的にrenderResponse()メソッドを呼び出すことで、コンポーネントツリーを走査しながら、各コンポーネントのencodeBegin()、encodeEnd()メソッドを呼び出す。前述した通り、各コンポーネントはこの処理をレンダラに委譲する(レンダラは、DOMContextを用いてDOMツリーを生成する)。

コンポーネントに対応するDOMツリーの生成が終了したら、DOMResponseWriterのendDocument()メソッド中で、ICEfacesで用いるJavaScriptのノードなどを追加し、レスポンス用のDOMツリーを完成させる。

最後に、DOMSerializerにより、完成したDOMツリーからレスポンスが出力される。

以上がD2Dレンダリングのシーケンスの概要である。