カスタムコンポーネントクラス

カスタムコンポーネントクラスであるHtmlInputTextクラスは、JSFが標準で提供するインプットテキストコンポーネントであるHtmlInputTextクラスのサブクラスである。JSFの標準からの主な拡張点は以下になる。

  • 属性の保持……ice:inputTextタグの各種属性を、フィールドとして持っている。また、各フィールドのSetterメソッド、Getterメソッド(フィールド値がなければ、ValueBindingから値を取得する)を持っている。これにより、先に紹介したエフェクトや、ICEfacesコンポーネントに共通の属性に対応している。なお、com.icesoft.faces.component.IceExtendedインタフェースを実装することで、renderedOnUserRole、enabledOnUserRole属性、およびpartialSubmit属性に対応している
  • アクションのサポート……インプットテキストであっても、パーシャルサブミットによりアプリケーションを起動することがあるため、action属性、actionListener属性がサポートされている。JSFのActionSourceインタフェースを実装することで、ActionEventを発生させるコンポーネントになっている。これに伴い、broadcast()メソッド、queueEvent()メソッドも、ActionEventに対する処理を追加している

カスタムレンダラクラス

カスタムレンダラクラスは、Rendererクラスのサブクラスである。前述した通り、カスタムレンダラクラスは、コンポーネントクラスからエンコード、デコード処理を委譲される。インプットテキストコンポーネントは、入力コンポーネントであり、子要素を持たないため、decode()メソッドと、encodeEnd()メソッドが処理の中心となる。

まずdecode()メソッドだが、クラスの継承関係、メソッドの内容共に、JSFのRI(Reference Implementation)とよく似ているため、説明を割愛する。

次にencodeEnd()メソッドだが、ICEfacesのカスタムレンダラクラスは、HTMLを直接書き出さずサーバサイドのDOMツリーを構築するという点で、JSFが標準で提供するHTML用のコンポーネントとは大きく異なっている。コンポーネントツリーからDOMツリーを生成する様子については後述するとして、ここでは、encodeEnd()メソッドの内容を(ソースコード上で)追跡した様子を図9に示すに止める。

図9 テキストレンダラにおけるencodeEnd()メソッドの内容の追跡