変換および検証プロセスについて

Webアプリケーションでは、モデル・レイヤーに様々な型(例: intlongdate)のデータを格納できます。しかし、クライアントのブラウザで表示する場合は、ユーザー・インタフェースによって、ユーザーが読取りまたは変更可能な方法でデータが提示される必要があります。たとえば、フォームの日付フィールドでは、java.util.Dateオブジェクトがテキスト文字列として書式パターンyyyy/mm/ddで表される場合があります。ユーザーが日付フィールドを編集し、フォームを発行したとき、文字列はアプリケーションで必要な型に戻される必要があります。その後、データは任意の規則および条件に対して検証されます。

最初に、JavaServer Faces(JSF)のライフサイクル・フェーズとの関連でプロセスについて考えてみます。日付フィールドに値が入力されたフォームが発行されると、ブラウザによってリクエスト値がサーバーに送信されます。リクエスト値は最初に、リクエスト値の適用フェーズで、発行された文字列値どおりにコンポーネント・オブジェクトに格納されます。検証処理フェーズでは、発行された文字列値が、アプリケーションで必要な適切なオブジェクト型のローカル値に変換されます。検証の正確性チェックが必要な場合、ローカル値は定義済の規則と照合して検証されます。たとえば、バリデータによって、ユーザーが指定した日付が現在の日付より先であることがチェックされる場合があります。

検証または変換に失敗した場合、JSFではレンダー・レスポンス・フェーズが起動し、現在のページが再表示されます。検証または変換が正常に終了した場合は、モデルの更新フェーズが起動し、変換済および検証済のローカル値が使用されてモデルが更新されます。検証または変換に失敗した場合を考えてみます。アプリケーション開発者は、JSFページに検証または変換エラーを表示するh:messageタグを追加する必要があります。

JSFライフサイクル・フェーズの概要は、「JSFページのライフサイクルについて」を参照してください。

次に、ConverterおよびValidatorインタフェースのメソッドとの関連でプロセスについて考えてみます。コンポーネント(例: 日付入力フィールド)にコンバータが設定されている場合は、validate()メソッドによって、そのコンバータのgetAsObject()メソッドがコールされ、文字列値が必要なオブジェクト型に変換されます。設定されているコンバータがなく、コンポーネントがモデル内のBeanプロパティにバインドされている場合は、JSFによって、Beanプロパティと同じデータ型のコンバータが自動的に使用されます。変換に失敗した場合、発行された値には無効のマークが付けられ、JSFによって、FacesContextで管理されているキューにエラー・メッセージが追加されます。変換が正常に終了し、コンポーネントにバリデータが設定されていない場合、変換された値はローカル値として格納され、後でモデルの更新に使用されます。

コンポーネントに1つ以上のバリデータが設定されている場合、コンポーネントのrequired属性がtrueに設定されていると、validate()メソッドによって、発行された値が最初にチェックされます。値がNULLまたは長さゼロの文字列の場合、コンポーネントは無効化され、エラー・メッセージがキューに入れられます。コンポーネントに登録されているバリデータが他にある場合、それらのバリデータはコールされず、現在のページが再表示されます。発行された値がNULL以外の値または1文字以上の文字列値である場合は、検証プロセスが続行され、バリデータが1つずつコールされます。

すべての検証が正常に終了すると、モデル値の更新フェーズが起動し、ローカル値が使用されてモデルが更新されます。いずれかの検証に失敗すると、現在のページが再表示されます。ローカル値を使用することによって、JSFでは、すべての検証が正常に終了するまでモデルが更新されないことが保証されます。

JSFアプリケーションでは、クライアントまたはサーバーのいずれかのリクエスト間で、バリデータとコンポーネントの状態を保存できます。状態保存の詳細は、「JSFでのクライアント側およびサーバー側の状態保存について」を参照してください。


変換および検証エラーについて
必須値およびimmediate属性について
JSFでのコンバータおよびバリデータの使用