- - PR -
バリデータ
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-07-05 11:24
いつもお世話になります。
カスタムコンポーネントを作成しています。 そのカスタムコンポーネント内でデータチェックを行いたいのですが、 カスタムコンポーネントにバリデータ機能を埋め込むにはどうしたら良いか悩んでいます。 作成したカスタムコンポーネントには、マネージドビーンにバリューバインディングする処理があります。 バインディングを行う前にチェックを走らせて、バインディングしようとするデータのエラーをはじきたいのですが… チェックメソッドを作成したとして、そのメソッド内で拾ったエラーをJSPに反映させることは可能でしょうか? 通常のvalidater同様にメッセージが表示されるようにしたいと考えています。 ご存知であれば、アドバイス下さい。 宜しくお願いします。 | ||||
|
投稿日時: 2006-07-05 20:46
JSFの話ですよね(違ったらすみません)。
>そのメソッド内で拾ったエラーをJSPに反映させることは可能でしょうか? >通常のvalidater同様にメッセージが表示されるようにしたいと考えています。 FacesContext.addMessageを使えばOKです。 | ||||
|
投稿日時: 2006-07-06 10:12
はい、JSFです!!
すみません、もうひとつ質問させてください! チェックメソッドでエラーをはじいて、FacesContext.addMessageで メッセージを表示するとします。 その際、入力値をビーンにバインディングせず、かつその入力値を画面に表示させた状態でリロードしたいのですが、可能でしょうか? | ||||
|
投稿日時: 2006-07-06 10:49
標準的なJSFライフサイクルでは、チェックはProcess Validationsフェーズで実施します。例えば、カスタムコンポーネントのvalidateValueメソッドで実施するのがいいでしょう。super.validateValue()の後でチェックロジックを入れて、失敗したらaddMessageしてvalidプロパティをfalseにします。
UIInput.validateValue()のjavadocを参照して下さい。 | ||||
|
投稿日時: 2006-07-06 11:22
返信ありがとうございます。
すみません、勉強不足でよく理解できていないのですが… 是非、教えてください! プロセス・バリデーション・フェーズは、リクエストがコンポーネントに反映された後に実行されますよね? カスタムコンポーネントのvalidateValueメソッドを作成して、どこかで呼び出さないといけないということですか? decode()メソッドが呼び出されて、EditableValueHolderインターフェースのsetSubmittedValueメソッドを使って、コンポーネントに代入しているのですが、その後にvalidateValueメソッドを呼び出すのですか? | ||||
|
投稿日時: 2006-07-06 11:32
validateValueは標準のvalidateが、validateは標準のprocessValidatorsが呼んでくれます。UIInputのjavadocを参照して下さい。
(UIInputを継承していることが前提ですが、当然継承してますよね) 「よくわかるJavaServer Facesのしくみ」にはシーケンス図が書いてあります。 | ||||
|
投稿日時: 2006-07-06 11:56
ありがとうございます!
UIInputを継承しています。 カスタムコンポーネントクラスにvalidateValueメソッドを作成したところ、 レンダラ、コンバータ実行後、呼ばれました!! そこで、さらに質問したいのですが… たびたび申し訳ないです。 コンバータでは、20060701のような8桁のStringをDate型に変換しています。 もし、20060631のような不正な日付がクライアントから送られてきたときは、 バリデータではじこうと考ています。 ですが、コンバータでDate型に変換している以上、20060701と自然に修正されてしまい、バリデータではじくことができません。 不正な日付をはじくには、どういう考え方でコーディングすると良いでしょうか? | ||||
|
投稿日時: 2006-07-06 14:44
DateTimeConverterはjava.text.DateFormat.parse()を使っているはずですが、6/31が7/1になるのはDateFormatの仕様なんですかねぇ。知りませんでした。 UIInput.validate()から呼ばれるgetConvertedValue()が指定された、あるいはデフォルトのコンバータを使って型変換をするので、その前でチェックしてはどうでしょうか? validate()をオーバーライドして、getSubmittedValue()で取ってきたStringをチェックし、invalidならaddMessage()してvalidプロパティをfalseにしてreturn, validだったらsuper.validate()を呼ぶ。 |