Web アプリケーションでは、しばしば、ユーザーからの入力を取得するためのフォームを表示する Web ページが必要になります。コマンド送信は、ユーザーによって UICommand
型コンポーネントが起動されたときにアプリケーション固有のコマンドまたはアクションの実行を開始させる処理です。たとえば、ユーザーが Web ページ上の「Submit」ボタンをクリックしたときに Web フォームを送信するなどの処理があります。一般には、この送信に基づいてサーバー側のアクションが起こされます。その他、ユーザーのログインや次のページへの移動などもあります。
Web ページの開発者は、こうしたコマンド送信の処理方法を決定する必要があります。JavaServer[tm] Faces API は、Action
と ActionListener
の 2 つの選択肢が用意されています。このエントリでは、各状況について、対処法としてどちらの選択肢が優れているのかを説明します。
デザイン上のこの選択を行うにあたっての留意事項としては、以下があります。
ActionListener
は関与できません。 ActionListener
は ActionEvent
にアクセスできます。次の表は、コマンド送信処理での推奨する対処方法をまとめています。
対処法 | 推奨 |
---|---|
Action の使用 |
JavaServer Faces コンポーネントの通常のイベント処理 |
ActionListener の使用 |
イベントの原因となったコンポーネントを特定する必要がある場合にのみ使用する、JavaServer Faces コンポーネントのイベント処理 |
一般に、アクションリスナーは、別の (UICommand) コンポーネントが起動されるたびにコンポーネントの状態を変更する必要がある場合に使用します。たとえば、「簡略」版のフォーム (一部フィールドのみ) と「完全」版のフォーム (可能なすべてのフィールド) を切り替えるボタンがフォームにあると仮定します。ページ作成者はそのページにアクションリスナーを直接、登録することができますが、ほとんどの場合は、コンポーネントそのもので、この切り替えを行えるようにします。アクションリスナーがナビゲーションに直接関与することはできません。
これに対し、アクションは、フォーム上の送信ボタンをはじめとして、場合によっては、ナビゲーションに影響する可能性があるアプリケーションアクションを呼び出す際の第一のデザイン要素と見なされます。アクションメソッドは null
を返して現在のページを再表示させたり、ナビゲーション規則にマッピング可能な結果文字列を返して、次に表示するページを特定したりできます。
カスタム JavaServer Faces コンポーネントのデザインでは、まれに両方の動作が必要になることがあります。たとえばカスタムツリーコンポーネントでオブジェクトの階層をナビゲートすることを考えてみましょう。ボタンがクリックされると、ほかのコンポーネントにその通知が送られ、結果をナビゲーション規則に関連付けるようにします。ここでは、アクションとアクションリスナーを一緒に使用できます。しかしながら、多くの場合、コンポーネント自体がアクションリスナーを登録するため、アクションリスナーの登録はページ作成者には透過的である可能性があります。うまくデザインされたカスタムコンポーネントは、ページ作成者にコンポーネントの実装詳細を開示してしまうことを避けるため、明示的にアクションリスナーを登録 (<f:action_listener>
タグを使用) することを、ページ作成者に要求することはしません。考え得る結果の一つに、このようなデザインでは、大部分のコマンド送信処理に、主として Action
が使用されるということが挙げられます。ActionListener
の使用は、イベントを生成した UI 要素から情報を抽出する必要のある、ごく少数の場合に限られます。
「Guest Login」というラベルのボタンのアクションマッピングは success
と指定されています。このため、このページからの結果が success
の場合、それに対応するナビゲーション規則が呼び出されます。コード例 2は、faces-config.xml
ファイルから抜粋された、これに対応するナビゲーション規則の定義です。
それぞれの結果に応じて複数のナビゲーションケースを定義できることに注意してください。
結果を指定する代わりにアクションメソッドを指定することによって、アクションマッピングを動的に定義することもできます。コード例 3は、その方法を示しています。
「Login」というボタンに対するアクションマッピングは、バッキング Bean の CommandSubmissionBean
における login
メソッドの呼び出しです。login
メソッドから結果 success
が返されると、コード例 2 のナビゲーション規則に従って response.jsp
が呼び出されます。
「Show More Details」というボタンでは、アクションリスナーとして、バッキング Bean の CommandSubmissionBean
の detailsActionListener
メソッドが指定されています。このメソッドは、ボタンがクリックされるたびに呼び出されます。このメソッドはページのほかのすべてのコンポーネントにアクセスし、必要に応じてその状態を変更できます。