ここからは、JSF標準のコンポーネントをICEfaces用に拡張したコンポーネントであるインプットテキストコンポーネント(入力のためのテキストボックス)を例に、ICEfacesコンポーネントがどのように作成されているかについて説明したい。

タグの定義とクラスの関連の定義

まず始めに、タグの定義、そしてコンポーネントを構成する3クラスの関連付けの定義について、各設定ファイルを参照しながら説明しよう。

まずは、タグの定義を見てみよう。タグの定義は、TLDファイルに記述されている。icefaces-comps.jar中の/META-INF/icefaces_component.tldファイルを開くと、リスト1のようにタグ名(inputText)、タグハンドラクラス名、属性(リスト1においては、visible以外の属性を省略している)が定義されている。このように定義することで、指定したカスタムタグハンドラクラスのインスタンスが生成され、doStartTag()、doEndTag()メソッドが呼び出される。

リスト1 TLDファイルicefaces_component.tld(インプットテキストのみ抜粋)

<tag>
  <name>inputText</name>
  <tag-class>com.icesoft.faces.component.InputTextTag</tag-class>
  <body-content>JSP</body-content>
  <description><![CDATA[タグの説明を省略]]></description>

  <!-- 途中(attribute要素)を省略 -->
  <attribute>
    <name>visible</name>
    <required>false</required>
    <rtexprvalue>false</rtexprvalue>
    <description><![CDATA[属性の説明を省略]]></description>
  </attribute>
</tag>

なお、タグハンドラクラスは、コンポーネントタイプ名およびレンダラタイプ名を返すように作成する必要がある。ICEfacesのインプットテキストコンポーネントのカスタムタグハンドラであるInputTextTagクラスは、getComponentType()メソッドにおいてコンポーネントタイプ名"com.icesoft.faces.HtmlInputText"を、getRendererType()メソッドにおいてレンダラタイプ名"com.icesoft.faces.Text"を返すように作成されている。

次に、カスタムタグハンドラクラスと、カスタムコンポーネントクラス、カスタムレンダラクラスの関連付けを見てみよう。icefaces-comps.jar中の/META-INF/faces-config.xmlを開くと、リスト2のように定義されている。

リスト2 JSFの設定ファイルfaces-config.xml(インプットテキストのみ抜粋)

<render-kit>
  <renderer>
    <component-family>javax.faces.Input</component-family>
    <renderer-type>com.icesoft.faces.Text</renderer-type>
    <renderer-class>
      com.icesoft.faces.component.ext.renderkit.TextRenderer
    </renderer-class>
  </renderer>
</render-kit>

<component>
  <component-type>com.icesoft.faces.HtmlInputText</component-type>
  <component-class>
    com.icesoft.faces.component.ext.HtmlInputText
  </component-class>
</component>

このように設定することで、カスタムタグハンドラは、コンポーネントタイプ名を元に、カスタムコンポーネントを取得することが可能となる。また、カスタムコンポーネントは、ファミリ名(インプットテキストのファミリ名は、継承元であるjavax.faces.UIInputクラスと同様)とレンダラタイプ名を元に、カスタムレンダラを取得することが可能となる。