2007 年 4 月 24 日 19 時 40 分

DitpatchAction: 複数ボタン対応 Action


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


管理系フォームに対応した Action を作る場合、
どのボタンが押されたかどうか判断して、
処理を分岐するコードが必要となる。

Action クラスを継承して作ってもいいのだが、
Struts には、DitpatchAction というクラスがあり、
管理系フォームの実装の手間を少し軽減してくれる。

DitpatchAction を基底クラスとして使うと、
送信されたパラメータの値に対応して、
適切なメソッドの呼び出しを行ってくれるのである。

DitpatchAction クラスは Struts 本体には含まれず、
拡張ライブラリ struts-extras-1.3.5.jar にある。
まずは、これを /WEB-INF/lib/ にコピーしておこう。

では、Action の枠組みを作ってみよう。

========== ManageRulesAction.java ==========
package jp.loafer.test.actions;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;

public class ManageRulesAction extends DispatchAction {

    public ManageRulesAction() {
        super();
    }

    public ActionForward add(ActionMapping mapping,
            ActionForm form,
            HttpServletRequest request,
            HttpServletResponse response)
            throws Exception {
       
        System.out.println("add");
        return null;
    }

    public ActionForward moveUp(
            ActionMapping mapping, ActionForm form,
            HttpServletRequest request,
            HttpServletResponse response)
            throws Exception {

        System.out.println("moveUp");
        return null;
    }

    public ActionForward moveDown(
            ActionMapping mapping, ActionForm form,
            HttpServletRequest request,
            HttpServletResponse response)
            throws Exception {

        System.out.println("moveDown");
        return null;
    }

    public ActionForward enable(
            ActionMapping mapping, ActionForm form,
            HttpServletRequest request,
            HttpServletResponse response)
            throws Exception {

        System.out.println("enable");
        return null;
    }

    public ActionForward disable(
            ActionMapping mapping, ActionForm form,
            HttpServletRequest request,
            HttpServletResponse response)
            throws Exception {

        System.out.println("disable");
        return null;
    }

    public ActionForward delete(
            ActionMapping mapping, ActionForm form,
            HttpServletRequest request,
            HttpServletResponse response)
            throws Exception {

        System.out.println("delete");
        return null;
    }

}
========== end of ManageRulesAction.java ==========


DispatchAction を継承する場合、
execute メソッドはオーバーライドしない。

DispatchAction#execute はフォームのパラメータを調べ、
その値と同じ名前のインスタンスメソッドを呼び出す。

メソッドの呼び出しはリフレクションで行われるため、
実装者は execute と同じシグネチャを持つメソッドを、
必要な数だけ用意しておけば良い。

これだけで、ボタンに応じてメソッドが呼ばれるので。
各メソッドにそれぞれの処理だけ実装すれば良いわけだ。

さて、DispatchAction が参照するパラメータ名は、
Struts 設定ファイルの <action> で指定する必要がある。


        <!-- ルール管理 -->

        <action path="/filter/manage-rules"
                name="manageFilterRulesForm" scope="request"
                parameter="command"
                type="jp.loafer.test.actions.ManageRulesAction">

        </action>

parameter 属性がポイントだ。この属性は汎用的なもので、
この値は Action#execute に引数として渡される
ActionMapping クラスを使うと参照することができるので、
Action で自由に使うことができる。

Action を拡張している DispatchAction では、
この値をメソッド振り分け用に使っているのである。

list.jsp に書いた HTML の送信ボタンでは、
「command」という名前を使っているため、
parameter 属性に「command」と指定しておく。

http://localhost:8080/struts-test/filter/list.do を開き、
ボタンを押すと、対応するメソッドに制御が移るはずである。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.