コマンド送信処理

Inderjeet Singh、Jayashri Visvanathan

課題

Web アプリケーションでは、しばしば、ユーザーからの入力を取得するためのフォームを表示する Web ページが必要になります。コマンド送信は、ユーザーによって UICommand 型コンポーネントが起動されたときにアプリケーション固有のコマンドまたはアクションの実行を開始させる処理です。たとえば、ユーザーが Web ページ上の「Submit」ボタンをクリックしたときに Web フォームを送信するなどの処理があります。一般には、この送信に基づいてサーバー側のアクションが起こされます。その他、ユーザーのログインや次のページへの移動などもあります。

Web ページの開発者は、こうしたコマンド送信の処理方法を決定する必要があります。JavaServer[tm] Faces API は、ActionActionListener の 2 つの選択肢が用意されています。このエントリでは、各状況について、対処法としてどちらの選択肢が優れているのかを説明します。

デザイン上のこの選択を行うにあたっての留意事項としては、以下があります。

対処法

次の表は、コマンド送信処理での推奨する対処方法をまとめています。

対処法 推奨
Action の使用 JavaServer Faces コンポーネントの通常のイベント処理
ActionListener の使用 イベントの原因となったコンポーネントを特定する必要がある場合にのみ使用する、JavaServer Faces コンポーネントのイベント処理

一般に、アクションリスナーは、別の (UICommand) コンポーネントが起動されるたびにコンポーネントの状態を変更する必要がある場合に使用します。たとえば、「簡略」版のフォーム (一部フィールドのみ) と「完全」版のフォーム (可能なすべてのフィールド) を切り替えるボタンがフォームにあると仮定します。ページ作成者はそのページにアクションリスナーを直接、登録することができますが、ほとんどの場合は、コンポーネントそのもので、この切り替えを行えるようにします。アクションリスナーがナビゲーションに直接関与することはできません。

これに対し、アクションは、フォーム上の送信ボタンをはじめとして、場合によっては、ナビゲーションに影響する可能性があるアプリケーションアクションを呼び出す際の第一のデザイン要素と見なされます。アクションメソッドは null を返して現在のページを再表示させたり、ナビゲーション規則にマッピング可能な結果文字列を返して、次に表示するページを特定したりできます。

カスタム JavaServer Faces コンポーネントのデザインでは、まれに両方の動作が必要になることがあります。たとえばカスタムツリーコンポーネントでオブジェクトの階層をナビゲートすることを考えてみましょう。ボタンがクリックされると、ほかのコンポーネントにその通知が送られ、結果をナビゲーション規則に関連付けるようにします。ここでは、アクションとアクションリスナーを一緒に使用できます。しかしながら、多くの場合、コンポーネント自体がアクションリスナーを登録するため、アクションリスナーの登録はページ作成者には透過的である可能性があります。うまくデザインされたカスタムコンポーネントは、ページ作成者にコンポーネントの実装詳細を開示してしまうことを避けるため、明示的にアクションリスナーを登録 (<f:action_listener> タグを使用) することを、ページ作成者に要求することはしません。考え得る結果の一つに、このようなデザインでは、大部分のコマンド送信処理に、主として Action が使用されるということが挙げられます。ActionListener の使用は、イベントを生成した UI 要素から情報を抽出する必要のある、ごく少数の場合に限られます。

アクションの使用

アクションマッピングには、静的と動的の 2 種類があります。静的マッピングは、次のページが明らかで、バッキング Bean でアクションメソッドを呼び出す必要がない場合に使用されます。 コード例 1 は、静的アクションのマッピングの指定方法を示しています。

  <b>User Name:</b> <h:inputText id="userName" value="#{CommandSubmissionsBean.userName}"/><br>
  <b>Password:</b> <h:inputText id="password" value="#{CommandSubmissionsBean.password}"/><br>
  <h:commandButton id="guest" action="success" value="Guest Login" />


コード例 1: 静的アクションのマッピング

「Guest Login」というラベルのボタンのアクションマッピングは success と指定されています。このため、このページからの結果が success の場合、それに対応するナビゲーション規則が呼び出されます。コード例 2は、faces-config.xml ファイルから抜粋された、これに対応するナビゲーション規則の定義です。

  <navigation-rule>   
    <from-view-id>/index.jsp</from-view-id>
    <navigation-case>
      <description>           
        Indicates to the NavigationHandler that the response.jsp view
        must be displayed if the Action referenced by a UICommand
        component on the index.jsp view returns the outcome
        "success".       
      </description>
      <from-outcome>success</from-outcome>
      <to-view-id>/response.jsp</to-view-id>   
    </navigation-case>
  </navigation-rule> 


コード例 2: index.jsp での結果が success の場合のナビゲーション規則

それぞれの結果に応じて複数のナビゲーションケースを定義できることに注意してください。

結果を指定する代わりにアクションメソッドを指定することによって、アクションマッピングを動的に定義することもできます。コード例 3は、その方法を示しています。

  <b>User Name:</b> <h:inputText id="userName" value="#{CommandSubmissionsBean.userName}"/><br>
  <b>Password:</b> <h:inputText id="password" value="#{CommandSubmissionsBean.password}"/><br>
  <h:commandButton id="submit" action="#{CommandSubmissionsBean.login}" value="Login" />


コード例 3: 静的アクションのマッピング

「Login」というボタンに対するアクションマッピングは、バッキング Bean の CommandSubmissionBean における login メソッドの呼び出しです。login メソッドから結果 success が返されると、コード例 2 のナビゲーション規則に従って response.jsp が呼び出されます。

アクションリスナーの使用

ページ作成者は、JavaServer Faces ページ自体の任意の標準コンポーネントにアクションリスナーを指定できます。 コード例 4 は、JavaServer Faces の commandButton にアクションリスナーを指定している例です。

  <h:commandButton actionListener="#{CommandSubmissionsBean.detailsActionListener}" id="details" value="Show More Details"/>

コード例 4: アクションリスナーの指定

「Show More Details」というボタンでは、アクションリスナーとして、バッキング Bean の CommandSubmissionBeandetailsActionListener メソッドが指定されています。このメソッドは、ボタンがクリックされるたびに呼び出されます。このメソッドはページのほかのすべてのコンポーネントにアクセスし、必要に応じてその状態を変更できます。

参考資料

この項目に関する詳細は、次の資料を参照してください。
© Sun Microsystems 2005. All of the material in The Java BluePrints Solutions Catalog is copyright-protected and may not be published in other works without express written permission from Sun Microsystems.