アドレスフォームの内部構造

では、ICEfacesでは、どのようにしてAjax対応を実現しているのだろうか。ここでは、アドレスフォームを参考に、ICEfacesの基本的なアーキテクチャについて見ていこう。

図1は、アドレスフォームにおけるICEfacesの動作概要を示している。まず、クライアント側、サーバ側それぞれに、Ajaxにおける通信を実現するためのブリッジが存在する。クライアント側のDOM(Document Object Model)は、ブラウザがJavaScriptに公開しているDOMツリーである。ICEfacesにおいては、このDOMツリーと同様のDOMツリーが、Javaのオブジェクトとしてサーバ側にも保持されている。そしてもちろんサーバ側には、JSFアプリケーション(図1では、コンポーネントツリーのみを記載している)が存在する。

図1: アドレスフォームにおけるICEfacesの動作概要

図1において、アドレスフォームでユーザの入力があってから、画面が更新されるまでの大まかな流れは、次のようになる。

  1. リクエストの送信: ユーザのアクション、Ajaxブリッジを介したリクエストの送信
  2. リクエストの処理: サーバ側のAjaxブリッジによるリクエストの受け付け
  3. JSFのライフサイクル(アプリケーションの起動フェーズまで): 従来のJSFライフサイクルの実行
  4. JSFのライフサイクル(レンダリングフェーズ): レンダリング、サーバサイドのDOMの更新
  5. レスポンスの送信: サーバ側のAjaxブリッジを介したレスポンスの送信

以下、各処理について簡単に説明する。

1.リクエストの送信

アドレスフォームでは、ユーザのアクション(テキストボックスのフォーカスを外すなど)をトリガとしてリクエストが送信され、処理が実行される。これを実現するのがAjaxブリッジである。クライアント側のAjaxブリッジの実態は、比較的小さなJavaScriptである。Ajaxブリッジにおいては、イベントハンドラを用いて入力情報やイベント情報を取得し、XMLHttpRequestオブジェクト(以下、XHR)により、画面遷移とは非同期にHTTPリクエストを送信する。

2.リクエストの処理

Ajaxブリッジにより送信されたHTTPリクエストは、サーバ側のAjaxブリッジで受け付ける。サーバ側のAjaxブリッジの実態は、いくつかのHTTPサーブレットの拡張、およびそれらをデコレートする擬似サーブレット(PseudoServlet)群である(サーブレットのサブクラスではないため、"擬似"という名称がついていると思われる)。ICEfacesを用いるには、web.xmlに、ICEfaces独自のサーブレットであるPersistentFacesServlet、およびBlockingServletを登録する必要がある(Ajaxブリッジを介して送信されたHTTPリクエストは、JSFのFacesServletで処理されない)。

上記サーブレットは、リクエストパスに応じて、メインの処理を実施するクラス(ICEfacesで用意されているServerインタフェースの実装)に処理を委譲する。アドレスフォームの場合は、ReceiveSendUpdates#service()メソッドがそれであり、ここでJSFのライフサイクルが実行される。