17.2. org.apache.struts.actions.DispatchAction
互いに関連する複数のアクション、たとえばアドレス帳の場合ですと、新規作成、変更、削除などを 1つの Action クラスにまとめたい場合があります。このような場合にはリクエストパラメータや ActionMapping のパラメータの値に応じて処理を振り分けるロジックの実装が必要でした。DispatchAction を使用すると処理を振り分けるロジックを実装する必要はなく、リクエストパラメータの値に応じて適切なメソッドを自動的に呼び出します。ここで呼び出されるメソッドを『ディスパッチメソッド』と言います。
DispatchAction を使用するには org.apache.struts.actions.DispatchAction クラスを継承して実装を行うのですが、org.apache.struts.action.Action クラスを継承する場合とは異なり、ディスパッチメソッドを実装します。execute() メソッドをオーバーライドしてはいけません。ディスパッチメソッドのシグニチャは execute() メソッドと同じです。
public class OperateAddressAction extends DispatchAction {
public ActionForward save(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
// ここに処理を書きます。
return mapping.findForward("success");
}
public ActionForward update(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
// ここに処理を書きます。
return mapping.findForward("success");
}
}
上記の例ではリクエストパラメータの値が "save" のとき save() メソッドが、"update" のとき update() メソッドが実行されます。もちろんどのような名前でリクエストパラメータを送って良いわけではありません。どのメソッドが呼び出されるかの判断基準となるリクエストパラメータ名は Struts 設定ファイルで指定します。
<action-mappings>
<action path="/operateAddress"
type="sample.OperateAddressAction"
parameter="method">
<forward name="success" path="/WEB-INF/jsp/sample/complete.jsp"/>
</action>
</action-mappings>
リクエストパラメータ名は action 要素の parameter 属性で指定します。上の例で save() メソッドを呼び出すには、たとえば以下の URL にアクセスします。
http://localhost:8080/myapp/operateAddress.do?method=save
では、上記の例でリクエストパラメータを送らないとどうなるでしょうか? DispatchAction のデフォルトの実装では、リクエストパラメータが送られない場合は HTTP エラー 400 (Bad Request) をクライアントに送信します。このような場合に適切なページへユーザを導くにはアプリケーションサーバで設定する方法もありますが、unspecified() メソッドをオーバーライドして対応することも可能です。以下に unspecified() メソッドのシグニチャを示します。
protected ActionForward unspecified(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception
アクセスレベルが protected であることを除けばディスパッチメソッドと同様です。
実習課題 2
1章の実習課題 2 の Web アプリケーションを改良しなさい。
- DispatchAction を使用すること。
- リクエストパラメータ「op」の値が指定されなかった場合には任意のエラーページを表示すること