このアーカイブは同期化されません。 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 を開き、
ボタンを押すと、対応するメソッドに制御が移るはずである。