TOPシステム開発> レンダラクラスを作成
まるごとサーバサイドJava
JDeveloperで学ぶJSF入門

第16回:カスタムコンポーネントの作成(後編)

著者:WINGSプロジェクト  佐藤治夫(株式会社ビープラウド)、
小泉守義

監修:山田祥寛   2006/9/13
1   2  3  次のページ
レンダラクラスを作成

   次に、レンダラクラスを作成します。レンダラクラスには、クライアントから送信された値を解析してコンポーネントに格納する処理(decode)、コンポーネントの値をクライアントデバイスに依存した形式で出力する処理(encode)を実装します。レンダラクラス作成の際のポイントは、次のとおりです。
  1. javax.faces.render.Rendererをextendsする
  2. デコードメソッド(decode()メソッド)をオーバーライドする
  3. エンコードメソッド(encodeBegin()メソッド、encodeChildren()メソッド、encodeEnd()メソッド)を必要に応じてオーバーライドする

表1:レンダラクラス作成の際のポイント

   decode()メソッドでは、context.getExternalContext()メソッドとgetRequestParameterMap()メソッドによりリクエスト値がすべて格納されたjava.util.Mapを取得しています。ここから年月日を取り出し、新たなMapに格納し、UIComponentのsetSubmittedValue()メソッドで、そのMapをコンポーネントに渡しています。

   エンコード系のメソッド(encodeBegin、encodeChildren、encodeEnd)は、日付入力カスタムコンポーネントが入れ子のタグを持ちませんので、encodeEnd()メソッドのみを実装します。レンダリングを行う入れ子のタグを持つ場合は、encodeBegin()メソッドおよびencodeChildren()メソッドを実装してください。

   サンプルのencodeEnd()メソッドではResponseWriterを取得し、ResponseWriterのstartElement()メソッド、writeAttribute()メソッドにより、HTML文字列を出力しています。単にwrite()メソッドでHTMLを出力することもできますが、ResponseWriterに用意されたこれらのメソッドを使用することにより、HTML特殊文字列のエスケープ処理をJSFに任せることができます。

   オーバーライドするメソッドの仕様を表2にまとめます。また、レンダラクラスのクラス図を図1に示します。

メソッド 概要
decode()メソッド
encodeBegin()メソッド
encodeChildren()メソッド
FacesContextに保持されたHTTPリクエストを解析して、UIコンポーネントオブジェクトに設定する
encodeEnd()メソッド UIコンポーネントの値を基に出力をレンダリングする処理を記述する。encodeBegin()メソッドにはタグ開始のレンダリング、encodeChildren()メソッドにはタグの子ノードのレンダリング、encodeEnd()メソッドにはタグ終了のレンダリングを記述する。子ノードの定義をしない場合は、encodeEnd()メソッドだけにレンダリング処理を記述する

表2:Rendererクラスで実装するメソッドの仕様

レンダラクラスのクラス図
図1:レンダラクラスのクラス図

   InputDeteRerdererクラスはjavax.faces.Rendererクラスを継承しています。リスト1にレンダラクラス(InputDateRenderer.java)のソースを示します。

リスト1:InputDateRenderer.java(抜粋)

(画像をクリックすると別ウィンドウに拡大図を表示します)

1   2  3  次のページ

著者:WINGSプロジェクト 佐藤治夫(株式会社ビープラウド)、小泉守義 監修:山田祥寛
著者プロフィール
著者:WINGSプロジェクト 佐藤治夫(株式会社ビープラウド)、
小泉守義
監修:山田祥寛

WINGSプロジェクトは、有限会社WINGSプロジェクト(代表取締役山田祥寛)が運営するライティング・チーム。海外記事の翻訳から、主にサーバサイド分野の書籍/雑誌/Web記事の執筆、講演、アプリケーション開発などを幅広く手がける。2006年7月時点での登録メンバーは20名で、現在も一緒に執筆をできる有志を募集中。執筆に興味のある方は、どしどし応募いただきたい。


INDEX
第16回:カスタムコンポーネントの作成(後編)
レンダラクラスを作成
  UIコンポーネントクラスを作成
  JSF設定ファイルへの登録