イベントおよびimmediate属性について

デフォルトでは、値の変更イベントは、コンポーネントの値が正常に検証された後の、検証処理フェーズの最後に起動されます。

必須入力フィールドと、値の変更リスナーを使用してロケールを変更するselectOneMenuコンポーネントを含んだページがあるとします。ユーザーが入力フィールドに値を入力せずにメニューから選択すると、selectOneMenuの値が変更された場合は、フォーム発行時に検証エラーが発生します。

selectOneMenuコンポーネントで、リクエスト値の適用フェーズの最後に値の変更イベントを起動するには、コンポーネントのimmediate属性をtrueに設定します。後のライフサイクル内で他の検証が実行されないようにするには、値の変更リスナー・メソッドの最後に、FacesContextrenderResponseメソッドをコールする必要があります。この結果、JSFは、まだ実行されていないすべてのフェーズをスキップし、レンダー・レスポンス・フェーズに直接ジャンプします。

...
public void yourListener(ValueChangeEvent event) {
   FacesContext context = FacesContext.getCurrentInstance();

   if ...
      else
         ...
      context.renderResponse();
  }
...    

同様に、アクション・イベントをアプリケーションの起動の最後ではなく、リクエスト値の適用フェーズの最後に起動する場合は、コマンド・コンポーネントのimmediate属性をtrueに設定できます。たとえば、ページに必須入力フィールドと取消ボタンがあり、ユーザーが必須フィールドに値を入力せずにページから移動できるようにする場合に設定します。

しかし、値の変更イベントとは異なり、アクション・リスナーでFacesContext.renderResponse()をコールする必要はありません。これは、レンダー・レスポンス・フェーズは、すべてのアクション・メソッドの起動後に自動的に実行されるためです。


イベントおよびJSFライフサイクルについて
イベント処理について
JSFでのイベントおよびイベント・リスナーの使用