TOP
>
システム開発
> UIコンポーネントクラスを作成
JDeveloperで学ぶJSF入門
第16回:カスタムコンポーネントの作成(後編)
著者:
WINGSプロジェクト 佐藤治夫(株式会社ビープラウド)、
小泉守義
監修:
山田祥寛
2006/9/13
前のページ
1
2
3
次のページ
UIコンポーネントクラスを作成
次に、UIコンポーネントクラスを作成します。UIコンポーネントクラスの作成手順は次のとおりです。
コンポーネントクラスの種類に対応したクラスを拡張してクラスを作成する。
getFamily()メソッドを実装する
saveState()メソッド、restoreState()メソッドをオーバーライドする
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プロジェクト(代表取締役山田祥寛)が運営するライティング・チーム。海外記事の翻訳から、主にサーバサイド分野の書籍/雑誌/Web記事の執筆、講演、アプリケーション開発などを幅広く手がける。2006年7月時点での登録メンバーは20名で、現在も一緒に執筆をできる有志を募集中。執筆に興味のある方は、どしどし応募いただきたい。
INDEX
第16回:カスタムコンポーネントの作成(後編)
レンダラクラスを作成
UIコンポーネントクラスを作成
JSF設定ファイルへの登録