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

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

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

監修:山田祥寛   2006/9/13
前のページ  1  2   3  次のページ
UIコンポーネントクラスを作成

   次に、UIコンポーネントクラスを作成します。UIコンポーネントクラスの作成手順は次のとおりです。
  1. コンポーネントクラスの種類に対応したクラスを拡張してクラスを作成する。
  2. getFamily()メソッドを実装する
  3. saveState()メソッド、restoreState()メソッドをオーバーライドする
  4. getConvertedValue()メソッドをオーバーライドする

表3:UIコンポーネントクラスの作成手順

   コンポーネントクラスを作成する際のポイントは、次のとおりです。


1. コンポーネントクラスの種類に対応したクラスを拡張してクラスを作成する

   日付入力コンポーネントでは、画面からの入力値があるのでjavax.faces.component.UIInputクラスを継承しています。入力のない表示だけのカスタムコンポーネントなどはUIComponentクラス、UIComponentBaseクラスなどを継承して作成できます。コンポーネントクラスのクラス図を図2に示します。

コンポーネントクラスのクラス図
図2:コンポーネントクラスのクラス図
(画像をクリックすると別ウィンドウに拡大図を表示します)


2. getFamily()メソッドを実装する

   JSF設定ファイルに設定したファミリタイプ名と同じ文字列を返します。JSFでは、複数のコンポーネントを集めてグルーピングして扱うことができます。このグループのことをファミリといいます。


3. saveState()メソッド、restoreState()メソッドをオーバーライドする

   UIコンポーネントは、シリアライズにより、その状態が保存(save)、または復元(restore)されます。その際にコンポーネントといっしょに保存/復元する必要のある属性は、saveState()メソッド、restoreState()メソッドをオーバーライドし、シリアライズのための処理を実装します。親クラスで定義された属性は、親クラスで保存/復元されますので、あえて実装する必要はありません。


4. getConvertedValue()メソッドをオーバーライドする

   getConvertedValue()メソッドをオーバーライドする入力値の変換に通常のコンバータが使用できない場合は、このメソッドをオーバーライドし変換処理を実装します。変換エラーがある場合は、次のように実装します。

  • FacesMessageのインスタンスを生成してエラーメッセージを格納
  • FacesContextのaddMessage()メソッドを呼び出してエラーメッセージを追加
  • setValid()メソッドの引数に"false"を設定して、JSFに変換エラーがあったことを通知

表4:変換処理の実装手順

   上記の処理により、JSFがエラーを検知し、Render Responseフェーズに移行します。日付入力コンポーネントの場合、テキストの入力フィールドが3つあり、通常のコンバータは使用できませんので、変換処理を自ら実装しています。

   リスト2では、submittedValueに保存されたマップに格納されている「年」「月」「日」の文字列を基にCalendarオブジェクトを生成しています。

リスト2:UIInputDate.java(抜粋)

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

   java.util.Map型のsubmittedValueは、レンダラのdecode()メソッドからsetSubmittedValue()メソッドを通して、UIコンポーネントに渡されたオブジェクトです。Calendarオブジェクトの生成に失敗した場合は、変換エラーとしてFacesMessageのインスタンスを生成し、addMessage()メソッドによりFacesContextに追加しています。これにより、JSFがタグにメッセージを表示します。

前のページ  1  2   3  次のページ


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

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


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